From a1dbb9fedc358c71bb28c8cf9fb08e8c9d11bc5f Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Wed, 11 Feb 2009 14:12:36 +0100 Subject: [PATCH] Install mingwrt-3.15.2-mingw32-dev.tar.gz Signed-off-by: Johannes Schindelin --- mingw/COPYING | 340 + mingw/COPYING.LIB | 504 + mingw/bin/cpp.exe | Bin 91648 -> 91648 bytes mingw/bin/gcc.exe | Bin 89600 -> 90112 bytes mingw/bin/gcov.exe | Bin 26112 -> 25600 bytes mingw/bin/mingw32-gcc-3.4.5 | Bin 0 -> 90112 bytes mingw/bin/mingw32-gcc.exe | Bin 89600 -> 90112 bytes mingw/doc/runtime/CONTRIBUTORS | 28 + mingw/doc/runtime/DISCLAIMER | 12 + mingw/doc/runtime/README | 10 + mingw/include/_mingw.h | 98 +- mingw/include/assert.h | 2 +- mingw/include/complex.h | 200 + mingw/include/conio.h | 53 + mingw/include/ctype.h | 168 +- mingw/include/dir.h | 26 + mingw/include/direct.h | 73 + mingw/include/dirent.h | 24 +- mingw/include/dos.h | 89 + mingw/include/errno.h | 2 +- mingw/include/excpt.h | 102 + mingw/include/fcntl.h | 6 + mingw/include/fenv.h | 107 + mingw/include/float.h | 152 + mingw/include/getopt.h | 195 +- mingw/include/gmon.h | 181 + mingw/include/inttypes.h | 278 + mingw/include/io.h | 190 +- mingw/include/libgen.h | 31 + mingw/include/locale.h | 88 + mingw/include/malloc.h | 103 + mingw/include/math.h | 873 + mingw/include/mbctype.h | 97 + mingw/include/mbstring.h | 132 + mingw/include/mem.h | 6 + mingw/include/memory.h | 7 + mingw/include/process.h | 91 +- mingw/include/profil.h | 51 + mingw/include/profile.h | 83 + mingw/include/search.h | 106 + mingw/include/setjmp.h | 4 +- mingw/include/share.h | 33 + mingw/include/signal.h | 4 +- mingw/include/stdint.h | 40 +- mingw/include/stdio.h | 414 +- mingw/include/stdlib.h | 298 +- mingw/include/string.h | 388 +- mingw/include/sys/fcntl.h | 7 + mingw/include/sys/file.h | 7 + mingw/include/sys/locking.h | 31 + mingw/include/sys/stat.h | 41 +- mingw/include/sys/time.h | 2 +- mingw/include/sys/timeb.h | 74 + mingw/include/sys/types.h | 4 + mingw/include/sys/unistd.h | 6 + mingw/include/sys/utime.h | 27 +- mingw/include/tchar.h | 2 + mingw/include/time.h | 54 +- mingw/include/unistd.h | 15 +- mingw/include/values.h | 4 + mingw/include/varargs.h | 7 + mingw/include/wchar.h | 518 + mingw/include/wctype.h | 168 + mingw/info/cpp.info | 5166 +++++ mingw/info/cppinternals.info | 1035 + mingw/info/gcc.info | 27178 +++++++++++++++++++++++++ mingw/info/gccinstall.info | 3822 ++++ mingw/info/gccint.info | 27029 ++++++++++++++++++++++++ mingw/lib/CRT_fp10.o | Bin 0 -> 368 bytes mingw/lib/CRT_fp8.o | Bin 0 -> 412 bytes mingw/lib/CRT_noglob.o | Bin 0 -> 317 bytes mingw/lib/binmode.o | Bin 0 -> 310 bytes mingw/lib/crt1.o | Bin 0 -> 2192 bytes mingw/lib/crt2.o | Bin 2260 -> 2288 bytes mingw/lib/crtmt.o | Bin 0 -> 310 bytes mingw/lib/crtst.o | Bin 0 -> 306 bytes mingw/lib/dllcrt1.o | Bin 0 -> 1239 bytes mingw/lib/dllcrt2.o | Bin 1339 -> 1239 bytes mingw/lib/gcrt1.o | Bin 0 -> 692 bytes mingw/lib/gcrt2.o | Bin 0 -> 692 bytes mingw/lib/libcoldname.a | Bin 0 -> 79922 bytes mingw/lib/libcrtdll.a | Bin 0 -> 362678 bytes mingw/lib/libgmon.a | Bin 0 -> 5348 bytes mingw/lib/libm.a | Bin 0 -> 458 bytes mingw/lib/libmingw32.a | Bin 7654 -> 7468 bytes mingw/lib/libmingwex.a | Bin 273038 -> 275646 bytes mingw/lib/libmingwthrd.a | Bin 0 -> 3446 bytes mingw/lib/libmoldname.a | Bin 82558 -> 81880 bytes mingw/lib/libmoldname70.a | Bin 0 -> 82116 bytes mingw/lib/libmoldname70d.a | Bin 0 -> 82216 bytes mingw/lib/libmoldname71.a | Bin 0 -> 82116 bytes mingw/lib/libmoldname71d.a | Bin 0 -> 82216 bytes mingw/lib/libmoldname80.a | Bin 0 -> 82116 bytes mingw/lib/libmoldname80d.a | Bin 0 -> 82216 bytes mingw/lib/libmoldname90.a | Bin 0 -> 82116 bytes mingw/lib/libmoldname90d.a | Bin 0 -> 82216 bytes mingw/lib/libmoldnamed.a | Bin 0 -> 81976 bytes mingw/lib/libmsvcr70.a | Bin 0 -> 549888 bytes mingw/lib/libmsvcr70d.a | Bin 0 -> 551016 bytes mingw/lib/libmsvcr71.a | Bin 0 -> 551516 bytes mingw/lib/libmsvcr71d.a | Bin 0 -> 552648 bytes mingw/lib/libmsvcr80.a | Bin 0 -> 560004 bytes mingw/lib/libmsvcr80d.a | Bin 0 -> 561160 bytes mingw/lib/libmsvcr90.a | Bin 0 -> 560004 bytes mingw/lib/libmsvcr90d.a | Bin 0 -> 561794 bytes mingw/lib/libmsvcrt.a | Bin 503692 -> 544894 bytes mingw/lib/libmsvcrtd.a | Bin 0 -> 545360 bytes mingw/lib/txtmode.o | Bin 0 -> 310 bytes mingw/libexec/gcc/mingw32/3.4.5/cc1.exe | Bin 4424704 -> 3542528 bytes mingw/libexec/gcc/mingw32/3.4.5/collect2.exe | Bin 87552 -> 87552 bytes mingw/man/man1/cpp.1 | 918 + mingw/man/man1/gcc.1 | 10714 ++++++++++ mingw/man/man1/gcov.1 | 607 + mingw/man/man7/fsf-funding.7 | 185 + mingw/man/man7/gfdl.7 | 561 + mingw/man/man7/gpl.7 | 535 + mingw/share/man/man3/basename.3 | 474 + mingw/share/man/man3/dirname.3 | 474 + 118 files changed, 84472 insertions(+), 882 deletions(-) create mode 100644 mingw/COPYING create mode 100644 mingw/COPYING.LIB create mode 100644 mingw/bin/mingw32-gcc-3.4.5 create mode 100644 mingw/doc/runtime/CONTRIBUTORS create mode 100644 mingw/doc/runtime/DISCLAIMER create mode 100644 mingw/doc/runtime/README create mode 100644 mingw/include/complex.h create mode 100644 mingw/include/conio.h create mode 100644 mingw/include/dir.h create mode 100644 mingw/include/direct.h create mode 100644 mingw/include/dos.h create mode 100644 mingw/include/excpt.h create mode 100644 mingw/include/fenv.h create mode 100644 mingw/include/float.h rewrite mingw/include/getopt.h (90%) create mode 100644 mingw/include/gmon.h create mode 100644 mingw/include/inttypes.h create mode 100644 mingw/include/libgen.h create mode 100644 mingw/include/locale.h create mode 100644 mingw/include/malloc.h create mode 100644 mingw/include/math.h create mode 100644 mingw/include/mbctype.h create mode 100644 mingw/include/mbstring.h create mode 100644 mingw/include/mem.h create mode 100644 mingw/include/memory.h create mode 100644 mingw/include/profil.h create mode 100644 mingw/include/profile.h create mode 100644 mingw/include/search.h create mode 100644 mingw/include/share.h rewrite mingw/include/string.h (71%) create mode 100644 mingw/include/sys/fcntl.h create mode 100644 mingw/include/sys/file.h create mode 100644 mingw/include/sys/locking.h create mode 100644 mingw/include/sys/timeb.h create mode 100644 mingw/include/sys/unistd.h create mode 100644 mingw/include/values.h create mode 100644 mingw/include/varargs.h create mode 100644 mingw/include/wchar.h create mode 100644 mingw/include/wctype.h create mode 100644 mingw/info/cpp.info create mode 100644 mingw/info/cppinternals.info create mode 100644 mingw/info/gcc.info create mode 100644 mingw/info/gccinstall.info create mode 100644 mingw/info/gccint.info create mode 100644 mingw/lib/CRT_fp10.o create mode 100644 mingw/lib/CRT_fp8.o create mode 100644 mingw/lib/CRT_noglob.o create mode 100644 mingw/lib/binmode.o create mode 100644 mingw/lib/crt1.o rewrite mingw/lib/crt2.o (94%) create mode 100644 mingw/lib/crtmt.o create mode 100644 mingw/lib/crtst.o create mode 100644 mingw/lib/dllcrt1.o rewrite mingw/lib/dllcrt2.o (100%) create mode 100644 mingw/lib/gcrt1.o create mode 100644 mingw/lib/gcrt2.o create mode 100644 mingw/lib/libcoldname.a create mode 100644 mingw/lib/libcrtdll.a create mode 100644 mingw/lib/libgmon.a create mode 100644 mingw/lib/libm.a rewrite mingw/lib/libmingw32.a (68%) rewrite mingw/lib/libmingwex.a (75%) create mode 100644 mingw/lib/libmingwthrd.a rewrite mingw/lib/libmoldname.a (62%) create mode 100644 mingw/lib/libmoldname70.a create mode 100644 mingw/lib/libmoldname70d.a create mode 100644 mingw/lib/libmoldname71.a create mode 100644 mingw/lib/libmoldname71d.a create mode 100644 mingw/lib/libmoldname80.a create mode 100644 mingw/lib/libmoldname80d.a create mode 100644 mingw/lib/libmoldname90.a create mode 100644 mingw/lib/libmoldname90d.a create mode 100644 mingw/lib/libmoldnamed.a create mode 100644 mingw/lib/libmsvcr70.a create mode 100644 mingw/lib/libmsvcr70d.a create mode 100644 mingw/lib/libmsvcr71.a create mode 100644 mingw/lib/libmsvcr71d.a create mode 100644 mingw/lib/libmsvcr80.a create mode 100644 mingw/lib/libmsvcr80d.a create mode 100644 mingw/lib/libmsvcr90.a create mode 100644 mingw/lib/libmsvcr90d.a rewrite mingw/lib/libmsvcrt.a (61%) create mode 100644 mingw/lib/libmsvcrtd.a create mode 100644 mingw/lib/txtmode.o rewrite mingw/libexec/gcc/mingw32/3.4.5/collect2.exe (63%) create mode 100644 mingw/man/man1/cpp.1 create mode 100644 mingw/man/man1/gcc.1 create mode 100644 mingw/man/man1/gcov.1 create mode 100644 mingw/man/man7/fsf-funding.7 create mode 100644 mingw/man/man7/gfdl.7 create mode 100644 mingw/man/man7/gpl.7 create mode 100644 mingw/share/man/man3/basename.3 create mode 100644 mingw/share/man/man3/dirname.3 diff --git a/mingw/COPYING b/mingw/COPYING new file mode 100644 index 00000000..d60c31a9 --- /dev/null +++ b/mingw/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) + + 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) 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/mingw/COPYING.LIB b/mingw/COPYING.LIB new file mode 100644 index 00000000..b1e3f5a2 --- /dev/null +++ b/mingw/COPYING.LIB @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 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. + +[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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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/mingw/bin/cpp.exe b/mingw/bin/cpp.exe index 30a6fb23059fd4ae47b9d0491ed232ed73fb4c3e..f710d47e0949a89db3c08f9625c35e9812c4baf6 100644 GIT binary patch delta 17218 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 delta 17272 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

Uhy0%6KQK-hn@4rp>O(i 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 delta 4420 zcwV(veNa$ZaWw&tKlaO@Gv=ob5=i!?z?md1vJ)Xquq#*LIw&;#JiS!hLgo- z84#TVnah%$)Uhq>sEP)y7a#^0{2C^fVVbMRgQC3{kzb2)vnMJMa?Q&6_lH6ut_jwd zGJ`ZKQZ9r5ZGf#*in!M+$u}ZRYA?7>W!ck_@AxdQelPwNaiGo6NwI z)ZlrO?y2V;`b(VR1UyELi8JskkR5ND7ov5L5)D&|zF|BUo7#?ho`@k!k3|9Ei^LuamC z@*y1*OS_o6>&f#=A1pnw9&Td5J*d0_>Di+^wV16}ir5k*HvkqG&uf0TRTkdW9(9@5 zYySq7ERIjZTB456ft4EKdzgz4kdNY3s|%^4tp5PRd;0R6;d{fiJphJJW&IO0Us$4z zC=&{pghKz0gl$W(!T-CgB_f(%VD()5wG7zwa9V7TO;B>d4D!Jm4Xz{Ku34SE8LaGk zuB#p$mi3Rugfn#aDjVpuB^ms>TqW6@qssVK`aIW5;)tsmT-8eMt90VcNn*Z8C$HsX zVkh}Sj(x#S8lYDCYDqx7Jobs6Nb>8*&(tcsfDEcvGLva!NWCgyI1L`<7b6btD0-`& zBzM$VOkFBTS=)ruiDT^%ypqIf_ToI!t|?*ukwRY66fr|7WKvVGv@Zo#+NBi1TM-L& zavvp=oZJJ+R6-(9U_EPwv<->jco~iVD3M&$rei(%M7u(%fDm_$vVOK)s^}_( z&8w#_v0-fkD}~)j^efgy;pke&VcbfxieJEkD$c2LUL(C6=sR3tXMwTJFidl1#~ozEo58SI~nKz zZ;`rV=)Qp@neWq1@^s6S6x65Yr`A$p&@IOsNw-dcMdSrtHf|;XT?#xp@wLagNvK+6D4+)c^+3g45EE9KcqSLjN;KV9i4Sy-_a*OTIkRan7? zs~~*pukc2>>y^rj-yII0N~Hp3jPogAf1E|A zEBZp-LB4Fs`GSM=dsh;+ zS#OO8dH+wpphDyV-Zw4r)zY(ouAc1K4|BWaRN<)*orckY+!Z2Ne`-7kMhJMk&X?B! zGtY(WYMQX8z(qM53@z*XO0=bGu5Vh}TDuhKlpknC5ow84qd$x1+r51T;gp z^canBjd#u5ew&?zIejzXV@Wg)rH@8aMmziX?dQDd-utfYJ`3yzJGt9kEeidaw%tt` z@{qg;w)X;bC^SUlAOlx`)NRV%-VghK;VwNK&mH7%fP`;5Ik1P&A2`rm{F+Ab)?HwQ z=a5?j*2sA@yowHx;S-P79hx2n*At8AI z)F^u^04F+}1FokqUqU@?ajQl2*I+t-NTVqL~-%ROBmkbyJZq($!1FaGlObo&ERfJnV5*g98*0lB@Y@XK1yv zT@~7^uB%l z6z~@X+$-QW1^l{z-x6>RxMRNJj=E7ZU|8I$EQEzfGAnxs0yCzpduTqU~FCI#dBz2iRQ}#)^oX zGEYabFv7nF{2lOl+5L8k3BW$0-BBpd*A!?96{_~Oj(tB@*es@|Hlum9|HO`JhJ3Ya z1%3ZyyT68{R7dwn<@JLIsR!UQ>c?6TGLy_b@#55D2sI20WTrTdA|wT*0#tyaqxW1J zKyIGL%^>#zo&}r)oCOR6#sCw58vqV41NaUgA@KDENChYXYCsV{2dF0Ws}3PY1N;~O ztpGc~33wK89Pkq0EMOQg2Dk>e377`V0Yp$=93T~-0u&71OBVfig*pCjmHl^xIsUiG zFe-0uF1L5Kmm_onRdu)7YptD4CYudxXVAvBj)?IF+GMg*@lj*D34A|i>P+_S9j(TW zX0xfes=LW#vA1=0Y-}Ts8KU8zr~);%*z895L?^opMG#Pn8XIjUd!x}}X|(rPOmy*1 z)M&KXOji0K--8;POt3uFPoc)PPWbfSgBv?L!b%#dMx2sUR60}iH+{nXpawEs9;H`8uv zZ?g1IxrfT_o%`vOPg5BZr~1Q;)$~JvhXLi@t`@5IGPbsT9Y!;i31j;tFHzYV4!*$bkJRKB?|l#d2Nf}1 A>i_@% diff --git a/mingw/bin/mingw32-gcc-3.4.5 b/mingw/bin/mingw32-gcc-3.4.5 new file mode 100644 index 0000000000000000000000000000000000000000..6e53b1842b753fbe30b30360bdfca164fe3b4ab5 GIT binary patch literal 90112 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

EV_%W$ou3 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 delta 17272 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 diff --git a/mingw/doc/runtime/CONTRIBUTORS b/mingw/doc/runtime/CONTRIBUTORS new file mode 100644 index 00000000..f696f500 --- /dev/null +++ b/mingw/doc/runtime/CONTRIBUTORS @@ -0,0 +1,28 @@ +/* + * CONTRIBUTORS + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * HISTORICAL: + * Colin Peters - Original author of the + * mingw-runtime package. + * Mumit Khan - Original maintainer of the + * mingw-runtime package. + * Gunther Ebert - Adaptations of his DLL + * support. + * Stan Cox - Provided gccmain.c. + * J.J. van der Heijden - Provided + * dos.h. + * Mikey - Adaptated excpt.h from his code. + * Pedro A. Aranda - Provided lots of types for types.h. + * + * CURRENT: + * Danny Smith + * Earnie Boyd + * Luke Dunstan + * + * Many others in the MinGW user community. They are listed in the ChangeLog. + * Please review that file for the names of those contributors. + * + */ diff --git a/mingw/doc/runtime/DISCLAIMER b/mingw/doc/runtime/DISCLAIMER new file mode 100644 index 00000000..be3469cb --- /dev/null +++ b/mingw/doc/runtime/DISCLAIMER @@ -0,0 +1,12 @@ +/* + * DISCLAIMER + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * + * The mingw-runtime package and its code is distributed in the hope that it + * will be useful but WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESSED OR + * IMPLIED ARE HEREBY DISCLAIMED. This includes but is not limited to + * warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You are free to use this package and its code without limitation. + */ diff --git a/mingw/doc/runtime/README b/mingw/doc/runtime/README new file mode 100644 index 00000000..bcde1442 --- /dev/null +++ b/mingw/doc/runtime/README @@ -0,0 +1,10 @@ + Free Microsoft C Runtime and import library definitions + + Maintained by MinGW Developers + Send bug reports and questions to MinGW-users@lists.sourceforge.net + URL: http://www.mingw.org + +A historical readme.txt exists and is distributed for your edification. The +references within may or may not be correct. Please do not rely on them. See +http://www.mingw.org for a list of valid references. + diff --git a/mingw/include/_mingw.h b/mingw/include/_mingw.h index 81e81b8e..22da4c95 100644 --- a/mingw/include/_mingw.h +++ b/mingw/include/_mingw.h @@ -1,3 +1,4 @@ +#ifndef __MINGW_H /* * _mingw.h * @@ -19,32 +20,59 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ - -#ifndef __MINGW_H #define __MINGW_H +#define __MINGW32_VERSION 3.15.2 +#define __MINGW32_MAJOR_VERSION 3 +#define __MINGW32_MINOR_VERSION 15 +#define __MINGW32_PATCHLEVEL 2 + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif /* These are defined by the user (or the compiler) to specify how identifiers are imported from a DLL. - __DECLSPEC_SUPPORTED Defined if dllimport attribute is supported. - __MINGW_IMPORT The attribute definition to specify imported - variables/functions. - _CRTIMP As above. For MS compatibility. - __MINGW32_VERSION Runtime version. - __MINGW32_MAJOR_VERSION Runtime major version. - __MINGW32_MINOR_VERSION Runtime minor version. - __MINGW32_BUILD_DATE Runtime build date. + __DECLSPEC_SUPPORTED Defined if dllimport attribute is supported. + __MINGW_IMPORT The attribute definition to specify imported + variables/functions. + _CRTIMP As above. For MS compatibility. + __MINGW32_VERSION Runtime version. + __MINGW32_MAJOR_VERSION Runtime major version. + __MINGW32_MINOR_VERSION Runtime minor version. + __MINGW32_BUILD_DATE Runtime build date. + + Macros to enable MinGW features which deviate from standard MSVC + compatible behaviour; these may be specified directly in user code, + activated implicitly, (e.g. by specifying _POSIX_C_SOURCE or such), + or by inclusion in __MINGW_FEATURES__: + + __USE_MINGW_ANSI_STDIO Select a more ANSI C99 compatible + implementation of printf() and friends. Other macros: - __int64 define to be long long. Using a typedef doesn't - work for "unsigned __int64" + __int64 define to be long long. Using a typedef + doesn't work for "unsigned __int64" All headers should include this first, and then use __DECLSPEC_SUPPORTED to choose between the old ``__imp__name'' style or __MINGW_IMPORT style declarations. */ + +/* Manifest definitions identifying the flag bits, controlling activation + * of MinGW features, as specified by the user in __MINGW_FEATURES__. + */ +#define __MINGW_ANSI_STDIO__ 0x0000000000000001ULL +/* + * The following three are not yet formally supported; they are + * included here, to document anticipated future usage. + */ +#define __MINGW_LC_EXTENSIONS__ 0x0000000000000050ULL +#define __MINGW_LC_MESSAGES__ 0x0000000000000010ULL +#define __MINGW_LC_ENVVARS__ 0x0000000000000040ULL + /* Try to avoid problems with outdated checks for GCC __attribute__ support. */ #undef __attribute__ @@ -79,8 +107,14 @@ # define _CRTIMP # endif # endif /* __declspec */ -# ifndef __cdecl -# define __cdecl __attribute__ ((__cdecl__)) + +/* + The next two defines can cause problems if user code adds the __cdecl attribute + like so: + void __attribute__ ((__cdecl)) foo(void); +*/ +# ifndef __cdecl +# define __cdecl __attribute__ ((__cdecl__)) # endif # ifndef __stdcall # define __stdcall __attribute__ ((__stdcall__)) @@ -163,14 +197,44 @@ #else #define __MINGW_ATTRIB_DEPRECATED #endif /* GNUC >= 3.1 */ + +#if __MINGW_GNUC_PREREQ (3, 3) +#define __MINGW_NOTHROW __attribute__ ((__nothrow__)) +#else +#define __MINGW_NOTHROW +#endif /* GNUC >= 3.3 */ + + +/* TODO: Mark (almost) all CRT functions as __MINGW_NOTHROW. This will +allow GCC to optimize away some EH unwind code, at least in DW2 case. */ #ifndef __MSVCRT_VERSION__ /* High byte is the major version, low byte is the minor. */ # define __MSVCRT_VERSION__ 0x0600 #endif -#define __MINGW32_VERSION 3.12 -#define __MINGW32_MAJOR_VERSION 3 -#define __MINGW32_MINOR_VERSION 12 +/* Activation of MinGW specific extended features: + */ +#ifndef __USE_MINGW_ANSI_STDIO +/* + * If user didn't specify it explicitly... + */ +# if defined __STRICT_ANSI__ || defined _ISOC99_SOURCE \ + || defined _POSIX_SOURCE || defined _POSIX_C_SOURCE \ + || defined _XOPEN_SOURCE || defined _XOPEN_SOURCE_EXTENDED \ + || defined _GNU_SOURCE || defined _BSD_SOURCE \ + || defined _SVID_SOURCE + /* + * but where any of these source code qualifiers are specified, + * then assume ANSI I/O standards are preferred over Microsoft's... + */ +# define __USE_MINGW_ANSI_STDIO 1 +# else + /* + * otherwise use whatever __MINGW_FEATURES__ specifies... + */ +# define __USE_MINGW_ANSI_STDIO (__MINGW_FEATURES__ & __MINGW_ANSI_STDIO__) +# endif +#endif #endif /* __MINGW_H */ diff --git a/mingw/include/assert.h b/mingw/include/assert.h index 9d825c9a..0cf09fe0 100644 --- a/mingw/include/assert.h +++ b/mingw/include/assert.h @@ -35,7 +35,7 @@ extern "C" { * CRTDLL nicely supplies a function which does the actual output and * call to abort. */ -_CRTIMP void __cdecl _assert (const char*, const char*, int) __MINGW_ATTRIB_NORETURN; +_CRTIMP void __cdecl __MINGW_NOTHROW _assert (const char*, const char*, int) __MINGW_ATTRIB_NORETURN; /* * Definition of the assert macro. diff --git a/mingw/include/complex.h b/mingw/include/complex.h new file mode 100644 index 00000000..93f2a80c --- /dev/null +++ b/mingw/include/complex.h @@ -0,0 +1,200 @@ +/* + * complex.h + * + * This file is part of the Mingw32 package. + * + * Contributors: + * Created by Danny Smith + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef _COMPLEX_H_ +#define _COMPLEX_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +/* These macros are specified by C99 standard */ + +#ifndef __cplusplus +#define complex _Complex +#endif + +#define _Complex_I (0.0F + 1.0iF) + +/* GCC doesn't support _Imaginary type yet, so we don't + define _Imaginary_I */ + +#define I _Complex_I + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef RC_INVOKED + +double __MINGW_ATTRIB_CONST creal (double _Complex); +double __MINGW_ATTRIB_CONST cimag (double _Complex); +double __MINGW_ATTRIB_CONST carg (double _Complex); +double __MINGW_ATTRIB_CONST cabs (double _Complex); +double _Complex __MINGW_ATTRIB_CONST conj (double _Complex); +double _Complex cacos (double _Complex); +double _Complex casin (double _Complex); +double _Complex catan (double _Complex); +double _Complex ccos (double _Complex); +double _Complex csin (double _Complex); +double _Complex ctan (double _Complex); +double _Complex cacosh (double _Complex); +double _Complex casinh (double _Complex); +double _Complex catanh (double _Complex); +double _Complex ccosh (double _Complex); +double _Complex csinh (double _Complex); +double _Complex ctanh (double _Complex); +double _Complex cexp (double _Complex); +double _Complex clog (double _Complex); +double _Complex cpow (double _Complex, double _Complex); +double _Complex csqrt (double _Complex); +double _Complex __MINGW_ATTRIB_CONST cproj (double _Complex); + +float __MINGW_ATTRIB_CONST crealf (float _Complex); +float __MINGW_ATTRIB_CONST cimagf (float _Complex); +float __MINGW_ATTRIB_CONST cargf (float _Complex); +float __MINGW_ATTRIB_CONST cabsf (float _Complex); +float _Complex __MINGW_ATTRIB_CONST conjf (float _Complex); +float _Complex cacosf (float _Complex); +float _Complex casinf (float _Complex); +float _Complex catanf (float _Complex); +float _Complex ccosf (float _Complex); +float _Complex csinf (float _Complex); +float _Complex ctanf (float _Complex); +float _Complex cacoshf (float _Complex); +float _Complex casinhf (float _Complex); +float _Complex catanhf (float _Complex); +float _Complex ccoshf (float _Complex); +float _Complex csinhf (float _Complex); +float _Complex ctanhf (float _Complex); +float _Complex cexpf (float _Complex); +float _Complex clogf (float _Complex); +float _Complex cpowf (float _Complex, float _Complex); +float _Complex csqrtf (float _Complex); +float _Complex __MINGW_ATTRIB_CONST cprojf (float _Complex); + +long double __MINGW_ATTRIB_CONST creall (long double _Complex); +long double __MINGW_ATTRIB_CONST cimagl (long double _Complex); +long double __MINGW_ATTRIB_CONST cargl (long double _Complex); +long double __MINGW_ATTRIB_CONST cabsl (long double _Complex); +long double _Complex __MINGW_ATTRIB_CONST conjl (long double _Complex); +long double _Complex cacosl (long double _Complex); +long double _Complex casinl (long double _Complex); +long double _Complex catanl (long double _Complex); +long double _Complex ccosl (long double _Complex); +long double _Complex csinl (long double _Complex); +long double _Complex ctanl (long double _Complex); +long double _Complex cacoshl (long double _Complex); +long double _Complex casinhl (long double _Complex); +long double _Complex catanhl (long double _Complex); +long double _Complex ccoshl (long double _Complex); +long double _Complex csinhl (long double _Complex); +long double _Complex ctanhl (long double _Complex); +long double _Complex cexpl (long double _Complex); +long double _Complex clogl (long double _Complex); +long double _Complex cpowl (long double _Complex, long double _Complex); +long double _Complex csqrtl (long double _Complex); +long double _Complex __MINGW_ATTRIB_CONST cprojl (long double _Complex); + +#ifdef __GNUC__ + +/* double */ +__CRT_INLINE double __MINGW_ATTRIB_CONST creal (double _Complex _Z) +{ + return __real__ _Z; +} + +__CRT_INLINE double __MINGW_ATTRIB_CONST cimag (double _Complex _Z) +{ + return __imag__ _Z; +} + +__CRT_INLINE double _Complex __MINGW_ATTRIB_CONST conj (double _Complex _Z) +{ + return __extension__ ~_Z; +} + +__CRT_INLINE double __MINGW_ATTRIB_CONST carg (double _Complex _Z) +{ + double res; + __asm__ ("fpatan;" + : "=t" (res) : "0" (__real__ _Z), "u" (__imag__ _Z) : "st(1)"); + return res; +} + + +/* float */ +__CRT_INLINE float __MINGW_ATTRIB_CONST crealf (float _Complex _Z) +{ + return __real__ _Z; +} + +__CRT_INLINE float __MINGW_ATTRIB_CONST cimagf (float _Complex _Z) +{ + return __imag__ _Z; +} + +__CRT_INLINE float _Complex __MINGW_ATTRIB_CONST conjf (float _Complex _Z) +{ + return __extension__ ~_Z; +} + +__CRT_INLINE float __MINGW_ATTRIB_CONST cargf (float _Complex _Z) +{ + float res; + __asm__ ("fpatan;" + : "=t" (res) : "0" (__real__ _Z), "u" (__imag__ _Z) : "st(1)"); + return res; +} + +/* long double */ +__CRT_INLINE long double __MINGW_ATTRIB_CONST creall (long double _Complex _Z) +{ + return __real__ _Z; +} + +__CRT_INLINE long double __MINGW_ATTRIB_CONST cimagl (long double _Complex _Z) +{ + return __imag__ _Z; +} + +__CRT_INLINE long double _Complex __MINGW_ATTRIB_CONST conjl (long double _Complex _Z) +{ + return __extension__ ~_Z; +} + +__CRT_INLINE long double __MINGW_ATTRIB_CONST cargl (long double _Complex _Z) +{ + long double res; + __asm__ ("fpatan;" + : "=t" (res) : "0" (__real__ _Z), "u" (__imag__ _Z) : "st(1)"); + return res; +} + +#endif /* __GNUC__ */ + + +#endif /* RC_INVOKED */ + +#ifdef __cplusplus +} +#endif + + +#endif /* _COMPLEX_H */ diff --git a/mingw/include/conio.h b/mingw/include/conio.h new file mode 100644 index 00000000..8a821cbd --- /dev/null +++ b/mingw/include/conio.h @@ -0,0 +1,53 @@ +/* + * conio.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Low level console I/O functions. Pretty please try to use the ANSI + * standard ones if you are writing new code. + * + */ + +#ifndef _CONIO_H_ +#define _CONIO_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +_CRTIMP char* __cdecl __MINGW_NOTHROW _cgets (char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _cprintf (const char*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW _cputs (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _cscanf (char*, ...); + +_CRTIMP int __cdecl __MINGW_NOTHROW _getch (void); +_CRTIMP int __cdecl __MINGW_NOTHROW _getche (void); +_CRTIMP int __cdecl __MINGW_NOTHROW _kbhit (void); +_CRTIMP int __cdecl __MINGW_NOTHROW _putch (int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ungetch (int); + + +#ifndef _NO_OLDNAMES + +_CRTIMP int __cdecl __MINGW_NOTHROW getch (void); +_CRTIMP int __cdecl __MINGW_NOTHROW getche (void); +_CRTIMP int __cdecl __MINGW_NOTHROW kbhit (void); +_CRTIMP int __cdecl __MINGW_NOTHROW putch (int); +_CRTIMP int __cdecl __MINGW_NOTHROW ungetch (int); + +#endif /* Not _NO_OLDNAMES */ + + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _CONIO_H_ */ diff --git a/mingw/include/ctype.h b/mingw/include/ctype.h index 6404b162..551566bc 100644 --- a/mingw/include/ctype.h +++ b/mingw/include/ctype.h @@ -33,7 +33,7 @@ #define _CONTROL 0x0020 /* _BLANK is set for SP and non-ASCII horizontal space chars (eg, "no-break space", 0xA0, in CP1250) but not for HT. */ -#define _BLANK 0x0040 +#define _BLANK 0x0040 #define _HEX 0x0080 #define _LEADBYTE 0x8000 @@ -45,30 +45,30 @@ extern "C" { #endif -_CRTIMP int __cdecl isalnum(int); -_CRTIMP int __cdecl isalpha(int); -_CRTIMP int __cdecl iscntrl(int); -_CRTIMP int __cdecl isdigit(int); -_CRTIMP int __cdecl isgraph(int); -_CRTIMP int __cdecl islower(int); -_CRTIMP int __cdecl isprint(int); -_CRTIMP int __cdecl ispunct(int); -_CRTIMP int __cdecl isspace(int); -_CRTIMP int __cdecl isupper(int); -_CRTIMP int __cdecl isxdigit(int); +_CRTIMP int __cdecl __MINGW_NOTHROW isalnum(int); +_CRTIMP int __cdecl __MINGW_NOTHROW isalpha(int); +_CRTIMP int __cdecl __MINGW_NOTHROW iscntrl(int); +_CRTIMP int __cdecl __MINGW_NOTHROW isdigit(int); +_CRTIMP int __cdecl __MINGW_NOTHROW isgraph(int); +_CRTIMP int __cdecl __MINGW_NOTHROW islower(int); +_CRTIMP int __cdecl __MINGW_NOTHROW isprint(int); +_CRTIMP int __cdecl __MINGW_NOTHROW ispunct(int); +_CRTIMP int __cdecl __MINGW_NOTHROW isspace(int); +_CRTIMP int __cdecl __MINGW_NOTHROW isupper(int); +_CRTIMP int __cdecl __MINGW_NOTHROW isxdigit(int); #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ || !defined __STRICT_ANSI__ -int __cdecl isblank (int); +int __cdecl __MINGW_NOTHROW isblank (int); #endif #ifndef __STRICT_ANSI__ -_CRTIMP int __cdecl _isctype (int, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _isctype (int, int); #endif /* These are the ANSI versions, with correct checking of argument */ -_CRTIMP int __cdecl tolower(int); -_CRTIMP int __cdecl toupper(int); +_CRTIMP int __cdecl __MINGW_NOTHROW tolower(int); +_CRTIMP int __cdecl __MINGW_NOTHROW toupper(int); /* * NOTE: The above are not old name type wrappers, but functions exported @@ -80,8 +80,8 @@ _CRTIMP int __cdecl toupper(int); * These are the cheap non-std versions: The return values are undefined * if the argument is not ASCII char or is not of appropriate case */ -_CRTIMP int __cdecl _tolower(int); -_CRTIMP int __cdecl _toupper(int); +_CRTIMP int __cdecl __MINGW_NOTHROW _tolower(int); +_CRTIMP int __cdecl __MINGW_NOTHROW _toupper(int); #endif /* Also defined in stdlib.h */ @@ -97,10 +97,10 @@ _CRTIMP int __cdecl _toupper(int); #else /* ! __DECLSPEC_SUPPORTED */ # ifdef __MSVCRT__ - extern int* _imp____mbcur_max; + extern int* _imp____mb_cur_max; # define MB_CUR_MAX (*_imp____mb_cur_max) # else /* not __MSVCRT */ - extern int* _imp____mbcur_max_dll; + extern int* _imp____mb_cur_max_dll; # define MB_CUR_MAX (*_imp____mb_cur_max_dll) # endif /* not __MSVCRT */ #endif /* __DECLSPEC_SUPPORTED */ @@ -108,7 +108,9 @@ _CRTIMP int __cdecl _toupper(int); #ifdef __DECLSPEC_SUPPORTED -__MINGW_IMPORT unsigned short _ctype[]; +# if __MSVCRT_VERSION__ <= 0x0700 + __MINGW_IMPORT unsigned short _ctype[]; +# endif # ifdef __MSVCRT__ __MINGW_IMPORT unsigned short* _pctype; # else /* CRTDLL */ @@ -117,8 +119,10 @@ __MINGW_IMPORT unsigned short _ctype[]; # endif #else /* __DECLSPEC_SUPPORTED */ -extern unsigned short** _imp___ctype; -#define _ctype (*_imp___ctype) +# if __MSVCRT_VERSION__ <= 0x0700 + extern unsigned short** _imp___ctype; +# define _ctype (*_imp___ctype) +# endif # ifdef __MSVCRT__ extern unsigned short** _imp___pctype; # define _pctype (*_imp___pctype) @@ -142,32 +146,32 @@ extern unsigned short** _imp___ctype; * optimise away the constant condition. */ -#if ! (defined (__NO_INLINE__) || defined (__NO_CTYPE_INLINES) \ +#if !(defined (__NO_INLINE__) || defined (__NO_CTYPE_INLINES) \ || defined (__STRICT_ANSI__)) /* use simple lookup if SB locale, else _isctype() */ #define __ISCTYPE(c, mask) (MB_CUR_MAX == 1 ? (_pctype[c] & mask) : _isctype(c, mask)) -__CRT_INLINE int __cdecl isalnum(int c) {return __ISCTYPE(c, (_ALPHA|_DIGIT));} -__CRT_INLINE int __cdecl isalpha(int c) {return __ISCTYPE(c, _ALPHA);} -__CRT_INLINE int __cdecl iscntrl(int c) {return __ISCTYPE(c, _CONTROL);} -__CRT_INLINE int __cdecl isdigit(int c) {return __ISCTYPE(c, _DIGIT);} -__CRT_INLINE int __cdecl isgraph(int c) {return __ISCTYPE(c, (_PUNCT|_ALPHA|_DIGIT));} -__CRT_INLINE int __cdecl islower(int c) {return __ISCTYPE(c, _LOWER);} -__CRT_INLINE int __cdecl isprint(int c) {return __ISCTYPE(c, (_BLANK|_PUNCT|_ALPHA|_DIGIT));} -__CRT_INLINE int __cdecl ispunct(int c) {return __ISCTYPE(c, _PUNCT);} -__CRT_INLINE int __cdecl isspace(int c) {return __ISCTYPE(c, _SPACE);} -__CRT_INLINE int __cdecl isupper(int c) {return __ISCTYPE(c, _UPPER);} -__CRT_INLINE int __cdecl isxdigit(int c) {return __ISCTYPE(c, _HEX);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isalnum(int c) {return __ISCTYPE(c, (_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isalpha(int c) {return __ISCTYPE(c, _ALPHA);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iscntrl(int c) {return __ISCTYPE(c, _CONTROL);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isdigit(int c) {return __ISCTYPE(c, _DIGIT);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isgraph(int c) {return __ISCTYPE(c, (_PUNCT|_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW islower(int c) {return __ISCTYPE(c, _LOWER);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isprint(int c) {return __ISCTYPE(c, (_BLANK|_PUNCT|_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW ispunct(int c) {return __ISCTYPE(c, _PUNCT);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isspace(int c) {return __ISCTYPE(c, _SPACE);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isupper(int c) {return __ISCTYPE(c, _UPPER);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isxdigit(int c) {return __ISCTYPE(c, _HEX);} #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ || !defined __STRICT_ANSI__ -__CRT_INLINE int __cdecl isblank (int c) +__CRT_INLINE int __cdecl __MINGW_NOTHROW isblank (int c) {return (__ISCTYPE(c, _BLANK) || c == '\t');} #endif /* these reproduce behaviour of lib underscored versions */ -__CRT_INLINE int __cdecl _tolower(int c) {return ( c -'A'+'a');} -__CRT_INLINE int __cdecl _toupper(int c) {return ( c -'a'+'A');} +__CRT_INLINE int __cdecl __MINGW_NOTHROW _tolower(int c) {return ( c -'A'+'a');} +__CRT_INLINE int __cdecl __MINGW_NOTHROW _toupper(int c) {return ( c -'a'+'A');} /* TODO? Is it worth inlining ANSI tolower, toupper? Probably only if we only want C-locale. */ @@ -185,78 +189,78 @@ typedef wchar_t wctype_t; #define _WCTYPE_T_DEFINED #endif -_CRTIMP int __cdecl iswalnum(wint_t); -_CRTIMP int __cdecl iswalpha(wint_t); -_CRTIMP int __cdecl iswascii(wint_t); -_CRTIMP int __cdecl iswcntrl(wint_t); -_CRTIMP int __cdecl iswctype(wint_t, wctype_t); -_CRTIMP int __cdecl is_wctype(wint_t, wctype_t); /* Obsolete! */ -_CRTIMP int __cdecl iswdigit(wint_t); -_CRTIMP int __cdecl iswgraph(wint_t); -_CRTIMP int __cdecl iswlower(wint_t); -_CRTIMP int __cdecl iswprint(wint_t); -_CRTIMP int __cdecl iswpunct(wint_t); -_CRTIMP int __cdecl iswspace(wint_t); -_CRTIMP int __cdecl iswupper(wint_t); -_CRTIMP int __cdecl iswxdigit(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswalnum(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswalpha(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswascii(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswcntrl(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswctype(wint_t, wctype_t); +_CRTIMP int __cdecl __MINGW_NOTHROW is_wctype(wint_t, wctype_t); /* Obsolete! */ +_CRTIMP int __cdecl __MINGW_NOTHROW iswdigit(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswgraph(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswlower(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswprint(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswpunct(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswspace(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswupper(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswxdigit(wint_t); #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ || !defined __STRICT_ANSI__ || defined __cplusplus -int __cdecl iswblank (wint_t); +int __cdecl __MINGW_NOTHROW iswblank (wint_t); #endif /* Older MS docs uses wchar_t for arg and return type, while newer online MS docs say arg is wint_t and return is int. ISO C uses wint_t for both. */ -_CRTIMP wint_t __cdecl towlower (wint_t); -_CRTIMP wint_t __cdecl towupper (wint_t); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW towlower (wint_t); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW towupper (wint_t); -_CRTIMP int __cdecl isleadbyte (int); +_CRTIMP int __cdecl __MINGW_NOTHROW isleadbyte (int); /* Also in wctype.h */ #if ! (defined (__NO_INLINE__) || defined(__NO_CTYPE_INLINES) \ || defined(__WCTYPE_INLINES_DEFINED)) #define __WCTYPE_INLINES_DEFINED -__CRT_INLINE int __cdecl iswalnum(wint_t wc) {return (iswctype(wc,_ALPHA|_DIGIT));} -__CRT_INLINE int __cdecl iswalpha(wint_t wc) {return (iswctype(wc,_ALPHA));} -__CRT_INLINE int __cdecl iswascii(wint_t wc) {return ((wc & ~0x7F) ==0);} -__CRT_INLINE int __cdecl iswcntrl(wint_t wc) {return (iswctype(wc,_CONTROL));} -__CRT_INLINE int __cdecl iswdigit(wint_t wc) {return (iswctype(wc,_DIGIT));} -__CRT_INLINE int __cdecl iswgraph(wint_t wc) {return (iswctype(wc,_PUNCT|_ALPHA|_DIGIT));} -__CRT_INLINE int __cdecl iswlower(wint_t wc) {return (iswctype(wc,_LOWER));} -__CRT_INLINE int __cdecl iswprint(wint_t wc) {return (iswctype(wc,_BLANK|_PUNCT|_ALPHA|_DIGIT));} -__CRT_INLINE int __cdecl iswpunct(wint_t wc) {return (iswctype(wc,_PUNCT));} -__CRT_INLINE int __cdecl iswspace(wint_t wc) {return (iswctype(wc,_SPACE));} -__CRT_INLINE int __cdecl iswupper(wint_t wc) {return (iswctype(wc,_UPPER));} -__CRT_INLINE int __cdecl iswxdigit(wint_t wc) {return (iswctype(wc,_HEX));} -__CRT_INLINE int __cdecl isleadbyte(int c) {return (_pctype[(unsigned char)(c)] & _LEADBYTE);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswalnum(wint_t wc) {return (iswctype(wc,_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswalpha(wint_t wc) {return (iswctype(wc,_ALPHA));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswascii(wint_t wc) {return ((wc & ~0x7F) ==0);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswcntrl(wint_t wc) {return (iswctype(wc,_CONTROL));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswdigit(wint_t wc) {return (iswctype(wc,_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswgraph(wint_t wc) {return (iswctype(wc,_PUNCT|_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswlower(wint_t wc) {return (iswctype(wc,_LOWER));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswprint(wint_t wc) {return (iswctype(wc,_BLANK|_PUNCT|_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswpunct(wint_t wc) {return (iswctype(wc,_PUNCT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswspace(wint_t wc) {return (iswctype(wc,_SPACE));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswupper(wint_t wc) {return (iswctype(wc,_UPPER));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswxdigit(wint_t wc) {return (iswctype(wc,_HEX));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isleadbyte(int c) {return (_pctype[(unsigned char)(c)] & _LEADBYTE);} #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ || !defined __STRICT_ANSI__ || defined __cplusplus -__CRT_INLINE int __cdecl iswblank (wint_t wc) +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswblank (wint_t wc) {return (iswctype(wc,_BLANK) || wc == L'\t');} #endif #endif /* !(defined(__NO_CTYPE_INLINES) || defined(__WCTYPE_INLINES_DEFINED)) */ #ifndef __STRICT_ANSI__ -int __cdecl __isascii (int); -int __cdecl __toascii (int); -int __cdecl __iscsymf (int); /* Valid first character in C symbol */ -int __cdecl __iscsym (int); /* Valid character in C symbol (after first) */ +int __cdecl __MINGW_NOTHROW __isascii (int); +int __cdecl __MINGW_NOTHROW __toascii (int); +int __cdecl __MINGW_NOTHROW __iscsymf (int); /* Valid first character in C symbol */ +int __cdecl __MINGW_NOTHROW __iscsym (int); /* Valid character in C symbol (after first) */ #if !(defined (__NO_INLINE__) || defined (__NO_CTYPE_INLINES)) -__CRT_INLINE int __cdecl __isascii(int c) {return ((c & ~0x7F) == 0);} -__CRT_INLINE int __cdecl __toascii(int c) {return (c & 0x7F);} -__CRT_INLINE int __cdecl __iscsymf(int c) {return (isalpha(c) || (c == '_'));} -__CRT_INLINE int __cdecl __iscsym(int c) {return (isalnum(c) || (c == '_'));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW __isascii(int c) {return ((c & ~0x7F) == 0);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW __toascii(int c) {return (c & 0x7F);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW __iscsymf(int c) {return (isalpha(c) || (c == '_'));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW __iscsym(int c) {return (isalnum(c) || (c == '_'));} #endif /* __NO_CTYPE_INLINES */ #ifndef _NO_OLDNAMES /* Not _CRTIMP */ -int __cdecl isascii (int); -int __cdecl toascii (int); -int __cdecl iscsymf (int); -int __cdecl iscsym (int); +int __cdecl __MINGW_NOTHROW isascii (int); +int __cdecl __MINGW_NOTHROW toascii (int); +int __cdecl __MINGW_NOTHROW iscsymf (int); +int __cdecl __MINGW_NOTHROW iscsym (int); #endif /* Not _NO_OLDNAMES */ #endif /* Not __STRICT_ANSI__ */ diff --git a/mingw/include/dir.h b/mingw/include/dir.h new file mode 100644 index 00000000..d759a0a6 --- /dev/null +++ b/mingw/include/dir.h @@ -0,0 +1,26 @@ +/* + * dir.h + * + * This file OBSOLESCENT and only provided for backward compatibility. + * Please use io.h instead. + * + * This file is part of the Mingw32 package. + * + * Contributors: + * Created by Colin Peters + * Mumit Khan + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#include + diff --git a/mingw/include/direct.h b/mingw/include/direct.h new file mode 100644 index 00000000..8e39c4cc --- /dev/null +++ b/mingw/include/direct.h @@ -0,0 +1,73 @@ +/* + * direct.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Functions for manipulating paths and directories (included from io.h) + * plus functions for setting the current drive. + * + */ +#ifndef _DIRECT_H_ +#define _DIRECT_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#define __need_wchar_t +#ifndef RC_INVOKED +#include +#endif /* Not RC_INVOKED */ + +#include + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _DISKFREE_T_DEFINED +/* needed by _getdiskfree (also in dos.h) */ +struct _diskfree_t { + unsigned total_clusters; + unsigned avail_clusters; + unsigned sectors_per_cluster; + unsigned bytes_per_sector; +}; +#define _DISKFREE_T_DEFINED +#endif + +/* + * You really shouldn't be using these. Use the Win32 API functions instead. + * However, it does make it easier to port older code. + */ +_CRTIMP int __cdecl __MINGW_NOTHROW _getdrive (void); +_CRTIMP unsigned long __cdecl __MINGW_NOTHROW _getdrives(void); +_CRTIMP int __cdecl __MINGW_NOTHROW _chdrive (int); +_CRTIMP char* __cdecl __MINGW_NOTHROW _getdcwd (int, char*, int); +_CRTIMP unsigned __cdecl __MINGW_NOTHROW _getdiskfree (unsigned, struct _diskfree_t *); + +#ifndef _NO_OLDNAMES +# define diskfree_t _diskfree_t +#endif + +#ifndef _WDIRECT_DEFINED +/* wide character versions. Also in wchar.h */ +#ifdef __MSVCRT__ +_CRTIMP int __cdecl __MINGW_NOTHROW _wchdir(const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wgetcwd(wchar_t*, int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wgetdcwd(int, wchar_t*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _wmkdir(const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wrmdir(const wchar_t*); +#endif /* __MSVCRT__ */ +#define _WDIRECT_DEFINED +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _DIRECT_H_ */ diff --git a/mingw/include/dirent.h b/mingw/include/dirent.h index a18cbcab..e2a66892 100644 --- a/mingw/include/dirent.h +++ b/mingw/include/dirent.h @@ -57,12 +57,12 @@ typedef struct char dd_name[1]; } DIR; -DIR* __cdecl opendir (const char*); -struct dirent* __cdecl readdir (DIR*); -int __cdecl closedir (DIR*); -void __cdecl rewinddir (DIR*); -long __cdecl telldir (DIR*); -void __cdecl seekdir (DIR*, long); +DIR* __cdecl __MINGW_NOTHROW opendir (const char*); +struct dirent* __cdecl __MINGW_NOTHROW readdir (DIR*); +int __cdecl __MINGW_NOTHROW closedir (DIR*); +void __cdecl __MINGW_NOTHROW rewinddir (DIR*); +long __cdecl __MINGW_NOTHROW telldir (DIR*); +void __cdecl __MINGW_NOTHROW seekdir (DIR*, long); /* wide char versions */ @@ -106,12 +106,12 @@ typedef struct -_WDIR* __cdecl _wopendir (const wchar_t*); -struct _wdirent* __cdecl _wreaddir (_WDIR*); -int __cdecl _wclosedir (_WDIR*); -void __cdecl _wrewinddir (_WDIR*); -long __cdecl _wtelldir (_WDIR*); -void __cdecl _wseekdir (_WDIR*, long); +_WDIR* __cdecl __MINGW_NOTHROW _wopendir (const wchar_t*); +struct _wdirent* __cdecl __MINGW_NOTHROW _wreaddir (_WDIR*); +int __cdecl __MINGW_NOTHROW _wclosedir (_WDIR*); +void __cdecl __MINGW_NOTHROW _wrewinddir (_WDIR*); +long __cdecl __MINGW_NOTHROW _wtelldir (_WDIR*); +void __cdecl __MINGW_NOTHROW _wseekdir (_WDIR*, long); #ifdef __cplusplus diff --git a/mingw/include/dos.h b/mingw/include/dos.h new file mode 100644 index 00000000..80ba89e1 --- /dev/null +++ b/mingw/include/dos.h @@ -0,0 +1,89 @@ +/* + * dos.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * DOS-specific functions and structures. + * + */ + +#ifndef _DOS_H_ +#define _DOS_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#define __need_wchar_t +#ifndef RC_INVOKED +#include +#endif /* Not RC_INVOKED */ + +/* For DOS file attributes */ +#include + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __MSVCRT__ /* these are in CRTDLL, but not MSVCRT */ +#ifndef __DECLSPEC_SUPPORTED +extern unsigned int *_imp___basemajor_dll; +extern unsigned int *_imp___baseminor_dll; +extern unsigned int *_imp___baseversion_dll; +extern unsigned int *_imp___osmajor_dll; +extern unsigned int *_imp___osminor_dll; +extern unsigned int *_imp___osmode_dll; + +#define _basemajor (*_imp___basemajor_dll) +#define _baseminor (*_imp___baseminor_dll) +#define _baseversion (*_imp___baseversion_dll) +#define _osmajor (*_imp___osmajor_dll) +#define _osminor (*_imp___osminor_dll) +#define _osmode (*_imp___osmode_dll) + +#else /* __DECLSPEC_SUPPORTED */ + +__MINGW_IMPORT unsigned int _basemajor_dll; +__MINGW_IMPORT unsigned int _baseminor_dll; +__MINGW_IMPORT unsigned int _baseversion_dll; +__MINGW_IMPORT unsigned int _osmajor_dll; +__MINGW_IMPORT unsigned int _osminor_dll; +__MINGW_IMPORT unsigned int _osmode_dll; + +#define _basemajor _basemajor_dll +#define _baseminor _baseminor_dll +#define _baseversion _baseversion_dll +#define _osmajor _osmajor_dll +#define _osminor _osminor_dll +#define _osmode _osmode_dll + +#endif /* __DECLSPEC_SUPPORTED */ +#endif /* ! __MSVCRT__ */ + +#ifndef _DISKFREE_T_DEFINED +/* needed by _getdiskfree (also in direct.h) */ +struct _diskfree_t { + unsigned total_clusters; + unsigned avail_clusters; + unsigned sectors_per_cluster; + unsigned bytes_per_sector; +}; +#define _DISKFREE_T_DEFINED +#endif + +_CRTIMP unsigned __cdecl __MINGW_NOTHROW _getdiskfree (unsigned, struct _diskfree_t *); + +#ifndef _NO_OLDNAMES +# define diskfree_t _diskfree_t +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _DOS_H_ */ diff --git a/mingw/include/errno.h b/mingw/include/errno.h index f9f709c6..675b5067 100644 --- a/mingw/include/errno.h +++ b/mingw/include/errno.h @@ -88,7 +88,7 @@ extern "C" { #undef errno extern int errno; #else -_CRTIMP int* __cdecl _errno(void); +_CRTIMP int* __cdecl __MINGW_NOTHROW _errno(void); #define errno (*_errno()) #endif diff --git a/mingw/include/excpt.h b/mingw/include/excpt.h new file mode 100644 index 00000000..e75ceb78 --- /dev/null +++ b/mingw/include/excpt.h @@ -0,0 +1,102 @@ +/* + * excpt.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Support for operating system level structured exception handling. + * + * NOTE: This is very preliminary stuff. I am also pretty sure it is + * completely Intel specific. + * + */ + +#ifndef _EXCPT_H_ +#define _EXCPT_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#include + +/* + * NOTE: The constants structs and typedefs below should be defined in the + * Win32 API headers. + */ +#define EH_NONCONTINUABLE 0x01 +#define EH_UNWINDING 0x02 +#define EH_EXIT_UNWIND 0x04 +#define EH_STACK_INVALID 0x08 +#define EH_NESTED_CALL 0x10 + +#ifndef RC_INVOKED + +typedef enum { + ExceptionContinueExecution, + ExceptionContinueSearch, + ExceptionNestedException, + ExceptionCollidedUnwind +} EXCEPTION_DISPOSITION; + + +/* + * End of stuff that should be in the Win32 API files. + */ + + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The type of function that is expected as an exception handler to be + * installed with __try1. + */ +typedef EXCEPTION_DISPOSITION (*PEXCEPTION_HANDLER) + (struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*); + +/* + * This is not entirely necessary, but it is the structure installed by + * the __try1 primitive below. + */ +typedef struct _EXCEPTION_REGISTRATION +{ + struct _EXCEPTION_REGISTRATION* prev; + PEXCEPTION_HANDLER handler; +} EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION; + +typedef EXCEPTION_REGISTRATION EXCEPTION_REGISTRATION_RECORD; +typedef PEXCEPTION_REGISTRATION PEXCEPTION_REGISTRATION_RECORD; + +/* + * A macro which installs the supplied exception handler. + * Push the pointer to the new handler onto the stack, + * then push the pointer to the old registration structure (at fs:0) + * onto the stack, then put a pointer to the new registration + * structure (i.e. the current stack pointer) at fs:0. + */ +#define __try1(pHandler) \ + __asm__ ("pushl %0;pushl %%fs:0;movl %%esp,%%fs:0;" : : "g" (pHandler)); + +/* + * A macro which (despite its name) *removes* an installed + * exception handler. Should be used only in conjunction with the above + * install routine __try1. + * Move the pointer to the old reg. struct (at the current stack + * position) to fs:0, replacing the pointer we installed above, + * then add 8 to the stack pointer to get rid of the space we + * used when we pushed on our new reg. struct above. Notice that + * the stack must be in the exact state at this point that it was + * after we did __try1 or this will smash things. + */ +#define __except1 \ + __asm__ ("movl (%%esp),%%eax;movl %%eax,%%fs:0;addl $8,%%esp;" \ + : : : "%eax"); + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* _EXCPT_H_ not defined */ diff --git a/mingw/include/fcntl.h b/mingw/include/fcntl.h index e62d1595..9bff9352 100644 --- a/mingw/include/fcntl.h +++ b/mingw/include/fcntl.h @@ -46,6 +46,12 @@ #define _O_BINARY 0x8000 /* Input and output is not translated. */ #define _O_RAW _O_BINARY +#if (__MSVCRT_VERSION__ >= 0x0800) +#define _O_WTEXT 0x10000 +#define _O_U16TEXT 0x20000 +#define _O_U8TEXT 0x40000 +#endif + #ifndef _NO_OLDNAMES /* POSIX/Non-ANSI names for increased portability */ diff --git a/mingw/include/fenv.h b/mingw/include/fenv.h new file mode 100644 index 00000000..ddae8921 --- /dev/null +++ b/mingw/include/fenv.h @@ -0,0 +1,107 @@ +#ifndef _FENV_H_ +#define _FENV_H_ + +#include <_mingw.h> + +/* FPU status word exception flags */ +#define FE_INVALID 0x01 +#define FE_DENORMAL 0x02 +#define FE_DIVBYZERO 0x04 +#define FE_OVERFLOW 0x08 +#define FE_UNDERFLOW 0x10 +#define FE_INEXACT 0x20 +#define FE_ALL_EXCEPT (FE_INVALID | FE_DENORMAL | FE_DIVBYZERO \ + | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) + +/* FPU control word rounding flags */ +#define FE_TONEAREST 0x0000 +#define FE_DOWNWARD 0x0400 +#define FE_UPWARD 0x0800 +#define FE_TOWARDZERO 0x0c00 + +/* The MXCSR exception flags are the same as the + FE flags. */ +#define __MXCSR_EXCEPT_FLAG_SHIFT 0 + +/* How much to shift FE status word exception flags + to get the MXCSR exeptions masks, */ +#define __MXCSR_EXCEPT_MASK_SHIFT 7 + +/* How much to shift FE control word rounding flags + to get MXCSR rounding flags, */ +#define __MXCSR_ROUND_FLAG_SHIFT 3 + +#ifndef RC_INVOKED +/* + For now, support only for the basic abstraction of flags that are + either set or clear. fexcept_t could be structure that holds more + info about the fp environment. +*/ +typedef unsigned short fexcept_t; + +/* This 32-byte struct represents the entire floating point + environment as stored by fnstenv or fstenv, augmented by + the contents of the MXCSR register, as stored by stmxcsr + (if CPU supports it). */ +typedef struct +{ + unsigned short __control_word; + unsigned short __unused0; + unsigned short __status_word; + unsigned short __unused1; + unsigned short __tag_word; + unsigned short __unused2; + unsigned int __ip_offset; /* instruction pointer offset */ + unsigned short __ip_selector; + unsigned short __opcode; + unsigned int __data_offset; + unsigned short __data_selector; + unsigned short __unused3; + unsigned int __mxcsr; /* contents of the MXCSR register */ +} fenv_t; + + +/*The C99 standard (7.6.9) allows us to define implementation-specific macros for + different fp environments */ + +/* The default Intel x87 floating point environment (64-bit mantissa) */ +#define FE_PC64_ENV ((const fenv_t *)-1) + +/* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ +#define FE_PC53_ENV ((const fenv_t *)-2) + +/* The FE_DFL_ENV macro is required by standard. + fesetenv will use the environment set at app startup.*/ +#define FE_DFL_ENV ((const fenv_t *) 0) + +#ifdef __cplusplus +extern "C" { +#endif + +/*TODO: Some of these could be inlined */ +/* 7.6.2 Exception */ + +extern int __cdecl __MINGW_NOTHROW feclearexcept (int); +extern int __cdecl __MINGW_NOTHROW fegetexceptflag (fexcept_t * flagp, int excepts); +extern int __cdecl __MINGW_NOTHROW feraiseexcept (int excepts ); +extern int __cdecl __MINGW_NOTHROW fesetexceptflag (const fexcept_t *, int); +extern int __cdecl __MINGW_NOTHROW fetestexcept (int excepts); + +/* 7.6.3 Rounding */ + +extern int __cdecl __MINGW_NOTHROW fegetround (void); +extern int __cdecl __MINGW_NOTHROW fesetround (int mode); + +/* 7.6.4 Environment */ + +extern int __cdecl __MINGW_NOTHROW fegetenv (fenv_t * envp); +extern int __cdecl __MINGW_NOTHROW fesetenv (const fenv_t * ); +extern int __cdecl __MINGW_NOTHROW feupdateenv (const fenv_t *); +extern int __cdecl __MINGW_NOTHROW feholdexcept (fenv_t *); + +#ifdef __cplusplus +} +#endif +#endif /* Not RC_INVOKED */ + +#endif /* ndef _FENV_H */ diff --git a/mingw/include/float.h b/mingw/include/float.h new file mode 100644 index 00000000..97a2c1cd --- /dev/null +++ b/mingw/include/float.h @@ -0,0 +1,152 @@ +/* + * float.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Constants related to floating point arithmetic. + * + * Also included here are some non-ANSI bits for accessing the floating + * point controller. + * + * NOTE: GCC provides float.h, but it doesn't include the non-standard + * stuff for accessing the fp controller. We include_next the + * GCC-supplied header and just define the MS-specific extensions + * here. + * + */ + +#include_next + +#ifndef _MINGW_FLOAT_H_ +#define _MINGW_FLOAT_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +/* + * Functions and definitions for controlling the FPU. + */ +#ifndef __STRICT_ANSI__ + +/* TODO: These constants are only valid for x86 machines */ + +/* Control word masks for unMask */ +#define _MCW_EM 0x0008001F /* Error masks */ +#define _MCW_IC 0x00040000 /* Infinity */ +#define _MCW_RC 0x00000300 /* Rounding */ +#define _MCW_PC 0x00030000 /* Precision */ + +/* Control word values for unNew (use with related unMask above) */ +#define _EM_INVALID 0x00000010 +#define _EM_DENORMAL 0x00080000 +#define _EM_ZERODIVIDE 0x00000008 +#define _EM_OVERFLOW 0x00000004 +#define _EM_UNDERFLOW 0x00000002 +#define _EM_INEXACT 0x00000001 +#define _IC_AFFINE 0x00040000 +#define _IC_PROJECTIVE 0x00000000 +#define _RC_CHOP 0x00000300 +#define _RC_UP 0x00000200 +#define _RC_DOWN 0x00000100 +#define _RC_NEAR 0x00000000 +#define _PC_24 0x00020000 +#define _PC_53 0x00010000 +#define _PC_64 0x00000000 + +/* These are also defined in Mingw math.h, needed to work around + GCC build issues. */ +/* Return values for fpclass. */ +#ifndef __MINGW_FPCLASS_DEFINED +#define __MINGW_FPCLASS_DEFINED 1 +#define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */ +#define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */ +#define _FPCLASS_NINF 0x0004 /* Negative Infinity */ +#define _FPCLASS_NN 0x0008 /* Negative Normal */ +#define _FPCLASS_ND 0x0010 /* Negative Denormal */ +#define _FPCLASS_NZ 0x0020 /* Negative Zero */ +#define _FPCLASS_PZ 0x0040 /* Positive Zero */ +#define _FPCLASS_PD 0x0080 /* Positive Denormal */ +#define _FPCLASS_PN 0x0100 /* Positive Normal */ +#define _FPCLASS_PINF 0x0200 /* Positive Infinity */ +#endif /* __MINGW_FPCLASS_DEFINED */ + +/* invalid subconditions (_SW_INVALID also set) */ +#define _SW_UNEMULATED 0x0040 /* unemulated instruction */ +#define _SW_SQRTNEG 0x0080 /* square root of a neg number */ +#define _SW_STACKOVERFLOW 0x0200 /* FP stack overflow */ +#define _SW_STACKUNDERFLOW 0x0400 /* FP stack underflow */ + +/* Floating point error signals and return codes */ +#define _FPE_INVALID 0x81 +#define _FPE_DENORMAL 0x82 +#define _FPE_ZERODIVIDE 0x83 +#define _FPE_OVERFLOW 0x84 +#define _FPE_UNDERFLOW 0x85 +#define _FPE_INEXACT 0x86 +#define _FPE_UNEMULATED 0x87 +#define _FPE_SQRTNEG 0x88 +#define _FPE_STACKOVERFLOW 0x8a +#define _FPE_STACKUNDERFLOW 0x8b +#define _FPE_EXPLICITGEN 0x8c /* raise( SIGFPE ); */ + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +/* Set the FPU control word as cw = (cw & ~unMask) | (unNew & unMask), + * i.e. change the bits in unMask to have the values they have in unNew, + * leaving other bits unchanged. */ +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _controlfp (unsigned int unNew, unsigned int unMask); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _control87 (unsigned int unNew, unsigned int unMask); + + +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _clearfp (void); /* Clear the FPU status word */ +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _statusfp (void); /* Report the FPU status word */ +#define _clear87 _clearfp +#define _status87 _statusfp + + +/* + MSVCRT.dll _fpreset initializes the control register to 0x27f, + the status register to zero and the tag word to 0FFFFh. + This differs from asm instruction finit/fninit which set control + word to 0x37f (64 bit mantissa precison rather than 53 bit). + By default, the mingw version of _fpreset sets fp control as + per fninit. To use the MSVCRT.dll _fpreset, include CRT_fp8.o when + building your application. +*/ +void __cdecl __MINGW_NOTHROW _fpreset (void); +void __cdecl __MINGW_NOTHROW fpreset (void); + +/* Global 'variable' for the current floating point error code. */ +_CRTIMP int * __cdecl __MINGW_NOTHROW __fpecode(void); +#define _fpecode (*(__fpecode())) + +/* + * IEEE recommended functions. MS puts them in float.h + * but they really belong in math.h. + */ + +_CRTIMP double __cdecl __MINGW_NOTHROW _chgsign (double); +_CRTIMP double __cdecl __MINGW_NOTHROW _copysign (double, double); +_CRTIMP double __cdecl __MINGW_NOTHROW _logb (double); +_CRTIMP double __cdecl __MINGW_NOTHROW _nextafter (double, double); +_CRTIMP double __cdecl __MINGW_NOTHROW _scalb (double, long); + +_CRTIMP int __cdecl __MINGW_NOTHROW _finite (double); +_CRTIMP int __cdecl __MINGW_NOTHROW _fpclass (double); +_CRTIMP int __cdecl __MINGW_NOTHROW _isnan (double); + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not __STRICT_ANSI__ */ + +#endif /* _FLOAT_H_ */ + diff --git a/mingw/include/getopt.h b/mingw/include/getopt.h dissimilarity index 90% index 6b6f643b..406bbf59 100644 --- a/mingw/include/getopt.h +++ b/mingw/include/getopt.h @@ -1,84 +1,111 @@ -/* - * Copyright (c) 1987, 1993, 1994, 1996 - * 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 __GETOPT_H__ -#define __GETOPT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int opterr; /* if error message should be printed */ -extern int optind; /* index into parent argv vector */ -extern int optopt; /* character checked for validity */ -extern int optreset; /* reset getopt */ -extern char *optarg; /* argument associated with option */ - -int getopt (int, char * const *, const char *); - -#ifdef __cplusplus -} -#endif - -#endif /* __GETOPT_H__ */ - -#ifndef __UNISTD_GETOPT__ -#ifndef __GETOPT_LONG_H__ -#define __GETOPT_LONG_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -struct option { - const char *name; - int has_arg; - int *flag; - int val; -}; - -int getopt_long (int, char *const *, const char *, const struct option *, int *); -#ifndef HAVE_DECL_GETOPT -#define HAVE_DECL_GETOPT 1 -#endif - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#ifdef __cplusplus -} -#endif - -#endif /* __GETOPT_LONG_H__ */ -#endif /* __UNISTD_GETOPT__ */ +#ifndef __GETOPT_H__ +/* + * getopt.h + * + * $Id: getopt.h,v 1.4 2009/01/04 17:35:36 keithmarshall Exp $ + * + * Defines constants and function prototypes required to implement + * the `getopt', `getopt_long' and `getopt_long_only' APIs. + * + * This file is part of the MinGW32 package set. + * + * Contributed by Keith Marshall + * + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * $Revision: 1.4 $ + * $Author: keithmarshall $ + * $Date: 2009/01/04 17:35:36 $ + * + */ +#define __GETOPT_H__ + +/* All the headers include this file. */ +#include <_mingw.h> + +#ifdef __cplusplus +extern "C" { +#endif + +extern int optind; /* index of first non-option in argv */ +extern int optopt; /* single option character, as parsed */ +extern int opterr; /* flag to enable built-in diagnostics... */ + /* (user may set to zero, to suppress) */ + +extern char *optarg; /* pointer to argument of current option */ + +extern int getopt( int, char * const [], const char * ); + +#ifdef _BSD_SOURCE +/* + * BSD adds the non-standard `optreset' feature, for reinitialisation + * of `getopt' parsing. We support this feature, for applications which + * proclaim their BSD heritage, before including this header; however, + * to maintain portability, developers are advised to avoid it. + */ +# define optreset __mingw_optreset + +extern int optreset; +#endif +#ifdef __cplusplus +} +#endif +/* + * POSIX requires the `getopt' API to be specified in `unistd.h'; + * thus, `unistd.h' includes this header. However, we do not want + * to expose the `getopt_long' or `getopt_long_only' APIs, when + * included in this manner. Thus, close the standard __GETOPT_H__ + * declarations block, and open an additional __GETOPT_LONG_H__ + * specific block, only when *not* __UNISTD_H_SOURCED__, in which + * to declare the extended API. + */ +#endif /* !defined(__GETOPT_H__) */ +#if !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) +#define __GETOPT_LONG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct option /* specification for a long form option... */ +{ + const char *name; /* option name, without leading hyphens */ + int has_arg; /* does it take an argument? */ + int *flag; /* where to save its status, or NULL */ + int val; /* its associated status value */ +}; + +enum /* permitted values for its `has_arg' field... */ +{ + no_argument = 0, /* option never takes an argument */ + required_argument, /* option always requires an argument */ + optional_argument /* option may take an argument */ +}; + +extern int getopt_long( int, char * const [], const char *, const struct option *, int * ); +extern int getopt_long_only( int, char * const [], const char *, const struct option *, int * ); +/* + * Previous MinGW implementation had... + */ +#ifndef HAVE_DECL_GETOPT +/* + * ...for the long form API only; keep this for compatibility. + */ +# define HAVE_DECL_GETOPT 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) */ +/* $RCSfile: getopt.h,v $Revision: 1.4 $: end of file */ diff --git a/mingw/include/gmon.h b/mingw/include/gmon.h new file mode 100644 index 00000000..1f01bf41 --- /dev/null +++ b/mingw/include/gmon.h @@ -0,0 +1,181 @@ +/* $OpenBSD: gmon.h,v 1.3 1996/04/21 22:31:46 deraadt Exp $ */ +/* $NetBSD: gmon.h,v 1.5 1996/04/09 20:55:30 cgd Exp $ */ + +/*- + * Copyright (c) 1982, 1986, 1992, 1993 + * 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. + * + * @(#)gmon.h 8.2 (Berkeley) 1/4/94 + */ + +/* + * This file is taken from Cygwin distribution. Please keep it in sync. + * The differences should be within __MINGW32__ guard. + */ + +#ifndef _SYS_GMON_H_ +#define _SYS_GMON_H_ + +#ifndef __P +#define __P(x) x +#endif + +#include + +#ifdef __MINGW32__ +#ifndef _BSDTYPES_DEFINED +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +#define _BSDTYPES_DEFINED +#endif /* _BSDTYPES_DEFINED */ +#endif /* __MINGW32__*/ + +/* + * Structure prepended to gmon.out profiling data file. + */ +struct gmonhdr { + u_long lpc; /* base pc address of sample buffer */ + u_long hpc; /* max pc address of sampled buffer */ + int ncnt; /* size of sample buffer (plus this header) */ + int version; /* version number */ + int profrate; /* profiling clock rate */ + int spare[3]; /* reserved */ +}; +#define GMONVERSION 0x00051879 + +/* + * histogram counters are unsigned shorts (according to the kernel). + */ +#define HISTCOUNTER unsigned short + +/* + * fraction of text space to allocate for histogram counters here, 1/2 + */ +#define HISTFRACTION 2 + +/* + * Fraction of text space to allocate for from hash buckets. + * The value of HASHFRACTION is based on the minimum number of bytes + * of separation between two subroutine call points in the object code. + * Given MIN_SUBR_SEPARATION bytes of separation the value of + * HASHFRACTION is calculated as: + * + * HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1); + * + * For example, on the VAX, the shortest two call sequence is: + * + * calls $0,(r0) + * calls $0,(r0) + * + * which is separated by only three bytes, thus HASHFRACTION is + * calculated as: + * + * HASHFRACTION = 3 / (2 * 2 - 1) = 1 + * + * Note that the division above rounds down, thus if MIN_SUBR_FRACTION + * is less than three, this algorithm will not work! + * + * In practice, however, call instructions are rarely at a minimal + * distance. Hence, we will define HASHFRACTION to be 2 across all + * architectures. This saves a reasonable amount of space for + * profiling data structures without (in practice) sacrificing + * any granularity. + */ +#define HASHFRACTION 2 + +/* + * percent of text space to allocate for tostructs with a minimum. + */ +#define ARCDENSITY 2 +#define MINARCS 50 +#define MAXARCS ((1 << (8 * sizeof(HISTCOUNTER))) - 2) + +struct tostruct { + u_long selfpc; + long count; + u_short link; + u_short pad; +}; + +/* + * a raw arc, with pointers to the calling site and + * the called site and a count. + */ +struct rawarc { + u_long raw_frompc; + u_long raw_selfpc; + long raw_count; +}; + +/* + * general rounding functions. + */ +#define ROUNDDOWN(x,y) (((x)/(y))*(y)) +#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) + +/* + * The profiling data structures are housed in this structure. + */ +struct gmonparam { + int state; + u_short *kcount; + u_long kcountsize; + u_short *froms; + u_long fromssize; + struct tostruct *tos; + u_long tossize; + long tolimit; + u_long lowpc; + u_long highpc; + u_long textsize; + u_long hashfraction; +}; +extern struct gmonparam _gmonparam; + +/* + * Possible states of profiling. + */ +#define GMON_PROF_ON 0 +#define GMON_PROF_BUSY 1 +#define GMON_PROF_ERROR 2 +#define GMON_PROF_OFF 3 + +/* + * Sysctl definitions for extracting profiling information from the kernel. + */ +#define GPROF_STATE 0 /* int: profiling enabling variable */ +#define GPROF_COUNT 1 /* struct: profile tick count buffer */ +#define GPROF_FROMS 2 /* struct: from location hash bucket */ +#define GPROF_TOS 3 /* struct: destination/count structure */ +#define GPROF_GMONPARAM 4 /* struct: profiling parameters (see above) */ +#endif /* !_SYS_GMONH_ */ diff --git a/mingw/include/inttypes.h b/mingw/include/inttypes.h new file mode 100644 index 00000000..aff07258 --- /dev/null +++ b/mingw/include/inttypes.h @@ -0,0 +1,278 @@ +/* 7.8 Format conversion of integer types */ + +#ifndef _INTTYPES_H_ +#define _INTTYPES_H_ + +#include <_mingw.h> +#include +#define __need_wchar_t +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + intmax_t quot; + intmax_t rem; + } imaxdiv_t; + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) + +/* 7.8.1 Macros for format specifiers + * + * MS runtime does not yet understand C9x standard "ll" + * length specifier. It appears to treat "ll" as "l". + * The non-standard I64 length specifier causes warning in GCC, + * but understood by MS runtime functions. + */ + +/* fprintf macros for signed types */ +#define PRId8 "d" +#define PRId16 "d" +#define PRId32 "d" +#define PRId64 "I64d" + +#define PRIdLEAST8 "d" +#define PRIdLEAST16 "d" +#define PRIdLEAST32 "d" +#define PRIdLEAST64 "I64d" + +#define PRIdFAST8 "d" +#define PRIdFAST16 "d" +#define PRIdFAST32 "d" +#define PRIdFAST64 "I64d" + +#define PRIdMAX "I64d" +#define PRIdPTR "d" + +#define PRIi8 "i" +#define PRIi16 "i" +#define PRIi32 "i" +#define PRIi64 "I64i" + +#define PRIiLEAST8 "i" +#define PRIiLEAST16 "i" +#define PRIiLEAST32 "i" +#define PRIiLEAST64 "I64i" + +#define PRIiFAST8 "i" +#define PRIiFAST16 "i" +#define PRIiFAST32 "i" +#define PRIiFAST64 "I64i" + +#define PRIiMAX "I64i" +#define PRIiPTR "i" + +#define PRIo8 "o" +#define PRIo16 "o" +#define PRIo32 "o" +#define PRIo64 "I64o" + +#define PRIoLEAST8 "o" +#define PRIoLEAST16 "o" +#define PRIoLEAST32 "o" +#define PRIoLEAST64 "I64o" + +#define PRIoFAST8 "o" +#define PRIoFAST16 "o" +#define PRIoFAST32 "o" +#define PRIoFAST64 "I64o" + +#define PRIoMAX "I64o" + +#define PRIoPTR "o" + +/* fprintf macros for unsigned types */ +#define PRIu8 "u" +#define PRIu16 "u" +#define PRIu32 "u" +#define PRIu64 "I64u" + + +#define PRIuLEAST8 "u" +#define PRIuLEAST16 "u" +#define PRIuLEAST32 "u" +#define PRIuLEAST64 "I64u" + +#define PRIuFAST8 "u" +#define PRIuFAST16 "u" +#define PRIuFAST32 "u" +#define PRIuFAST64 "I64u" + +#define PRIuMAX "I64u" +#define PRIuPTR "u" + +#define PRIx8 "x" +#define PRIx16 "x" +#define PRIx32 "x" +#define PRIx64 "I64x" + +#define PRIxLEAST8 "x" +#define PRIxLEAST16 "x" +#define PRIxLEAST32 "x" +#define PRIxLEAST64 "I64x" + +#define PRIxFAST8 "x" +#define PRIxFAST16 "x" +#define PRIxFAST32 "x" +#define PRIxFAST64 "I64x" + +#define PRIxMAX "I64x" +#define PRIxPTR "x" + +#define PRIX8 "X" +#define PRIX16 "X" +#define PRIX32 "X" +#define PRIX64 "I64X" + +#define PRIXLEAST8 "X" +#define PRIXLEAST16 "X" +#define PRIXLEAST32 "X" +#define PRIXLEAST64 "I64X" + +#define PRIXFAST8 "X" +#define PRIXFAST16 "X" +#define PRIXFAST32 "X" +#define PRIXFAST64 "I64X" + +#define PRIXMAX "I64X" +#define PRIXPTR "X" + +/* + * fscanf macros for signed int types + * NOTE: if 32-bit int is used for int_fast8_t and int_fast16_t + * (see stdint.h, 7.18.1.3), FAST8 and FAST16 should have + * no length identifiers + */ + +#define SCNd16 "hd" +#define SCNd32 "d" +#define SCNd64 "I64d" + +#define SCNdLEAST16 "hd" +#define SCNdLEAST32 "d" +#define SCNdLEAST64 "I64d" + +#define SCNdFAST16 "hd" +#define SCNdFAST32 "d" +#define SCNdFAST64 "I64d" + +#define SCNdMAX "I64d" +#define SCNdPTR "d" + +#define SCNi16 "hi" +#define SCNi32 "i" +#define SCNi64 "I64i" + +#define SCNiLEAST16 "hi" +#define SCNiLEAST32 "i" +#define SCNiLEAST64 "I64i" + +#define SCNiFAST16 "hi" +#define SCNiFAST32 "i" +#define SCNiFAST64 "I64i" + +#define SCNiMAX "I64i" +#define SCNiPTR "i" + +#define SCNo16 "ho" +#define SCNo32 "o" +#define SCNo64 "I64o" + +#define SCNoLEAST16 "ho" +#define SCNoLEAST32 "o" +#define SCNoLEAST64 "I64o" + +#define SCNoFAST16 "ho" +#define SCNoFAST32 "o" +#define SCNoFAST64 "I64o" + +#define SCNoMAX "I64o" +#define SCNoPTR "o" + +#define SCNx16 "hx" +#define SCNx32 "x" +#define SCNx64 "I64x" + +#define SCNxLEAST16 "hx" +#define SCNxLEAST32 "x" +#define SCNxLEAST64 "I64x" + +#define SCNxFAST16 "hx" +#define SCNxFAST32 "x" +#define SCNxFAST64 "I64x" + +#define SCNxMAX "I64x" +#define SCNxPTR "x" + + +/* fscanf macros for unsigned int types */ + +#define SCNu16 "hu" +#define SCNu32 "u" +#define SCNu64 "I64u" + +#define SCNuLEAST16 "hu" +#define SCNuLEAST32 "u" +#define SCNuLEAST64 "I64u" + +#define SCNuFAST16 "hu" +#define SCNuFAST32 "u" +#define SCNuFAST64 "I64u" + +#define SCNuMAX "I64u" +#define SCNuPTR "u" + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +/* + * no length modifier for char types prior to C9x + * MS runtime scanf appears to treat "hh" as "h" + */ + +/* signed char */ +#define SCNd8 "hhd" +#define SCNdLEAST8 "hhd" +#define SCNdFAST8 "hhd" + +#define SCNi8 "hhi" +#define SCNiLEAST8 "hhi" +#define SCNiFAST8 "hhi" + +#define SCNo8 "hho" +#define SCNoLEAST8 "hho" +#define SCNoFAST8 "hho" + +#define SCNx8 "hhx" +#define SCNxLEAST8 "hhx" +#define SCNxFAST8 "hhx" + +/* unsigned char */ +#define SCNu8 "hhu" +#define SCNuLEAST8 "hhu" +#define SCNuFAST8 "hhu" +#endif /* __STDC_VERSION__ >= 199901 */ + +#endif /* !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) */ + +__CRT_INLINE intmax_t __cdecl __MINGW_NOTHROW imaxabs (intmax_t j) + {return (j >= 0 ? j : -j);} +imaxdiv_t __cdecl __MINGW_NOTHROW imaxdiv (intmax_t numer, intmax_t denom); + +/* 7.8.2 Conversion functions for greatest-width integer types */ + +intmax_t __cdecl __MINGW_NOTHROW strtoimax (const char* __restrict__ nptr, + char** __restrict__ endptr, int base); +uintmax_t __cdecl __MINGW_NOTHROW strtoumax (const char* __restrict__ nptr, + char** __restrict__ endptr, int base); + +intmax_t __cdecl __MINGW_NOTHROW wcstoimax (const wchar_t* __restrict__ nptr, + wchar_t** __restrict__ endptr, int base); +uintmax_t __cdecl __MINGW_NOTHROW wcstoumax (const wchar_t* __restrict__ nptr, + wchar_t** __restrict__ endptr, int base); + +#ifdef __cplusplus +} +#endif + +#endif /* ndef _INTTYPES_H */ diff --git a/mingw/include/io.h b/mingw/include/io.h index cfab0988..0d3c1104 100644 --- a/mingw/include/io.h +++ b/mingw/include/io.h @@ -1,4 +1,4 @@ -/* +/* * io.h * This file has no copyright assigned and is placed in the Public Domain. * This file is a part of the mingw-runtime package. @@ -18,7 +18,6 @@ * an inclusion of sys/types.h */ #include /* To get time_t. */ -#include /* For intptr_t. */ /* * Attributes of files as returned by _findfirst et al. @@ -34,6 +33,15 @@ #ifndef RC_INVOKED +#ifndef _INTPTR_T_DEFINED +#define _INTPTR_T_DEFINED +#ifdef _WIN64 + typedef __int64 intptr_t; +#else + typedef int intptr_t; +#endif +#endif + #ifndef _FSIZE_T_DEFINED typedef unsigned long _fsize_t; #define _FSIZE_T_DEFINED @@ -42,7 +50,7 @@ typedef unsigned long _fsize_t; /* * The maximum length of a file name. You should use GetVolumeInformation * instead of this constant. But hey, this works. - * Also defined in stdio.h. + * Also defined in stdio.h. */ #ifndef FILENAME_MAX #define FILENAME_MAX (260) @@ -71,14 +79,17 @@ struct _finddatai64_t { char name[FILENAME_MAX]; }; +#if __MSVCRT_VERSION__ >= 0x0601 struct __finddata64_t { unsigned attrib; - __time64_t time_create; - __time64_t time_access; + __time64_t time_create; + __time64_t time_access; __time64_t time_write; - _fsize_t size; +/* 8 bytes are returned so it can't be _fsize_t */ + __int64 size; char name[FILENAME_MAX]; }; +#endif #ifndef _WFINDDATA_T_DEFINED struct _wfinddata_t { @@ -99,14 +110,17 @@ struct _wfinddatai64_t { wchar_t name[FILENAME_MAX]; }; +#if __MSVCRT_VERSION__ >= 0x0601 struct __wfinddata64_t { unsigned attrib; - __time64_t time_create; + __time64_t time_create; __time64_t time_access; __time64_t time_write; - _fsize_t size; +/* 8 bytes are returned so it can't be _fsize_t */ + __int64 size; wchar_t name[FILENAME_MAX]; }; +#endif #define _WFINDDATA_T_DEFINED #endif @@ -122,31 +136,31 @@ extern "C" { * and 0 if a match was found. Call _findclose when you are finished. */ /* FIXME: Should these all use intptr_t, as per recent MSDN docs? */ -_CRTIMP long __cdecl _findfirst (const char*, struct _finddata_t*); -_CRTIMP int __cdecl _findnext (long, struct _finddata_t*); -_CRTIMP int __cdecl _findclose (long); +_CRTIMP long __cdecl __MINGW_NOTHROW _findfirst (const char*, struct _finddata_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _findnext (long, struct _finddata_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _findclose (long); -_CRTIMP int __cdecl _chdir (const char*); -_CRTIMP char* __cdecl _getcwd (char*, int); -_CRTIMP int __cdecl _mkdir (const char*); -_CRTIMP char* __cdecl _mktemp (char*); -_CRTIMP int __cdecl _rmdir (const char*); -_CRTIMP int __cdecl _chmod (const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _chdir (const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _getcwd (char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _mkdir (const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _mktemp (char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _rmdir (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _chmod (const char*, int); #ifdef __MSVCRT__ -_CRTIMP __int64 __cdecl _filelengthi64(int); -_CRTIMP long __cdecl _findfirsti64(const char*, struct _finddatai64_t*); -_CRTIMP int __cdecl _findnexti64(long, struct _finddatai64_t*); -_CRTIMP __int64 __cdecl _lseeki64(int, __int64, int); -_CRTIMP __int64 __cdecl _telli64(int); +_CRTIMP __int64 __cdecl __MINGW_NOTHROW _filelengthi64(int); +_CRTIMP long __cdecl __MINGW_NOTHROW _findfirsti64(const char*, struct _finddatai64_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _findnexti64(long, struct _finddatai64_t*); +_CRTIMP __int64 __cdecl __MINGW_NOTHROW _lseeki64(int, __int64, int); +_CRTIMP __int64 __cdecl __MINGW_NOTHROW _telli64(int); /* These require newer versions of msvcrt.dll (6.1 or higher). */ #if __MSVCRT_VERSION__ >= 0x0601 -_CRTIMP intptr_t __cdecl _findfirst64(const char*, struct __finddata64_t*); -_CRTIMP intptr_t __cdecl _findnext64(intptr_t, struct __finddata64_t*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _findfirst64(const char*, struct __finddata64_t*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _findnext64(intptr_t, struct __finddata64_t*); #endif /* __MSVCRT_VERSION__ >= 0x0601 */ - #ifndef __NO_MINGW_LFS -__CRT_INLINE off64_t lseek64 (int fd, off64_t offset, int whence) +__CRT_INLINE off64_t lseek64 (int, off64_t, int); +__CRT_INLINE off64_t lseek64 (int fd, off64_t offset, int whence) { return _lseeki64(fd, (__int64) offset, whence); } @@ -157,12 +171,12 @@ __CRT_INLINE off64_t lseek64 (int fd, off64_t offset, int whence) #ifndef _NO_OLDNAMES #ifndef _UWIN -_CRTIMP int __cdecl chdir (const char*); -_CRTIMP char* __cdecl getcwd (char*, int); -_CRTIMP int __cdecl mkdir (const char*); -_CRTIMP char* __cdecl mktemp (char*); -_CRTIMP int __cdecl rmdir (const char*); -_CRTIMP int __cdecl chmod (const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW chdir (const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW getcwd (char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW mkdir (const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW mktemp (char*); +_CRTIMP int __cdecl __MINGW_NOTHROW rmdir (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW chmod (const char*, int); #endif /* _UWIN */ #endif /* Not _NO_OLDNAMES */ @@ -192,20 +206,20 @@ _CRTIMP int __cdecl chmod (const char*, int); extern "C" { #endif -_CRTIMP int __cdecl _access (const char*, int); -_CRTIMP int __cdecl _chsize (int, long); -_CRTIMP int __cdecl _close (int); -_CRTIMP int __cdecl _commit(int); +_CRTIMP int __cdecl __MINGW_NOTHROW _access (const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _chsize (int, long); +_CRTIMP int __cdecl __MINGW_NOTHROW _close (int); +_CRTIMP int __cdecl __MINGW_NOTHROW _commit(int); /* NOTE: The only significant bit in unPermissions appears to be bit 7 (0x80), * the "owner write permission" bit (on FAT). */ -_CRTIMP int __cdecl _creat (const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _creat (const char*, int); -_CRTIMP int __cdecl _dup (int); -_CRTIMP int __cdecl _dup2 (int, int); -_CRTIMP long __cdecl _filelength (int); -_CRTIMP long __cdecl _get_osfhandle (int); -_CRTIMP int __cdecl _isatty (int); +_CRTIMP int __cdecl __MINGW_NOTHROW _dup (int); +_CRTIMP int __cdecl __MINGW_NOTHROW _dup2 (int, int); +_CRTIMP long __cdecl __MINGW_NOTHROW _filelength (int); +_CRTIMP long __cdecl __MINGW_NOTHROW _get_osfhandle (int); +_CRTIMP int __cdecl __MINGW_NOTHROW _isatty (int); /* In a very odd turn of events this function is excluded from those * files which define _STREAM_COMPAT. This is required in order to @@ -213,54 +227,54 @@ _CRTIMP int __cdecl _isatty (int); * line 107. Actually I might just be able to change the name of * the enum member in streambuf.h... we'll see. TODO */ #ifndef _STREAM_COMPAT -_CRTIMP int __cdecl _eof (int); +_CRTIMP int __cdecl __MINGW_NOTHROW _eof (int); #endif /* LK_... locking commands defined in sys/locking.h. */ -_CRTIMP int __cdecl _locking (int, int, long); +_CRTIMP int __cdecl __MINGW_NOTHROW _locking (int, int, long); -_CRTIMP long __cdecl _lseek (int, long, int); +_CRTIMP long __cdecl __MINGW_NOTHROW _lseek (int, long, int); /* Optional third argument is unsigned unPermissions. */ -_CRTIMP int __cdecl _open (const char*, int, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW _open (const char*, int, ...); -_CRTIMP int __cdecl _open_osfhandle (long, int); -_CRTIMP int __cdecl _pipe (int *, unsigned int, int); -_CRTIMP int __cdecl _read (int, void*, unsigned int); -_CRTIMP int __cdecl _setmode (int, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _open_osfhandle (long, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _pipe (int *, unsigned int, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _read (int, void*, unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _setmode (int, int); /* MS puts remove & rename (but not wide versions) in io.h as well as in stdio.h. */ -_CRTIMP int __cdecl remove (const char*); -_CRTIMP int __cdecl rename (const char*, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW remove (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW rename (const char*, const char*); /* SH_... flags for nShFlags defined in share.h * Optional fourth argument is unsigned unPermissions */ -_CRTIMP int __cdecl _sopen (const char*, int, int, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW _sopen (const char*, int, int, ...); -_CRTIMP long __cdecl _tell (int); +_CRTIMP long __cdecl __MINGW_NOTHROW _tell (int); /* Should umask be in sys/stat.h and/or sys/types.h instead? */ -_CRTIMP int __cdecl _umask (int); -_CRTIMP int __cdecl _unlink (const char*); -_CRTIMP int __cdecl _write (int, const void*, unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _umask (int); +_CRTIMP int __cdecl __MINGW_NOTHROW _unlink (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _write (int, const void*, unsigned int); /* Wide character versions. Also declared in wchar.h. */ /* Not in crtdll.dll */ #if !defined (_WIO_DEFINED) #if defined (__MSVCRT__) -_CRTIMP int __cdecl _waccess(const wchar_t*, int); -_CRTIMP int __cdecl _wchmod(const wchar_t*, int); -_CRTIMP int __cdecl _wcreat(const wchar_t*, int); -_CRTIMP long __cdecl _wfindfirst(const wchar_t*, struct _wfinddata_t*); -_CRTIMP int __cdecl _wfindnext(long, struct _wfinddata_t *); -_CRTIMP int __cdecl _wunlink(const wchar_t*); -_CRTIMP int __cdecl _wopen(const wchar_t*, int, ...); -_CRTIMP int __cdecl _wsopen(const wchar_t*, int, int, ...); -_CRTIMP wchar_t * __cdecl _wmktemp(wchar_t*); -_CRTIMP long __cdecl _wfindfirsti64(const wchar_t*, struct _wfinddatai64_t*); -_CRTIMP int __cdecl _wfindnexti64(long, struct _wfinddatai64_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _waccess(const wchar_t*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _wchmod(const wchar_t*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcreat(const wchar_t*, int); +_CRTIMP long __cdecl __MINGW_NOTHROW _wfindfirst(const wchar_t*, struct _wfinddata_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wfindnext(long, struct _wfinddata_t *); +_CRTIMP int __cdecl __MINGW_NOTHROW _wunlink(const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wopen(const wchar_t*, int, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW _wsopen(const wchar_t*, int, int, ...); +_CRTIMP wchar_t * __cdecl __MINGW_NOTHROW _wmktemp(wchar_t*); +_CRTIMP long __cdecl __MINGW_NOTHROW _wfindfirsti64(const wchar_t*, struct _wfinddatai64_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wfindnexti64(long, struct _wfinddatai64_t*); #if __MSVCRT_VERSION__ >= 0x0601 -_CRTIMP intptr_t __cdecl _wfindfirst64(const wchar_t*, struct __wfinddata64_t*); -_CRTIMP intptr_t __cdecl _wfindnext64(intptr_t, struct __wfinddata64_t*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wfindfirst64(const wchar_t*, struct __wfinddata64_t*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wfindnext64(intptr_t, struct __wfinddata64_t*); #endif #endif /* defined (__MSVCRT__) */ #define _WIO_DEFINED @@ -273,24 +287,24 @@ _CRTIMP intptr_t __cdecl _wfindnext64(intptr_t, struct __wfinddata64_t*); */ #ifndef _UWIN -_CRTIMP int __cdecl access (const char*, int); -_CRTIMP int __cdecl chsize (int, long ); -_CRTIMP int __cdecl close (int); -_CRTIMP int __cdecl creat (const char*, int); -_CRTIMP int __cdecl dup (int); -_CRTIMP int __cdecl dup2 (int, int); -_CRTIMP int __cdecl eof (int); -_CRTIMP long __cdecl filelength (int); -_CRTIMP int __cdecl isatty (int); -_CRTIMP long __cdecl lseek (int, long, int); -_CRTIMP int __cdecl open (const char*, int, ...); -_CRTIMP int __cdecl read (int, void*, unsigned int); -_CRTIMP int __cdecl setmode (int, int); -_CRTIMP int __cdecl sopen (const char*, int, int, ...); -_CRTIMP long __cdecl tell (int); -_CRTIMP int __cdecl umask (int); -_CRTIMP int __cdecl unlink (const char*); -_CRTIMP int __cdecl write (int, const void*, unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW access (const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW chsize (int, long ); +_CRTIMP int __cdecl __MINGW_NOTHROW close (int); +_CRTIMP int __cdecl __MINGW_NOTHROW creat (const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW dup (int); +_CRTIMP int __cdecl __MINGW_NOTHROW dup2 (int, int); +_CRTIMP int __cdecl __MINGW_NOTHROW eof (int); +_CRTIMP long __cdecl __MINGW_NOTHROW filelength (int); +_CRTIMP int __cdecl __MINGW_NOTHROW isatty (int); +_CRTIMP long __cdecl __MINGW_NOTHROW lseek (int, long, int); +_CRTIMP int __cdecl __MINGW_NOTHROW open (const char*, int, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW read (int, void*, unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW setmode (int, int); +_CRTIMP int __cdecl __MINGW_NOTHROW sopen (const char*, int, int, ...); +_CRTIMP long __cdecl __MINGW_NOTHROW tell (int); +_CRTIMP int __cdecl __MINGW_NOTHROW umask (int); +_CRTIMP int __cdecl __MINGW_NOTHROW unlink (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW write (int, const void*, unsigned int); #endif /* _UWIN */ #ifdef __USE_MINGW_ACCESS diff --git a/mingw/include/libgen.h b/mingw/include/libgen.h new file mode 100644 index 00000000..db89e1e1 --- /dev/null +++ b/mingw/include/libgen.h @@ -0,0 +1,31 @@ +#ifndef _LIBGEN_H_ +/* + * libgen.h + * + * $Id: libgen.h,v 1.2 2007/06/23 07:34:15 dannysmith Exp $ + * + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Functions for splitting pathnames into dirname and basename components. + * + */ +#define _LIBGEN_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#ifdef __cplusplus +extern "C" { +#endif + +extern __cdecl __MINGW_NOTHROW char *basename (char *); +extern __cdecl __MINGW_NOTHROW char *dirname (char *); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBGEN_H_: end of file */ + diff --git a/mingw/include/locale.h b/mingw/include/locale.h new file mode 100644 index 00000000..ee26db32 --- /dev/null +++ b/mingw/include/locale.h @@ -0,0 +1,88 @@ +/* + * locale.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Functions and types for localization (ie. changing the appearance of + * output based on the standards of a certain country). + * + */ + +#ifndef _LOCALE_H_ +#define _LOCALE_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +/* + * NOTE: I have tried to test this, but I am limited by my knowledge of + * locale issues. The structure does not bomb if you look at the + * values, and 'decimal_point' even seems to be correct. But the + * rest of the values are, by default, not particularly useful + * (read meaningless and not related to the international settings + * of the system). + */ + +#define LC_ALL 0 +#define LC_COLLATE 1 +#define LC_CTYPE 2 +#define LC_MONETARY 3 +#define LC_NUMERIC 4 +#define LC_TIME 5 +#define LC_MIN LC_ALL +#define LC_MAX LC_TIME + +#ifndef RC_INVOKED + +/* According to C89 std, NULL is defined in locale.h too. */ +#define __need_NULL +#include + +/* + * The structure returned by 'localeconv'. + */ +struct lconv +{ + char* decimal_point; + char* thousands_sep; + char* grouping; + char* int_curr_symbol; + char* currency_symbol; + char* mon_decimal_point; + char* mon_thousands_sep; + char* mon_grouping; + char* positive_sign; + char* negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +_CRTIMP char* __cdecl __MINGW_NOTHROW setlocale (int, const char*); +_CRTIMP struct lconv* __cdecl __MINGW_NOTHROW localeconv (void); + +#ifndef _WLOCALE_DEFINED /* also declared in wchar.h */ +# define __need_wchar_t +# include + _CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wsetlocale(int, const wchar_t*); +# define _WLOCALE_DEFINED +#endif /* ndef _WLOCALE_DEFINED */ + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _LOCALE_H_ */ + diff --git a/mingw/include/malloc.h b/mingw/include/malloc.h new file mode 100644 index 00000000..5931b5e4 --- /dev/null +++ b/mingw/include/malloc.h @@ -0,0 +1,103 @@ +/* + * malloc.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Support for programs which want to use malloc.h to get memory management + * functions. Unless you absolutely need some of these functions and they are + * not in the ANSI headers you should use the ANSI standard header files + * instead. + * + */ + +#ifndef _MALLOC_H_ +#define _MALLOC_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#include + +#ifndef RC_INVOKED + +/* + * The structure used to walk through the heap with _heapwalk. + */ +typedef struct _heapinfo +{ + int* _pentry; + size_t _size; + int _useflag; +} _HEAPINFO; + +/* Values for _heapinfo.useflag */ +#define _FREEENTRY 0 +#define _USEDENTRY 1 + +/* Return codes for _heapwalk() */ +#define _HEAPEMPTY (-1) +#define _HEAPOK (-2) +#define _HEAPBADBEGIN (-3) +#define _HEAPBADNODE (-4) +#define _HEAPEND (-5) +#define _HEAPBADPTR (-6) + +/* maximum size of a user request for memory */ +#define _HEAP_MAXREQ 0xFFFFFFE0 + +#ifdef __cplusplus +extern "C" { +#endif +/* + The _heap* memory allocation functions are supported on NT + but not W9x. On latter, they always set errno to ENOSYS. +*/ +_CRTIMP int __cdecl __MINGW_NOTHROW _heapwalk (_HEAPINFO*); +#ifdef __GNUC__ +#define _alloca(x) __builtin_alloca((x)) +#endif + +#ifndef _NO_OLDNAMES +_CRTIMP int __cdecl __MINGW_NOTHROW heapwalk (_HEAPINFO*); +#ifdef __GNUC__ +#define alloca(x) __builtin_alloca((x)) +#endif +#endif /* Not _NO_OLDNAMES */ + +_CRTIMP int __cdecl __MINGW_NOTHROW _heapchk (void); /* Verify heap integrety. */ +_CRTIMP int __cdecl __MINGW_NOTHROW _heapmin (void); /* Return unused heap to the OS. */ +_CRTIMP int __cdecl __MINGW_NOTHROW _heapset (unsigned int); + +_CRTIMP size_t __cdecl __MINGW_NOTHROW _msize (void*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW _get_sbh_threshold (void); +_CRTIMP int __cdecl __MINGW_NOTHROW _set_sbh_threshold (size_t); +_CRTIMP void* __cdecl __MINGW_NOTHROW _expand (void*, size_t); + +/* These require msvcr70.dll or higher. */ +#if __MSVCRT_VERSION__ >= 0x0700 +_CRTIMP void * __cdecl __MINGW_NOTHROW _aligned_offset_malloc(size_t, size_t, size_t); +_CRTIMP void * __cdecl __MINGW_NOTHROW _aligned_offset_realloc(void*, size_t, size_t, size_t); +_CRTIMP void * __cdecl __MINGW_NOTHROW _aligned_offset_recalloc(void*, size_t, size_t, size_t, size_t); + +_CRTIMP void * __cdecl __MINGW_NOTHROW _aligned_malloc (size_t, size_t); +_CRTIMP void * __cdecl __MINGW_NOTHROW _aligned_realloc (void*, size_t, size_t); +_CRTIMP void* __cdecl __MINGW_NOTHROW _aligned_recalloc(void*, size_t, size_t, size_t); +_CRTIMP void __cdecl __MINGW_NOTHROW _aligned_free (void*); +#endif /* __MSVCRT_VERSION__ >= 0x0700 */ + +/* These require libmingwex.a. */ +void * __cdecl __MINGW_NOTHROW __mingw_aligned_offset_malloc (size_t, size_t, size_t); +void * __cdecl __MINGW_NOTHROW __mingw_aligned_offset_realloc (void*, size_t, size_t, size_t); + +void * __cdecl __MINGW_NOTHROW __mingw_aligned_malloc (size_t, size_t); +void * __cdecl __MINGW_NOTHROW __mingw_aligned_realloc (void*, size_t, size_t); +void __cdecl __MINGW_NOTHROW __mingw_aligned_free (void*); + +#ifdef __cplusplus +} +#endif + +#endif /* RC_INVOKED */ + +#endif /* Not _MALLOC_H_ */ diff --git a/mingw/include/math.h b/mingw/include/math.h new file mode 100644 index 00000000..0577d0cc --- /dev/null +++ b/mingw/include/math.h @@ -0,0 +1,873 @@ +/* + * math.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Mathematical functions. + * + */ + + +#ifndef _MATH_H_ +#define _MATH_H_ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +/* All the headers include this file. */ +#include <_mingw.h> + +/* + * Types for the _exception structure. + */ + +#define _DOMAIN 1 /* domain error in argument */ +#define _SING 2 /* singularity */ +#define _OVERFLOW 3 /* range overflow */ +#define _UNDERFLOW 4 /* range underflow */ +#define _TLOSS 5 /* total loss of precision */ +#define _PLOSS 6 /* partial loss of precision */ + +/* + * Exception types with non-ANSI names for compatibility. + */ + +#ifndef __STRICT_ANSI__ +#ifndef _NO_OLDNAMES + +#define DOMAIN _DOMAIN +#define SING _SING +#define OVERFLOW _OVERFLOW +#define UNDERFLOW _UNDERFLOW +#define TLOSS _TLOSS +#define PLOSS _PLOSS + +#endif /* Not _NO_OLDNAMES */ +#endif /* Not __STRICT_ANSI__ */ + + +/* Traditional/XOPEN math constants (double precison) */ +#ifndef __STRICT_ANSI__ +#define M_E 2.7182818284590452354 +#define M_LOG2E 1.4426950408889634074 +#define M_LOG10E 0.43429448190325182765 +#define M_LN2 0.69314718055994530942 +#define M_LN10 2.30258509299404568402 +#define M_PI 3.14159265358979323846 +#define M_PI_2 1.57079632679489661923 +#define M_PI_4 0.78539816339744830962 +#define M_1_PI 0.31830988618379067154 +#define M_2_PI 0.63661977236758134308 +#define M_2_SQRTPI 1.12837916709551257390 +#define M_SQRT2 1.41421356237309504880 +#define M_SQRT1_2 0.70710678118654752440 +#endif + +/* These are also defined in Mingw float.h; needed here as well to work + around GCC build issues. */ +#ifndef __STRICT_ANSI__ +#ifndef __MINGW_FPCLASS_DEFINED +#define __MINGW_FPCLASS_DEFINED 1 +/* IEEE 754 classication */ +#define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */ +#define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */ +#define _FPCLASS_NINF 0x0004 /* Negative Infinity */ +#define _FPCLASS_NN 0x0008 /* Negative Normal */ +#define _FPCLASS_ND 0x0010 /* Negative Denormal */ +#define _FPCLASS_NZ 0x0020 /* Negative Zero */ +#define _FPCLASS_PZ 0x0040 /* Positive Zero */ +#define _FPCLASS_PD 0x0080 /* Positive Denormal */ +#define _FPCLASS_PN 0x0100 /* Positive Normal */ +#define _FPCLASS_PINF 0x0200 /* Positive Infinity */ +#endif /* __MINGW_FPCLASS_DEFINED */ +#endif /* Not __STRICT_ANSI__ */ + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * HUGE_VAL is returned by strtod when the value would overflow the + * representation of 'double'. There are other uses as well. + * + * __imp__HUGE is a pointer to the actual variable _HUGE in + * MSVCRT.DLL. If we used _HUGE directly we would get a pointer + * to a thunk function. + * + * NOTE: The CRTDLL version uses _HUGE_dll instead. + */ + +#if __MINGW_GNUC_PREREQ(3, 3) +#define HUGE_VAL __builtin_huge_val() +#else + +#ifndef __DECLSPEC_SUPPORTED + +#ifdef __MSVCRT__ +extern double* _imp___HUGE; +#define HUGE_VAL (*_imp___HUGE) +#else +/* CRTDLL */ +extern double* _imp___HUGE_dll; +#define HUGE_VAL (*_imp___HUGE_dll) +#endif + +#else /* __DECLSPEC_SUPPORTED */ + +#ifdef __MSVCRT__ +__MINGW_IMPORT double _HUGE; +#define HUGE_VAL _HUGE +#else +/* CRTDLL */ +__MINGW_IMPORT double _HUGE_dll; +#define HUGE_VAL _HUGE_dll +#endif + +#endif /* __DECLSPEC_SUPPORTED */ +#endif /* __MINGW_GNUC_PREREQ(3, 3) */ + + +struct _exception +{ + int type; + char *name; + double arg1; + double arg2; + double retval; +}; + +_CRTIMP double __cdecl sin (double); +_CRTIMP double __cdecl cos (double); +_CRTIMP double __cdecl tan (double); +_CRTIMP double __cdecl sinh (double); +_CRTIMP double __cdecl cosh (double); +_CRTIMP double __cdecl tanh (double); +_CRTIMP double __cdecl asin (double); +_CRTIMP double __cdecl acos (double); +_CRTIMP double __cdecl atan (double); +_CRTIMP double __cdecl atan2 (double, double); +_CRTIMP double __cdecl exp (double); +_CRTIMP double __cdecl log (double); +_CRTIMP double __cdecl log10 (double); +_CRTIMP double __cdecl pow (double, double); +_CRTIMP double __cdecl sqrt (double); +_CRTIMP double __cdecl ceil (double); +_CRTIMP double __cdecl floor (double); +_CRTIMP double __cdecl fabs (double); +_CRTIMP double __cdecl ldexp (double, int); +_CRTIMP double __cdecl frexp (double, int*); +_CRTIMP double __cdecl modf (double, double*); +_CRTIMP double __cdecl fmod (double, double); + +/* Excess precision when using a 64-bit mantissa for FPU math ops can + cause unexpected results with some of the MSVCRT math functions. For + example, unless the function return value is stored (truncating to + 53-bit mantissa), calls to pow with both x and y as integral values + sometimes produce a non-integral result. + One workaround is to reset the FPU env to 53-bit mantissa + by a call to fesetenv (FE_PC53_ENV). Amother is to force storage + of the return value of individual math functions using wrappers. + NB, using these wrappers will disable builtin math functions and + hence disable the folding of function results at compile time when + arguments are constant. */ + +#if 0 +#define __DEFINE_FLOAT_STORE_MATHFN_D1(fn1) \ +static __inline__ double \ +__float_store_ ## fn1 (double x) \ +{ \ + __volatile__ double res = (fn1) (x); \ + return res; \ +} + +#define __DEFINE_FLOAT_STORE_MATHFN_D2(fn2) \ +static __inline__ double \ +__float_store_ ## fn2 (double x, double y) \ +{ \ + __volatile__ double res = (fn2) (x, y); \ + return res; \ +} +#endif + +/* For example, here is how to force the result of the pow function + to be stored: */ +#if 0 +#undef pow +/* Define the ___float_store_pow function and use it instead of pow(). */ +__DEFINE_FLOAT_STORE_MATHFN_D2 (pow) +#define pow __float_store_pow +#endif + +#ifndef __STRICT_ANSI__ + +/* Complex number (for _cabs). This is the MS version. The ISO + C99 counterpart _Complex is an intrinsic type in GCC and + 'complex' is defined as a macro. See complex.h */ +struct _complex +{ + double x; /* Real part */ + double y; /* Imaginary part */ +}; + +_CRTIMP double __cdecl _cabs (struct _complex); + +_CRTIMP double __cdecl _hypot (double, double); +_CRTIMP double __cdecl _j0 (double); +_CRTIMP double __cdecl _j1 (double); +_CRTIMP double __cdecl _jn (int, double); +_CRTIMP double __cdecl _y0 (double); +_CRTIMP double __cdecl _y1 (double); +_CRTIMP double __cdecl _yn (int, double); +_CRTIMP int __cdecl _matherr (struct _exception *); + +/* These are also declared in Mingw float.h; needed here as well to work + around GCC build issues. */ +/* BEGIN FLOAT.H COPY */ +/* + * IEEE recommended functions + */ + +_CRTIMP double __cdecl _chgsign (double); +_CRTIMP double __cdecl _copysign (double, double); +_CRTIMP double __cdecl _logb (double); +_CRTIMP double __cdecl _nextafter (double, double); +_CRTIMP double __cdecl _scalb (double, long); + +_CRTIMP int __cdecl _finite (double); +_CRTIMP int __cdecl _fpclass (double); +_CRTIMP int __cdecl _isnan (double); + +/* END FLOAT.H COPY */ + + +/* + * Non-underscored versions of non-ANSI functions. + * These reside in liboldnames.a. + */ + +#if !defined (_NO_OLDNAMES) + +_CRTIMP double __cdecl j0 (double); +_CRTIMP double __cdecl j1 (double); +_CRTIMP double __cdecl jn (int, double); +_CRTIMP double __cdecl y0 (double); +_CRTIMP double __cdecl y1 (double); +_CRTIMP double __cdecl yn (int, double); + +_CRTIMP double __cdecl chgsign (double); +/* + * scalb() is a GCC built-in. + * Exclude this _scalb() stub; the semantics are incompatible + * with the built-in implementation. + * +_CRTIMP double __cdecl scalb (double, long); + * + */ +_CRTIMP int __cdecl finite (double); +_CRTIMP int __cdecl fpclass (double); + +#define FP_SNAN _FPCLASS_SNAN +#define FP_QNAN _FPCLASS_QNAN +#define FP_NINF _FPCLASS_NINF +#define FP_PINF _FPCLASS_PINF +#define FP_NDENORM _FPCLASS_ND +#define FP_PDENORM _FPCLASS_PD +#define FP_NZERO _FPCLASS_NZ +#define FP_PZERO _FPCLASS_PZ +#define FP_NNORM _FPCLASS_NN +#define FP_PNORM _FPCLASS_PN + +#endif /* Not _NO_OLDNAMES */ + +/* This require msvcr70.dll or higher. */ +#if __MSVCRT_VERSION__ >= 0x0700 +_CRTIMP int __cdecl _set_SSE2_enable (int); +#endif /* __MSVCRT_VERSION__ >= 0x0700 */ + + +#endif /* __STRICT_ANSI__ */ + + +#ifndef __NO_ISOCEXT +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ + || !defined __STRICT_ANSI__ || defined __cplusplus + +#if __MINGW_GNUC_PREREQ(3, 3) +#define HUGE_VALF __builtin_huge_valf() +#define HUGE_VALL __builtin_huge_vall() +#define INFINITY __builtin_inf() +#define NAN __builtin_nan("") +#else +extern const float __INFF; +#define HUGE_VALF __INFF +extern const long double __INFL; +#define HUGE_VALL __INFL +#define INFINITY HUGE_VALF +extern const double __QNAN; +#define NAN __QNAN +#endif /* __MINGW_GNUC_PREREQ(3, 3) */ + +/* Use the compiler's builtin define for FLT_EVAL_METHOD to + set float_t and double_t. */ +#if defined(__FLT_EVAL_METHOD__) +# if ( __FLT_EVAL_METHOD__== 0) +typedef float float_t; +typedef double double_t; +# elif (__FLT_EVAL_METHOD__ == 1) +typedef double float_t; +typedef double double_t; +# elif (__FLT_EVAL_METHOD__ == 2) +typedef long double float_t; +typedef long double double_t; +#endif +#else /* ix87 FPU default */ +typedef long double float_t; +typedef long double double_t; +#endif + +/* 7.12.3.1 */ +/* + Return values for fpclassify. + These are based on Intel x87 fpu condition codes + in the high byte of status word and differ from + the return values for MS IEEE 754 extension _fpclass() +*/ +#define FP_NAN 0x0100 +#define FP_NORMAL 0x0400 +#define FP_INFINITE (FP_NAN | FP_NORMAL) +#define FP_ZERO 0x4000 +#define FP_SUBNORMAL (FP_NORMAL | FP_ZERO) +/* 0x0200 is signbit mask */ + + +/* + We can't inline float or double, because we want to ensure truncation + to semantic type before classification. + (A normal long double value might become subnormal when + converted to double, and zero when converted to float.) +*/ + +extern int __cdecl __fpclassifyf (float); +extern int __cdecl __fpclassify (double); + +__CRT_INLINE int __cdecl __fpclassifyl (long double x){ + unsigned short sw; + __asm__ ("fxam; fstsw %%ax;" : "=a" (sw): "t" (x)); + return sw & (FP_NAN | FP_NORMAL | FP_ZERO ); +} + +#define fpclassify(x) (sizeof (x) == sizeof (float) ? __fpclassifyf (x) \ + : sizeof (x) == sizeof (double) ? __fpclassify (x) \ + : __fpclassifyl (x)) + +/* 7.12.3.2 */ +#define isfinite(x) ((fpclassify(x) & FP_NAN) == 0) + +/* 7.12.3.3 */ +#define isinf(x) (fpclassify(x) == FP_INFINITE) + +/* 7.12.3.4 */ +/* We don't need to worry about truncation here: + A NaN stays a NaN. */ + +__CRT_INLINE int __cdecl __isnan (double _x) +{ + unsigned short sw; + __asm__ ("fxam;" + "fstsw %%ax": "=a" (sw) : "t" (_x)); + return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL)) + == FP_NAN; +} + +__CRT_INLINE int __cdecl __isnanf (float _x) +{ + unsigned short sw; + __asm__ ("fxam;" + "fstsw %%ax": "=a" (sw) : "t" (_x)); + return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL)) + == FP_NAN; +} + +__CRT_INLINE int __cdecl __isnanl (long double _x) +{ + unsigned short sw; + __asm__ ("fxam;" + "fstsw %%ax": "=a" (sw) : "t" (_x)); + return (sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL)) + == FP_NAN; +} + + +#define isnan(x) (sizeof (x) == sizeof (float) ? __isnanf (x) \ + : sizeof (x) == sizeof (double) ? __isnan (x) \ + : __isnanl (x)) + +/* 7.12.3.5 */ +#define isnormal(x) (fpclassify(x) == FP_NORMAL) + +/* 7.12.3.6 The signbit macro */ +__CRT_INLINE int __cdecl __signbit (double x) { + unsigned short stw; + __asm__ ( "fxam; fstsw %%ax;": "=a" (stw) : "t" (x)); + return (stw & 0x0200) != 0; +} + +__CRT_INLINE int __cdecl __signbitf (float x) { + unsigned short stw; + __asm__ ("fxam; fstsw %%ax;": "=a" (stw) : "t" (x)); + return (stw & 0x0200) != 0; +} + +__CRT_INLINE int __cdecl __signbitl (long double x) { + unsigned short stw; + __asm__ ("fxam; fstsw %%ax;": "=a" (stw) : "t" (x)); + return (stw & 0x0200) != 0; +} + +#define signbit(x) (sizeof (x) == sizeof (float) ? __signbitf (x) \ + : sizeof (x) == sizeof (double) ? __signbit (x) \ + : __signbitl (x)) + +/* 7.12.4 Trigonometric functions: Double in C89 */ +extern float __cdecl sinf (float); +extern long double __cdecl sinl (long double); + +extern float __cdecl cosf (float); +extern long double __cdecl cosl (long double); + +extern float __cdecl tanf (float); +extern long double __cdecl tanl (long double); + +extern float __cdecl asinf (float); +extern long double __cdecl asinl (long double); + +extern float __cdecl acosf (float); +extern long double __cdecl acosl (long double); + +extern float __cdecl atanf (float); +extern long double __cdecl atanl (long double); + +extern float __cdecl atan2f (float, float); +extern long double __cdecl atan2l (long double, long double); + +/* 7.12.5 Hyperbolic functions: Double in C89 */ +__CRT_INLINE float __cdecl sinhf (float x) + {return (float) sinh (x);} +extern long double __cdecl sinhl (long double); + +__CRT_INLINE float __cdecl coshf (float x) + {return (float) cosh (x);} +extern long double __cdecl coshl (long double); + +__CRT_INLINE float __cdecl tanhf (float x) + {return (float) tanh (x);} +extern long double __cdecl tanhl (long double); + +/* Inverse hyperbolic trig functions */ +/* 7.12.5.1 */ +extern double __cdecl acosh (double); +extern float __cdecl acoshf (float); +extern long double __cdecl acoshl (long double); + +/* 7.12.5.2 */ +extern double __cdecl asinh (double); +extern float __cdecl asinhf (float); +extern long double __cdecl asinhl (long double); + +/* 7.12.5.3 */ +extern double __cdecl atanh (double); +extern float __cdecl atanhf (float); +extern long double __cdecl atanhl (long double); + +/* Exponentials and logarithms */ +/* 7.12.6.1 Double in C89 */ +__CRT_INLINE float __cdecl expf (float x) + {return (float) exp (x);} +extern long double __cdecl expl (long double); + +/* 7.12.6.2 */ +extern double __cdecl exp2(double); +extern float __cdecl exp2f(float); +extern long double __cdecl exp2l(long double); + +/* 7.12.6.3 The expm1 functions */ +/* TODO: These could be inlined */ +extern double __cdecl expm1(double); +extern float __cdecl expm1f(float); +extern long double __cdecl expm1l(long double); + +/* 7.12.6.4 Double in C89 */ +__CRT_INLINE float __cdecl frexpf (float x, int* expn) + {return (float) frexp (x, expn);} +extern long double __cdecl frexpl (long double, int*); + +/* 7.12.6.5 */ +#define FP_ILOGB0 ((int)0x80000000) +#define FP_ILOGBNAN ((int)0x80000000) +extern int __cdecl ilogb (double); +extern int __cdecl ilogbf (float); +extern int __cdecl ilogbl (long double); + +/* 7.12.6.6 Double in C89 */ +__CRT_INLINE float __cdecl ldexpf (float x, int expn) + {return (float) ldexp (x, expn);} +extern long double __cdecl ldexpl (long double, int); + +/* 7.12.6.7 Double in C89 */ +extern float __cdecl logf (float); +extern long double __cdecl logl (long double); + +/* 7.12.6.8 Double in C89 */ +extern float __cdecl log10f (float); +extern long double __cdecl log10l (long double); + +/* 7.12.6.9 */ +extern double __cdecl log1p(double); +extern float __cdecl log1pf(float); +extern long double __cdecl log1pl(long double); + +/* 7.12.6.10 */ +extern double __cdecl log2 (double); +extern float __cdecl log2f (float); +extern long double __cdecl log2l (long double); + +/* 7.12.6.11 */ +extern double __cdecl logb (double); +extern float __cdecl logbf (float); +extern long double __cdecl logbl (long double); + +/* Inline versions. GCC-4.0+ can do a better fast-math optimization + with __builtins. */ +#if !(__MINGW_GNUC_PREREQ (4, 0) && defined __FAST_MATH__ ) +__CRT_INLINE double __cdecl logb (double x) +{ + double res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; +} + +__CRT_INLINE float __cdecl logbf (float x) +{ + float res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; +} + +__CRT_INLINE long double __cdecl logbl (long double x) +{ + long double res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; +} +#endif /* !defined __FAST_MATH__ || !__MINGW_GNUC_PREREQ (4, 0) */ + +/* 7.12.6.12 Double in C89 */ +extern float __cdecl modff (float, float*); +extern long double __cdecl modfl (long double, long double*); + +/* 7.12.6.13 */ +extern double __cdecl scalbn (double, int); +extern float __cdecl scalbnf (float, int); +extern long double __cdecl scalbnl (long double, int); + +extern double __cdecl scalbln (double, long); +extern float __cdecl scalblnf (float, long); +extern long double __cdecl scalblnl (long double, long); + +/* 7.12.7.1 */ +/* Implementations adapted from Cephes versions */ +extern double __cdecl cbrt (double); +extern float __cdecl cbrtf (float); +extern long double __cdecl cbrtl (long double); + +/* 7.12.7.2 The fabs functions: Double in C89 */ +extern float __cdecl fabsf (float x); +extern long double __cdecl fabsl (long double x); + +/* 7.12.7.3 */ +extern double __cdecl hypot (double, double); /* in libmoldname.a */ +__CRT_INLINE float __cdecl hypotf (float x, float y) + { return (float) hypot (x, y);} +extern long double __cdecl hypotl (long double, long double); + +/* 7.12.7.4 The pow functions. Double in C89 */ +__CRT_INLINE float __cdecl powf (float x, float y) + {return (float) pow (x, y);} +extern long double __cdecl powl (long double, long double); + +/* 7.12.7.5 The sqrt functions. Double in C89. */ +extern float __cdecl sqrtf (float); +extern long double __cdecl sqrtl (long double); + +/* 7.12.8.1 The erf functions */ +extern double __cdecl erf (double); +extern float __cdecl erff (float); +extern long double __cdecl erfl (long double); + +/* 7.12.8.2 The erfc functions */ +extern double __cdecl erfc (double); +extern float __cdecl erfcf (float); +extern long double __cdecl erfcl (long double); + +/* 7.12.8.3 The lgamma functions */ +extern double __cdecl lgamma (double); +extern float __cdecl lgammaf (float); +extern long double __cdecl lgammal (long double); + +/* 7.12.8.4 The tgamma functions */ +extern double __cdecl tgamma (double); +extern float __cdecl tgammaf (float); +extern long double __cdecl tgammal (long double); + +/* 7.12.9.1 Double in C89 */ +extern float __cdecl ceilf (float); +extern long double __cdecl ceill (long double); + +/* 7.12.9.2 Double in C89 */ +extern float __cdecl floorf (float); +extern long double __cdecl floorl (long double); + +/* 7.12.9.3 */ +extern double __cdecl nearbyint ( double); +extern float __cdecl nearbyintf (float); +extern long double __cdecl nearbyintl (long double); + +/* 7.12.9.4 */ +/* round, using fpu control word settings */ +extern double __cdecl rint (double); +extern float __cdecl rintf (float); +extern long double __cdecl rintl (long double); + +/* 7.12.9.5 */ +extern long __cdecl lrint (double); +extern long __cdecl lrintf (float); +extern long __cdecl lrintl (long double); + +extern long long __cdecl llrint (double); +extern long long __cdecl llrintf (float); +extern long long __cdecl llrintl (long double); + +/* Inline versions of above. + GCC 4.0+ can do a better fast-math job with __builtins. */ +#if !(__MINGW_GNUC_PREREQ (4, 0) && defined __FAST_MATH__ ) +__CRT_INLINE double __cdecl rint (double x) +{ + double retval; + __asm__ ("frndint;": "=t" (retval) : "0" (x)); + return retval; +} + +__CRT_INLINE float __cdecl rintf (float x) +{ + float retval; + __asm__ ("frndint;" : "=t" (retval) : "0" (x) ); + return retval; +} + +__CRT_INLINE long double __cdecl rintl (long double x) +{ + long double retval; + __asm__ ("frndint;" : "=t" (retval) : "0" (x) ); + return retval; +} + +__CRT_INLINE long __cdecl lrint (double x) +{ + long retval; + __asm__ __volatile__ + ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); + return retval; +} + +__CRT_INLINE long __cdecl lrintf (float x) +{ + long retval; + __asm__ __volatile__ + ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); + return retval; +} + +__CRT_INLINE long __cdecl lrintl (long double x) +{ + long retval; + __asm__ __volatile__ + ("fistpl %0" : "=m" (retval) : "t" (x) : "st"); + return retval; +} + +__CRT_INLINE long long __cdecl llrint (double x) +{ + long long retval; + __asm__ __volatile__ + ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); + return retval; +} + +__CRT_INLINE long long __cdecl llrintf (float x) +{ + long long retval; + __asm__ __volatile__ + ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); + return retval; +} + +__CRT_INLINE long long __cdecl llrintl (long double x) +{ + long long retval; + __asm__ __volatile__ + ("fistpll %0" : "=m" (retval) : "t" (x) : "st"); + return retval; +} +#endif /* !__FAST_MATH__ || !__MINGW_GNUC_PREREQ (4,0) */ + +/* 7.12.9.6 */ +/* round away from zero, regardless of fpu control word settings */ +extern double __cdecl round (double); +extern float __cdecl roundf (float); +extern long double __cdecl roundl (long double); + +/* 7.12.9.7 */ +extern long __cdecl lround (double); +extern long __cdecl lroundf (float); +extern long __cdecl lroundl (long double); + +extern long long __cdecl llround (double); +extern long long __cdecl llroundf (float); +extern long long __cdecl llroundl (long double); + +/* 7.12.9.8 */ +/* round towards zero, regardless of fpu control word settings */ +extern double __cdecl trunc (double); +extern float __cdecl truncf (float); +extern long double __cdecl truncl (long double); + +/* 7.12.10.1 Double in C89 */ +extern float __cdecl fmodf (float, float); +extern long double __cdecl fmodl (long double, long double); + +/* 7.12.10.2 */ +extern double __cdecl remainder (double, double); +extern float __cdecl remainderf (float, float); +extern long double __cdecl remainderl (long double, long double); + +/* 7.12.10.3 */ +extern double __cdecl remquo(double, double, int *); +extern float __cdecl remquof(float, float, int *); +extern long double __cdecl remquol(long double, long double, int *); + +/* 7.12.11.1 */ +extern double __cdecl copysign (double, double); /* in libmoldname.a */ +extern float __cdecl copysignf (float, float); +extern long double __cdecl copysignl (long double, long double); + +/* 7.12.11.2 Return a NaN */ +extern double __cdecl nan(const char *tagp); +extern float __cdecl nanf(const char *tagp); +extern long double __cdecl nanl(const char *tagp); + +#ifndef __STRICT_ANSI__ +#define _nan() nan("") +#define _nanf() nanf("") +#define _nanl() nanl("") +#endif + +/* 7.12.11.3 */ +extern double __cdecl nextafter (double, double); /* in libmoldname.a */ +extern float __cdecl nextafterf (float, float); +extern long double __cdecl nextafterl (long double, long double); + +/* 7.12.11.4 The nexttoward functions */ +extern double __cdecl nexttoward (double, long double); +extern float __cdecl nexttowardf (float, long double); +extern long double __cdecl nexttowardl (long double, long double); + +/* 7.12.12.1 */ +/* x > y ? (x - y) : 0.0 */ +extern double __cdecl fdim (double x, double y); +extern float __cdecl fdimf (float x, float y); +extern long double __cdecl fdiml (long double x, long double y); + +/* fmax and fmin. + NaN arguments are treated as missing data: if one argument is a NaN + and the other numeric, then these functions choose the numeric + value. */ + +/* 7.12.12.2 */ +extern double __cdecl fmax (double, double); +extern float __cdecl fmaxf (float, float); +extern long double __cdecl fmaxl (long double, long double); + +/* 7.12.12.3 */ +extern double __cdecl fmin (double, double); +extern float __cdecl fminf (float, float); +extern long double __cdecl fminl (long double, long double); + +/* 7.12.13.1 */ +/* return x * y + z as a ternary op */ +extern double __cdecl fma (double, double, double); +extern float __cdecl fmaf (float, float, float); +extern long double __cdecl fmal (long double, long double, long double); + + +/* 7.12.14 */ +/* + * With these functions, comparisons involving quiet NaNs set the FP + * condition code to "unordered". The IEEE floating-point spec + * dictates that the result of floating-point comparisons should be + * false whenever a NaN is involved, with the exception of the != op, + * which always returns true: yes, (NaN != NaN) is true). + */ + +#if __GNUC__ >= 3 + +#define isgreater(x, y) __builtin_isgreater(x, y) +#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y) +#define isless(x, y) __builtin_isless(x, y) +#define islessequal(x, y) __builtin_islessequal(x, y) +#define islessgreater(x, y) __builtin_islessgreater(x, y) +#define isunordered(x, y) __builtin_isunordered(x, y) + +#else +/* helper */ +__CRT_INLINE int __cdecl +__fp_unordered_compare (long double x, long double y){ + unsigned short retval; + __asm__ ("fucom %%st(1);" + "fnstsw;": "=a" (retval) : "t" (x), "u" (y)); + return retval; +} + +#define isgreater(x, y) ((__fp_unordered_compare(x, y) \ + & 0x4500) == 0) +#define isless(x, y) ((__fp_unordered_compare (y, x) \ + & 0x4500) == 0) +#define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \ + & FP_INFINITE) == 0) +#define islessequal(x, y) ((__fp_unordered_compare(y, x) \ + & FP_INFINITE) == 0) +#define islessgreater(x, y) ((__fp_unordered_compare(x, y) \ + & FP_SUBNORMAL) == 0) +#define isunordered(x, y) ((__fp_unordered_compare(x, y) \ + & 0x4500) == 0x4500) + +#endif + + +#endif /* __STDC_VERSION__ >= 199901L */ +#endif /* __NO_ISOCEXT */ + + +#ifdef __cplusplus +} +#endif +#endif /* Not RC_INVOKED */ + + +#endif /* Not _MATH_H_ */ diff --git a/mingw/include/mbctype.h b/mingw/include/mbctype.h new file mode 100644 index 00000000..01214370 --- /dev/null +++ b/mingw/include/mbctype.h @@ -0,0 +1,97 @@ +/* + * mbctype.h + * + * Functions for testing multibyte character types and converting characters. + * + * This file is part of the Mingw32 package. + * + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef _MBCTYPE_H_ +#define _MBCTYPE_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +/* return values for _mbsbtype and _mbbtype in mbstring.h */ +#define _MBC_SINGLE 0 +#define _MBC_LEAD 1 +#define _MBC_TRAIL 2 +#define _MBC_ILLEGAL (-1) + +/* args for setmbcp (in lieu of actual codepage) */ +#define _MB_CP_SBCS 0 +#define _MB_CP_OEM (-2) +#define _MB_CP_ANSI (-3) +#define _MB_CP_LOCALE (-4) + +/* TODO: bit masks */ +/* +#define _MS +#define _MP +#define _M1 +#define _M2 +#define _SBUP +#define _SBLOW +*/ + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __STRICT_ANSI__ + +_CRTIMP int __cdecl __MINGW_NOTHROW _setmbcp (int); +_CRTIMP int __cdecl __MINGW_NOTHROW _getmbcp (void); + +/* byte classification */ +/* NB: Corresponding _ismbc* functions are in mbstring.h */ + +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbalpha (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbalnum (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbgraph (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbprint (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbpunct (unsigned int); + +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbkana (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbkalnum (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbkprint (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbkpunct (unsigned int); + + +/* these are also in mbstring.h */ +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbblead (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbtrail (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbslead (const unsigned char*, const unsigned char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbstrail (const unsigned char*, const unsigned char*); + +#ifdef __DECLSPEC_SUPPORTED +__MINGW_IMPORT unsigned char _mbctype[]; +__MINGW_IMPORT unsigned char _mbcasemap[]; +#endif + +/* TODO : _MBCS_ mappings go in tchar.h */ + +#endif /* Not strict ANSI */ + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _MCTYPE_H_ */ + diff --git a/mingw/include/mbstring.h b/mingw/include/mbstring.h new file mode 100644 index 00000000..19261fed --- /dev/null +++ b/mingw/include/mbstring.h @@ -0,0 +1,132 @@ +/* + * mbstring.h + * + * Protototypes for string functions supporting multibyte characters. + * + * This file is part of the Mingw32 package. + * + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef _MBSTRING_H_ +#define _MBSTRING_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#ifndef RC_INVOKED + +#define __need_size_t +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __STRICT_ANSI__ + +/* character classification */ +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcalnum (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcalpha (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcdigit (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcgraph (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcprint (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcpunct (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcspace (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbclower (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcupper (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbclegal (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcsymbol (unsigned int); + + +/* also in mbctype.h */ +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbblead (unsigned int ); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbbtrail (unsigned int ); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbslead ( const unsigned char*, const unsigned char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbstrail ( const unsigned char*, const unsigned char*); + +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbctolower (unsigned int); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbctoupper (unsigned int); + +_CRTIMP void __cdecl __MINGW_NOTHROW _mbccpy (unsigned char*, const unsigned char*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW _mbclen (const unsigned char*); + +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbbtombc (unsigned int); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbctombb (unsigned int); + +/* Return value constants for these are defined in mbctype.h. */ +_CRTIMP int __cdecl __MINGW_NOTHROW _mbbtype (unsigned char, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsbtype (const unsigned char*, size_t); + +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbscpy (unsigned char*, const unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsncpy (unsigned char*, const unsigned char*, size_t); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsnbcpy (unsigned char*, const unsigned char*, size_t); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsset (unsigned char*, unsigned int); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsnset (unsigned char*, unsigned int, size_t); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsnbset (unsigned char*, unsigned int, size_t); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsdup (const unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsrev (unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbscat (unsigned char*, const unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsncat (unsigned char*, const unsigned char*, size_t); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsnbcat (unsigned char*, const unsigned char*, size_t); +_CRTIMP size_t __cdecl __MINGW_NOTHROW _mbslen (const unsigned char*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW _mbsnbcnt (const unsigned char*, size_t); +_CRTIMP size_t __cdecl __MINGW_NOTHROW _mbsnccnt (const unsigned char*, size_t); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbschr (const unsigned char*, unsigned int); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsrchr (const unsigned char*, unsigned int); +_CRTIMP size_t __cdecl __MINGW_NOTHROW _mbsspn (const unsigned char*, const unsigned char*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW _mbscspn (const unsigned char*, const unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsspnp (const unsigned char*, const unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbspbrk (const unsigned char*, const unsigned char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbscmp (const unsigned char*, const unsigned char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsicmp (const unsigned char*, const unsigned char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsncmp (const unsigned char*, const unsigned char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsnicmp (const unsigned char*, const unsigned char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsnbcmp (const unsigned char*, const unsigned char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsnbicmp (const unsigned char*, const unsigned char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbscoll (const unsigned char*, const unsigned char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsicoll (const unsigned char*, const unsigned char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsncoll (const unsigned char*, const unsigned char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsnicoll (const unsigned char*, const unsigned char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsnbcoll (const unsigned char*, const unsigned char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _mbsnbicoll (const unsigned char*, const unsigned char*, size_t); + +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsinc (const unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsninc (const unsigned char*, size_t); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsdec (const unsigned char*, const unsigned char*); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbsnextc (const unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbslwr (unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbsupr (unsigned char*); +_CRTIMP unsigned char* __cdecl __MINGW_NOTHROW _mbstok (unsigned char*, const unsigned char*); + +/* Kanji */ +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbchira (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbckata (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcl0 (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcl1 (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW _ismbcl2 (unsigned int); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbcjistojms (unsigned int); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbcjmstojis (unsigned int); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbctohira (unsigned int); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _mbctokata (unsigned int); + +#endif /* Not strict ANSI */ + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ +#endif /* Not _MBSTRING_H_ */ + + diff --git a/mingw/include/mem.h b/mingw/include/mem.h new file mode 100644 index 00000000..451de0cd --- /dev/null +++ b/mingw/include/mem.h @@ -0,0 +1,6 @@ +/* + * This file is part of the Mingw32 package. + * + * mem.h maps to string.h + */ +#include diff --git a/mingw/include/memory.h b/mingw/include/memory.h new file mode 100644 index 00000000..9ba65cf6 --- /dev/null +++ b/mingw/include/memory.h @@ -0,0 +1,7 @@ +/* + * This file is part of the Mingw32 package. + * + * memory.h maps to the standard string.h header. + */ + +#include diff --git a/mingw/include/process.h b/mingw/include/process.h index bdc2f0c5..c0c380fb 100644 --- a/mingw/include/process.h +++ b/mingw/include/process.h @@ -14,9 +14,8 @@ /* All the headers include this file. */ #include <_mingw.h> -/* Includes a definition of _pid_t and pid_t */ -#include - +#include /* For _pid_t and pid_t. */ +#include /* For intptr_t. */ /* * Constants for cwait actions. * Obsolete for Win32. @@ -55,30 +54,30 @@ extern "C" { #endif -_CRTIMP void __cdecl _cexit(void); -_CRTIMP void __cdecl _c_exit(void); +_CRTIMP void __cdecl __MINGW_NOTHROW _cexit(void); +_CRTIMP void __cdecl __MINGW_NOTHROW _c_exit(void); -_CRTIMP int __cdecl _cwait (int*, _pid_t, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _cwait (int*, _pid_t, int); -_CRTIMP _pid_t __cdecl _getpid(void); +_CRTIMP _pid_t __cdecl __MINGW_NOTHROW _getpid(void); -_CRTIMP int __cdecl _execl (const char*, const char*, ...); -_CRTIMP int __cdecl _execle (const char*, const char*, ...); -_CRTIMP int __cdecl _execlp (const char*, const char*, ...); -_CRTIMP int __cdecl _execlpe (const char*, const char*, ...); -_CRTIMP int __cdecl _execv (const char*, const char* const*); -_CRTIMP int __cdecl _execve (const char*, const char* const*, const char* const*); -_CRTIMP int __cdecl _execvp (const char*, const char* const*); -_CRTIMP int __cdecl _execvpe (const char*, const char* const*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _execl (const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _execle (const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _execlp (const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _execlpe (const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _execv (const char*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _execve (const char*, const char* const*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _execvp (const char*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _execvpe (const char*, const char* const*, const char* const*); -_CRTIMP int __cdecl _spawnl (int, const char*, const char*, ...); -_CRTIMP int __cdecl _spawnle (int, const char*, const char*, ...); -_CRTIMP int __cdecl _spawnlp (int, const char*, const char*, ...); -_CRTIMP int __cdecl _spawnlpe (int, const char*, const char*, ...); -_CRTIMP int __cdecl _spawnv (int, const char*, const char* const*); -_CRTIMP int __cdecl _spawnve (int, const char*, const char* const*, const char* const*); -_CRTIMP int __cdecl _spawnvp (int, const char*, const char* const*); -_CRTIMP int __cdecl _spawnvpe (int, const char*, const char* const*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _spawnl (int, const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _spawnle (int, const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _spawnlp (int, const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _spawnlpe (int, const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _spawnv (int, const char*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _spawnve (int, const char*, const char* const*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _spawnvp (int, const char*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _spawnvpe (int, const char*, const char* const*, const char* const*); /* @@ -92,15 +91,15 @@ _CRTIMP int __cdecl _spawnvpe (int, const char*, const char* const*, const char* * * NOTE: No old names for these functions. Use the underscore. */ -_CRTIMP unsigned long __cdecl +_CRTIMP unsigned long __cdecl __MINGW_NOTHROW _beginthread (void (*)(void *), unsigned, void*); -_CRTIMP void __cdecl _endthread (void); +_CRTIMP void __cdecl __MINGW_NOTHROW _endthread (void); #ifdef __MSVCRT__ -_CRTIMP unsigned long __cdecl +_CRTIMP unsigned long __cdecl __MINGW_NOTHROW _beginthreadex (void *, unsigned, unsigned (__stdcall *) (void *), void*, unsigned, unsigned*); -_CRTIMP void __cdecl _endthreadex (unsigned); +_CRTIMP void __cdecl __MINGW_NOTHROW _endthreadex (unsigned); #endif @@ -109,24 +108,26 @@ _CRTIMP void __cdecl _endthreadex (unsigned); * Functions without the leading underscore, for portability. These functions * live in liboldnames.a. */ -_CRTIMP int __cdecl cwait (int*, pid_t, int); -_CRTIMP pid_t __cdecl getpid (void); -_CRTIMP int __cdecl execl (const char*, const char*, ...); -_CRTIMP int __cdecl execle (const char*, const char*, ...); -_CRTIMP int __cdecl execlp (const char*, const char*, ...); -_CRTIMP int __cdecl execlpe (const char*, const char*, ...); -_CRTIMP int __cdecl execv (const char*, const char* const*); -_CRTIMP int __cdecl execve (const char*, const char* const*, const char* const*); -_CRTIMP int __cdecl execvp (const char*, const char* const*); -_CRTIMP int __cdecl execvpe (const char*, const char* const*, const char* const*); -_CRTIMP int __cdecl spawnl (int, const char*, const char*, ...); -_CRTIMP int __cdecl spawnle (int, const char*, const char*, ...); -_CRTIMP int __cdecl spawnlp (int, const char*, const char*, ...); -_CRTIMP int __cdecl spawnlpe (int, const char*, const char*, ...); -_CRTIMP int __cdecl spawnv (int, const char*, const char* const*); -_CRTIMP int __cdecl spawnve (int, const char*, const char* const*, const char* const*); -_CRTIMP int __cdecl spawnvp (int, const char*, const char* const*); -_CRTIMP int __cdecl spawnvpe (int, const char*, const char* const*, const char* const*); +_CRTIMP int __cdecl __MINGW_NOTHROW cwait (int*, pid_t, int); +_CRTIMP pid_t __cdecl __MINGW_NOTHROW getpid (void); + +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW execl (const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW execle (const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW execlp (const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW execlpe (const char*, const char*,...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW execv (const char*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW execve (const char*, const char* const*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW execvp (const char*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW execvpe (const char*, const char* const*, const char* const*); + +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW spawnl (int, const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW spawnle (int, const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW spawnlp (int, const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW spawnlpe (int, const char*, const char*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW spawnv (int, const char*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW spawnve (int, const char*, const char* const*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW spawnvp (int, const char*, const char* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW spawnvpe (int, const char*, const char* const*, const char* const*); #endif /* Not _NO_OLDNAMES */ #ifdef __cplusplus diff --git a/mingw/include/profil.h b/mingw/include/profil.h new file mode 100644 index 00000000..9245dd25 --- /dev/null +++ b/mingw/include/profil.h @@ -0,0 +1,51 @@ +/* profil.h: gprof profiling header file + + Copyright 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +/* + * This file is taken from Cygwin distribution. Please keep it in sync. + * The differences should be within __MINGW32__ guard. + */ + +/* profiling frequency. (No larger than 1000) */ +#define PROF_HZ 100 + +/* convert an addr to an index */ +#define PROFIDX(pc, base, scale) \ + ({ \ + size_t i = (pc - base) / 2; \ + if (sizeof (unsigned long long int) > sizeof (size_t)) \ + i = (unsigned long long int) i * scale / 65536; \ + else \ + i = i / 65536 * scale + i % 65536 * scale / 65536; \ + i; \ + }) + +/* convert an index into an address */ +#define PROFADDR(idx, base, scale) \ + ((base) \ + + ((((unsigned long long)(idx) << 16) \ + / (unsigned long long)(scale)) << 1)) + +/* convert a bin size into a scale */ +#define PROFSCALE(range, bins) (((bins) << 16) / ((range) >> 1)) + +typedef void *_WINHANDLE; + +struct profinfo { + _WINHANDLE targthr; /* thread to profile */ + _WINHANDLE profthr; /* profiling thread */ + u_short *counter; /* profiling counters */ + u_long lowpc, highpc; /* range to be profiled */ + u_int scale; /* scale value of bins */ +}; + +int profile_ctl(struct profinfo *, char *, size_t, u_long, u_int); +int profil(char *, size_t, u_long, u_int); + diff --git a/mingw/include/profile.h b/mingw/include/profile.h new file mode 100644 index 00000000..d1de0f98 --- /dev/null +++ b/mingw/include/profile.h @@ -0,0 +1,83 @@ +/* $NetBSD: profile.h,v 1.6 1995/03/28 18:17:08 jtc Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * 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. + * + * @(#)profile.h 8.1 (Berkeley) 6/11/93 + */ + +/* + * This file is taken from Cygwin distribution. Please keep it in sync. + * The differences should be within __MINGW32__ guard. + */ +/* If compiler doesn't inline, at least avoid passing args on the stack. */ +#define _MCOUNT_CALL __attribute__ ((regparm (2))) +#define _MCOUNT_DECL static __inline__ void _MCOUNT_CALL _mcount + +/* FIXME: This works, but it would be cleaner to convert mcount into an + assembler stub that calls an extern _mcount. + Older versions of GCC (pre-4.1) will still fail with regparm since the + compiler used %edx to store an unneeded counter variable. */ + +#define MCOUNT \ +void \ +mcount() \ +{ \ + u_long selfpc, frompcindex; \ + /* \ + * Save registers, since this may be called from \ + * the prologue of a regparm function. \ + */ \ + __asm __volatile__ ("pushl %eax\n\t" \ + "pushl %ecx\n\t" \ + "pushl %edx"); \ + /* \ + * find the return address for mcount, \ + * and the return address for mcount's caller. \ + * \ + * selfpc = pc pushed by mcount call \ + */ \ + /* __asm ("movl 4(%%ebp),%0" : "=r" (selfpc)); */ \ + selfpc = (u_long) __builtin_return_address (0); \ + /* \ + * frompcindex = pc pushed by call into self. \ + */ \ + /* __asm ("movl (%%ebp),%0;movl 4(%0),%0" : "=r" (frompcindex)); */ \ + frompcindex = (u_long) __builtin_return_address (1); \ + _mcount(frompcindex, selfpc); \ + /* \ + * Restore registers. \ + */ \ + __asm __volatile__ ("popl %edx\n\t" \ + "popl %ecx\n\t" \ + "popl %eax"); \ +} diff --git a/mingw/include/search.h b/mingw/include/search.h new file mode 100644 index 00000000..af71a32c --- /dev/null +++ b/mingw/include/search.h @@ -0,0 +1,106 @@ +/* + * search.h + * + * Functions for searching and sorting. + * + * This file is part of the Mingw32 package. + * + * Contributors: + * Created by Danny Smith + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef _SEARCH_H_ +#define _SEARCH_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _SIZE_T_DEFINED +typedef unsigned int size_t; +#define _SIZE_T_DEFINED +#endif + +/* bsearch and qsort are also declared in stdlib.h */ +_CRTIMP void* __cdecl bsearch (const void*, const void*, size_t, size_t, + int (*)(const void*, const void*)); +_CRTIMP void __cdecl qsort (void*, size_t, size_t, + int (*)(const void*, const void*)); + +_CRTIMP void* __cdecl _lfind (const void*, const void*, unsigned int*, + unsigned int, int (*)(const void*, const void*)); +_CRTIMP void* __cdecl _lsearch (const void*, void*, unsigned int*, unsigned int, + int (*)(const void*, const void*)); +/* +Documentation for these POSIX definitions and prototypes can be found in +The Open Group Base Specifications Issue 6 +IEEE Std 1003.1, 2004 Edition. +eg: http://www.opengroup.org/onlinepubs/009695399/functions/twalk.html +*/ + + +typedef struct entry { + char *key; + void *data; +} ENTRY; + +typedef enum { + FIND, + ENTER +} ACTION; + +typedef enum { + preorder, + postorder, + endorder, + leaf +} VISIT; + +#ifdef _SEARCH_PRIVATE +typedef struct node { + char *key; + struct node *llink, *rlink; +} node_t; +#endif + +void * __cdecl tdelete (const void * __restrict__, void ** __restrict__, + int (*)(const void *, const void *)) + __MINGW_ATTRIB_NONNULL (1) __MINGW_ATTRIB_NONNULL (3); +void * __cdecl tfind (const void *, void * const *, + int (*)(const void *, const void *)) + __MINGW_ATTRIB_NONNULL (1) __MINGW_ATTRIB_NONNULL (3); +void * __cdecl tsearch (const void *, void **, + int (*)(const void *, const void *)) + __MINGW_ATTRIB_NONNULL (1) __MINGW_ATTRIB_NONNULL (3); +void __cdecl twalk (const void *, void (*)(const void *, VISIT, int)); + +#ifndef _NO_OLDNAMES +_CRTIMP void* __cdecl lfind (const void*, const void*, unsigned int*, + unsigned int, int (*)(const void*, const void*)); +_CRTIMP void* __cdecl lsearch (const void*, void*, unsigned int*, unsigned int, + int (*)(const void*, const void*)); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* RC_INVOKED */ + +#endif /* _SEARCH_H_ */ diff --git a/mingw/include/setjmp.h b/mingw/include/setjmp.h index b9e4d6c4..96eb5bd6 100644 --- a/mingw/include/setjmp.h +++ b/mingw/include/setjmp.h @@ -36,7 +36,7 @@ typedef _JBTYPE jmp_buf[_JBLEN]; * The function provided by CRTDLL which appears to do the actual work * of setjmp. */ -int __cdecl _setjmp (jmp_buf); +_CRTIMP int __cdecl __MINGW_NOTHROW _setjmp (jmp_buf); #define setjmp(x) _setjmp(x) @@ -44,7 +44,7 @@ int __cdecl _setjmp (jmp_buf); * Return to the last setjmp call and act as if setjmp had returned * nVal (which had better be non-zero!). */ -void __cdecl longjmp (jmp_buf, int); +_CRTIMP void __cdecl __MINGW_NOTHROW longjmp (jmp_buf, int) __MINGW_ATTRIB_NORETURN; #ifdef __cplusplus } diff --git a/mingw/include/share.h b/mingw/include/share.h new file mode 100644 index 00000000..09a54ad2 --- /dev/null +++ b/mingw/include/share.h @@ -0,0 +1,33 @@ +/* + * share.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Constants for file sharing functions. + * + */ + +#ifndef _SHARE_H_ +#define _SHARE_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#define _SH_COMPAT 0x00 /* Compatibility */ +#define _SH_DENYRW 0x10 /* Deny read/write */ +#define _SH_DENYWR 0x20 /* Deny write */ +#define _SH_DENYRD 0x30 /* Deny read */ +#define _SH_DENYNO 0x40 /* Deny nothing */ + +#ifndef _NO_OLDNAMES + +/* Non ANSI names */ +#define SH_DENYRW _SH_DENYRW +#define SH_DENYWR _SH_DENYWR +#define SH_DENYRD _SH_DENYRD +#define SH_DENYNO _SH_DENYNO + +#endif /* Not _NO_OLDNAMES */ + +#endif /* Not _SHARE_H_ */ diff --git a/mingw/include/signal.h b/mingw/include/signal.h index 887150d8..6fe336d8 100644 --- a/mingw/include/signal.h +++ b/mingw/include/signal.h @@ -81,12 +81,12 @@ extern "C" { * previous handler, or SIG_ERR if an error occurs. Initially * unhandled signals defined above will return SIG_DFL. */ -_CRTIMP __p_sig_fn_t __cdecl signal(int, __p_sig_fn_t); +_CRTIMP __p_sig_fn_t __cdecl __MINGW_NOTHROW signal(int, __p_sig_fn_t); /* * Raise the signal indicated by sig. Returns non-zero on success. */ -_CRTIMP int __cdecl raise (int); +_CRTIMP int __cdecl __MINGW_NOTHROW raise (int); #ifdef __cplusplus } diff --git a/mingw/include/stdint.h b/mingw/include/stdint.h index 5241d48b..57db989c 100644 --- a/mingw/include/stdint.h +++ b/mingw/include/stdint.h @@ -57,12 +57,28 @@ typedef long long int_fast64_t; typedef unsigned long long uint_fast64_t; /* 7.18.1.4 Integer types capable of holding object pointers */ -typedef int intptr_t; -typedef unsigned uintptr_t; + +#ifndef _INTPTR_T_DEFINED +#define _INTPTR_T_DEFINED +#ifdef _WIN64 + typedef __int64 intptr_t; +#else + typedef int intptr_t; +#endif +#endif + +#ifndef _UINTPTR_T_DEFINED +#define _UINTPTR_T_DEFINED +#ifdef _WIN64 + typedef unsigned __int64 uintptr_t; +#else + typedef unsigned int uintptr_t; +#endif +#endif /* 7.18.1.5 Greatest-width integer types */ typedef long long intmax_t; -typedef unsigned long long uintmax_t; +typedef unsigned long long uintmax_t; /* 7.18.2 Limits of specified-width integer types */ #if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS) @@ -116,10 +132,16 @@ typedef unsigned long long uintmax_t; #define UINT_FAST64_MAX UINT64_MAX /* 7.18.2.4 Limits of integer types capable of holding - object pointers */ + object pointers */ +#ifdef _WIN64 +#define INTPTR_MIN INT64_MIN +#define INTPTR_MAX INT64_MAX +#define UINTPTR_MAX UINT64_MAX +#else #define INTPTR_MIN INT32_MIN #define INTPTR_MAX INT32_MAX #define UINTPTR_MAX UINT32_MAX +#endif /* 7.18.2.5 Limits of greatest-width integer types */ #define INTMAX_MIN INT64_MIN @@ -127,13 +149,13 @@ typedef unsigned long long uintmax_t; #define UINTMAX_MAX UINT64_MAX /* 7.18.3 Limits of other integer types */ -#define PTRDIFF_MIN INT32_MIN -#define PTRDIFF_MAX INT32_MAX +#define PTRDIFF_MIN INTPTR_MIN +#define PTRDIFF_MAX INTPTR_MAX -#define SIG_ATOMIC_MIN INT32_MIN -#define SIG_ATOMIC_MAX INT32_MAX +#define SIG_ATOMIC_MIN INTPTR_MIN +#define SIG_ATOMIC_MAX INTPTR_MAX -#define SIZE_MAX UINT32_MAX +#define SIZE_MAX UINTPTR_MAX #ifndef WCHAR_MIN /* also in wchar.h */ #define WCHAR_MIN 0 diff --git a/mingw/include/stdio.h b/mingw/include/stdio.h index 23914a3f..1765bed9 100644 --- a/mingw/include/stdio.h +++ b/mingw/include/stdio.h @@ -166,75 +166,196 @@ extern "C" { /* * File Operations */ -_CRTIMP FILE* __cdecl fopen (const char*, const char*); -_CRTIMP FILE* __cdecl freopen (const char*, const char*, FILE*); -_CRTIMP int __cdecl fflush (FILE*); -_CRTIMP int __cdecl fclose (FILE*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW fopen (const char*, const char*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW freopen (const char*, const char*, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fflush (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fclose (FILE*); /* MS puts remove & rename (but not wide versions) in io.h also */ -_CRTIMP int __cdecl remove (const char*); -_CRTIMP int __cdecl rename (const char*, const char*); -_CRTIMP FILE* __cdecl tmpfile (void); -_CRTIMP char* __cdecl tmpnam (char*); +_CRTIMP int __cdecl __MINGW_NOTHROW remove (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW rename (const char*, const char*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW tmpfile (void); +_CRTIMP char* __cdecl __MINGW_NOTHROW tmpnam (char*); #ifndef __STRICT_ANSI__ -_CRTIMP char* __cdecl _tempnam (const char*, const char*); -_CRTIMP int __cdecl _rmtmp(void); -_CRTIMP int __cdecl _unlink (const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _tempnam (const char*, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _rmtmp(void); +_CRTIMP int __cdecl __MINGW_NOTHROW _unlink (const char*); #ifndef NO_OLDNAMES -_CRTIMP char* __cdecl tempnam (const char*, const char*); -_CRTIMP int __cdecl rmtmp(void); -_CRTIMP int __cdecl unlink (const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW tempnam (const char*, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW rmtmp(void); +_CRTIMP int __cdecl __MINGW_NOTHROW unlink (const char*); #endif #endif /* __STRICT_ANSI__ */ -_CRTIMP int __cdecl setvbuf (FILE*, char*, int, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW setvbuf (FILE*, char*, int, size_t); -_CRTIMP void __cdecl setbuf (FILE*, char*); +_CRTIMP void __cdecl __MINGW_NOTHROW setbuf (FILE*, char*); /* * Formatted Output + * + * MSVCRT implementations are not ANSI C99 conformant... + * we offer these conforming alternatives from libmingwex.a + */ +#undef __mingw_stdio_redirect__ +#define __mingw_stdio_redirect__(F) __cdecl __MINGW_NOTHROW __mingw_##F + +extern int __mingw_stdio_redirect__(fprintf)(FILE*, const char*, ...); +extern int __mingw_stdio_redirect__(printf)(const char*, ...); +extern int __mingw_stdio_redirect__(sprintf)(char*, const char*, ...); +extern int __mingw_stdio_redirect__(snprintf)(char*, size_t, const char*, ...); +extern int __mingw_stdio_redirect__(vfprintf)(FILE*, const char*, __VALIST); +extern int __mingw_stdio_redirect__(vprintf)(const char*, __VALIST); +extern int __mingw_stdio_redirect__(vsprintf)(char*, const char*, __VALIST); +extern int __mingw_stdio_redirect__(vsnprintf)(char*, size_t, const char*, __VALIST); + +#if __USE_MINGW_ANSI_STDIO +/* + * User has expressed a preference for C99 conformance... + */ +# undef __mingw_stdio_redirect__ +# ifdef __cplusplus +/* + * For C++ we use inline implementations, to avoid interference + * with namespace qualification, which may result from using #defines. + */ +# define __mingw_stdio_redirect__ static inline __cdecl __MINGW_NOTHROW + +# elif defined __GNUC__ +/* + * FIXME: Is there any GCC version prerequisite here? + * + * We also prefer inline implementations for C, when we can be confident + * that the GNU specific __inline__ mechanism is supported. + */ +# define __mingw_stdio_redirect__ static __inline__ __cdecl __MINGW_NOTHROW + +# else +/* + * Can't use inlines; fall back on module local static stubs. + */ +# define __mingw_stdio_redirect__ static __cdecl __MINGW_NOTHROW +# endif + +__mingw_stdio_redirect__ +int fprintf (FILE *__stream, const char *__format, ...) +{ + register int __retval; + __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format ); + __retval = __mingw_vfprintf( __stream, __format, __local_argv ); + __builtin_va_end( __local_argv ); + return __retval; +} + +__mingw_stdio_redirect__ +int printf (const char *__format, ...) +{ + register int __retval; + __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format ); + __retval = __mingw_vprintf( __format, __local_argv ); + __builtin_va_end( __local_argv ); + return __retval; +} + +__mingw_stdio_redirect__ +int sprintf (char *__stream, const char *__format, ...) +{ + register int __retval; + __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format ); + __retval = __mingw_vsprintf( __stream, __format, __local_argv ); + __builtin_va_end( __local_argv ); + return __retval; +} + +__mingw_stdio_redirect__ +int vfprintf (FILE *__stream, const char *__format, __VALIST __local_argv) +{ + return __mingw_vfprintf( __stream, __format, __local_argv ); +} + +__mingw_stdio_redirect__ +int vprintf (const char *__format, __VALIST __local_argv) +{ + return __mingw_vprintf( __format, __local_argv ); +} + +__mingw_stdio_redirect__ +int vsprintf (char *__stream, const char *__format, __VALIST __local_argv) +{ + return __mingw_vsprintf( __stream, __format, __local_argv ); +} + +#else +/* + * Default configuration: simply direct all calls to MSVCRT... + */ +_CRTIMP int __cdecl __MINGW_NOTHROW fprintf (FILE*, const char*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW printf (const char*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW sprintf (char*, const char*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW vfprintf (FILE*, const char*, __VALIST); +_CRTIMP int __cdecl __MINGW_NOTHROW vprintf (const char*, __VALIST); +_CRTIMP int __cdecl __MINGW_NOTHROW vsprintf (char*, const char*, __VALIST); + +#endif +/* + * Regardless of user preference, always offer these alternative + * entry points, for direct access to the MSVCRT implementations. */ +#undef __mingw_stdio_redirect__ +#define __mingw_stdio_redirect__(F) __cdecl __MINGW_NOTHROW __msvcrt_##F -_CRTIMP int __cdecl fprintf (FILE*, const char*, ...); -_CRTIMP int __cdecl printf (const char*, ...); -_CRTIMP int __cdecl sprintf (char*, const char*, ...); -_CRTIMP int __cdecl _snprintf (char*, size_t, const char*, ...); -_CRTIMP int __cdecl vfprintf (FILE*, const char*, __VALIST); -_CRTIMP int __cdecl vprintf (const char*, __VALIST); -_CRTIMP int __cdecl vsprintf (char*, const char*, __VALIST); -_CRTIMP int __cdecl _vsnprintf (char*, size_t, const char*, __VALIST); +_CRTIMP int __mingw_stdio_redirect__(fprintf)(FILE*, const char*, ...); +_CRTIMP int __mingw_stdio_redirect__(printf)(const char*, ...); +_CRTIMP int __mingw_stdio_redirect__(sprintf)(char*, const char*, ...); +_CRTIMP int __mingw_stdio_redirect__(vfprintf)(FILE*, const char*, __VALIST); +_CRTIMP int __mingw_stdio_redirect__(vprintf)(const char*, __VALIST); +_CRTIMP int __mingw_stdio_redirect__(vsprintf)(char*, const char*, __VALIST); + +#undef __mingw_stdio_redirect__ + +/* The following pair ALWAYS refer to the MSVCRT implementations... + */ +_CRTIMP int __cdecl __MINGW_NOTHROW _snprintf (char*, size_t, const char*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW _vsnprintf (char*, size_t, const char*, __VALIST); #ifndef __NO_ISOCEXT /* externs in libmingwex.a */ -int __cdecl snprintf(char* s, size_t n, const char* format, ...); -__CRT_INLINE int __cdecl -vsnprintf (char* s, size_t n, const char* format, __VALIST arg) - { return _vsnprintf ( s, n, format, arg); } -int __cdecl vscanf (const char * __restrict__, __VALIST); -int __cdecl vfscanf (FILE * __restrict__, const char * __restrict__, +/* + * Microsoft does not provide implementations for the following, + * which are required by C99. Note in particular that the corresponding + * Microsoft implementations of _snprintf() and _vsnprintf() are *not* + * compatible with C99, but the following are; if you want the MSVCRT + * behaviour, you *must* use the Microsoft uglified names. + */ +int __cdecl __MINGW_NOTHROW snprintf (char *, size_t, const char *, ...); +int __cdecl __MINGW_NOTHROW vsnprintf (char *, size_t, const char *, __VALIST); + +int __cdecl __MINGW_NOTHROW vscanf (const char * __restrict__, __VALIST); +int __cdecl __MINGW_NOTHROW vfscanf (FILE * __restrict__, const char * __restrict__, __VALIST); -int __cdecl vsscanf (const char * __restrict__, +int __cdecl __MINGW_NOTHROW vsscanf (const char * __restrict__, const char * __restrict__, __VALIST); -#endif + +#endif /* !__NO_ISOCEXT */ /* * Formatted Input */ -_CRTIMP int __cdecl fscanf (FILE*, const char*, ...); -_CRTIMP int __cdecl scanf (const char*, ...); -_CRTIMP int __cdecl sscanf (const char*, const char*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW fscanf (FILE*, const char*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW scanf (const char*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW sscanf (const char*, const char*, ...); /* * Character Input and Output Functions */ -_CRTIMP int __cdecl fgetc (FILE*); -_CRTIMP char* __cdecl fgets (char*, int, FILE*); -_CRTIMP int __cdecl fputc (int, FILE*); -_CRTIMP int __cdecl fputs (const char*, FILE*); -_CRTIMP char* __cdecl gets (char*); -_CRTIMP int __cdecl puts (const char*); -_CRTIMP int __cdecl ungetc (int, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fgetc (FILE*); +_CRTIMP char* __cdecl __MINGW_NOTHROW fgets (char*, int, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fputc (int, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fputs (const char*, FILE*); +_CRTIMP char* __cdecl __MINGW_NOTHROW gets (char*); +_CRTIMP int __cdecl __MINGW_NOTHROW puts (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW ungetc (int, FILE*); /* Traditionally, getc and putc are defined as macros. but the standard doesn't say that they must be macros. @@ -242,33 +363,33 @@ _CRTIMP int __cdecl ungetc (int, FILE*); to be used in C++ with namespace qualification, eg., ::getc. _filbuf and _flsbuf are not thread-safe. */ -_CRTIMP int __cdecl _filbuf (FILE*); -_CRTIMP int __cdecl _flsbuf (int, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW _filbuf (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW _flsbuf (int, FILE*); #if !defined _MT -__CRT_INLINE int __cdecl getc (FILE* __F) +__CRT_INLINE int __cdecl __MINGW_NOTHROW getc (FILE* __F) { return (--__F->_cnt >= 0) ? (int) (unsigned char) *__F->_ptr++ : _filbuf (__F); } -__CRT_INLINE int __cdecl putc (int __c, FILE* __F) +__CRT_INLINE int __cdecl __MINGW_NOTHROW putc (int __c, FILE* __F) { return (--__F->_cnt >= 0) ? (int) (unsigned char) (*__F->_ptr++ = (char)__c) : _flsbuf (__c, __F); } -__CRT_INLINE int __cdecl getchar (void) +__CRT_INLINE int __cdecl __MINGW_NOTHROW getchar (void) { return (--stdin->_cnt >= 0) ? (int) (unsigned char) *stdin->_ptr++ : _filbuf (stdin); } -__CRT_INLINE int __cdecl putchar(int __c) +__CRT_INLINE int __cdecl __MINGW_NOTHROW putchar(int __c) { return (--stdout->_cnt >= 0) ? (int) (unsigned char) (*stdout->_ptr++ = (char)__c) @@ -276,10 +397,10 @@ __CRT_INLINE int __cdecl putchar(int __c) #else /* Use library functions. */ -_CRTIMP int __cdecl getc (FILE*); -_CRTIMP int __cdecl putc (int, FILE*); -_CRTIMP int __cdecl getchar (void); -_CRTIMP int __cdecl putchar (int); +_CRTIMP int __cdecl __MINGW_NOTHROW getc (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW putc (int, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW getchar (void); +_CRTIMP int __cdecl __MINGW_NOTHROW putchar (int); #endif @@ -287,25 +408,25 @@ _CRTIMP int __cdecl putchar (int); * Direct Input and Output Functions */ -_CRTIMP size_t __cdecl fread (void*, size_t, size_t, FILE*); -_CRTIMP size_t __cdecl fwrite (const void*, size_t, size_t, FILE*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW fread (void*, size_t, size_t, FILE*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW fwrite (const void*, size_t, size_t, FILE*); /* * File Positioning Functions */ -_CRTIMP int __cdecl fseek (FILE*, long, int); -_CRTIMP long __cdecl ftell (FILE*); -_CRTIMP void __cdecl rewind (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fseek (FILE*, long, int); +_CRTIMP long __cdecl __MINGW_NOTHROW ftell (FILE*); +_CRTIMP void __cdecl __MINGW_NOTHROW rewind (FILE*); #if __MSVCRT_VERSION__ >= 0x800 -_CRTIMP int __cdecl _fseek_nolock (FILE*, long, int); -_CRTIMP long __cdecl _ftell_nolock (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW _fseek_nolock (FILE*, long, int); +_CRTIMP long __cdecl __MINGW_NOTHROW _ftell_nolock (FILE*); -_CRTIMP int __cdecl _fseeki64 (FILE*, __int64, int); -_CRTIMP __int64 __cdecl _ftelli64 (FILE*); -_CRTIMP int __cdecl _fseeki64_nolock (FILE*, __int64, int); -_CRTIMP __int64 __cdecl _ftelli64_nolock (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW _fseeki64 (FILE*, __int64, int); +_CRTIMP __int64 __cdecl __MINGW_NOTHROW _ftelli64 (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW _fseeki64_nolock (FILE*, __int64, int); +_CRTIMP __int64 __cdecl __MINGW_NOTHROW _ftelli64_nolock (FILE*); #endif #ifdef __USE_MINGW_FSEEK /* These are in libmingwex.a */ @@ -314,8 +435,8 @@ _CRTIMP __int64 __cdecl _ftelli64_nolock (FILE*); * not zero'd out if you seek past the end and then write. */ -int __cdecl __mingw_fseek (FILE *, long, int); -size_t __cdecl __mingw_fwrite (const void*, size_t, size_t, FILE*); +int __cdecl __MINGW_NOTHROW __mingw_fseek (FILE *, long, int); +size_t __cdecl __MINGW_NOTHROW __mingw_fwrite (const void*, size_t, size_t, FILE*); #define fseek(fp, offset, whence) __mingw_fseek(fp, offset, whence) #define fwrite(buffer, size, count, fp) __mingw_fwrite(buffer, size, count, fp) #endif /* __USE_MINGW_FSEEK */ @@ -335,67 +456,72 @@ typedef long long fpos_t; typedef long fpos_t; #endif -_CRTIMP int __cdecl fgetpos (FILE*, fpos_t*); -_CRTIMP int __cdecl fsetpos (FILE*, const fpos_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW fgetpos (FILE*, fpos_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW fsetpos (FILE*, const fpos_t*); /* * Error Functions */ -_CRTIMP int __cdecl feof (FILE*); -_CRTIMP int __cdecl ferror (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW feof (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW ferror (FILE*); #ifdef __cplusplus -inline int __cdecl feof (FILE* __F) +inline int __cdecl __MINGW_NOTHROW feof (FILE* __F) { return __F->_flag & _IOEOF; } -inline int __cdecl ferror (FILE* __F) +inline int __cdecl __MINGW_NOTHROW ferror (FILE* __F) { return __F->_flag & _IOERR; } #else #define feof(__F) ((__F)->_flag & _IOEOF) #define ferror(__F) ((__F)->_flag & _IOERR) #endif -_CRTIMP void __cdecl clearerr (FILE*); -_CRTIMP void __cdecl perror (const char*); +_CRTIMP void __cdecl __MINGW_NOTHROW clearerr (FILE*); +_CRTIMP void __cdecl __MINGW_NOTHROW perror (const char*); #ifndef __STRICT_ANSI__ /* * Pipes */ -_CRTIMP FILE* __cdecl _popen (const char*, const char*); -_CRTIMP int __cdecl _pclose (FILE*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _popen (const char*, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _pclose (FILE*); #ifndef NO_OLDNAMES -_CRTIMP FILE* __cdecl popen (const char*, const char*); -_CRTIMP int __cdecl pclose (FILE*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW popen (const char*, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW pclose (FILE*); #endif /* * Other Non ANSI functions */ -_CRTIMP int __cdecl _flushall (void); -_CRTIMP int __cdecl _fgetchar (void); -_CRTIMP int __cdecl _fputchar (int); -_CRTIMP FILE* __cdecl _fdopen (int, const char*); -_CRTIMP int __cdecl _fileno (FILE*); -_CRTIMP int __cdecl _fcloseall(void); -_CRTIMP FILE* __cdecl _fsopen(const char*, const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _flushall (void); +_CRTIMP int __cdecl __MINGW_NOTHROW _fgetchar (void); +_CRTIMP int __cdecl __MINGW_NOTHROW _fputchar (int); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _fdopen (int, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _fileno (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW _fcloseall (void); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _fsopen (const char*, const char*, int); #ifdef __MSVCRT__ -_CRTIMP int __cdecl _getmaxstdio(void); -_CRTIMP int __cdecl _setmaxstdio(int); +_CRTIMP int __cdecl __MINGW_NOTHROW _getmaxstdio (void); +_CRTIMP int __cdecl __MINGW_NOTHROW _setmaxstdio (int); #endif #if __MSVCRT_VERSION__ >= 0x800 -_CRTIMP int __cdecl _set_printf_count_output(int); -_CRTIMP int __cdecl _get_printf_count_output(void); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _get_output_format (void); +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _set_output_format (unsigned int); + +#define _TWO_DIGIT_EXPONENT 1 + +_CRTIMP int __cdecl __MINGW_NOTHROW _get_printf_count_output (void); +_CRTIMP int __cdecl __MINGW_NOTHROW _set_printf_count_output (int); #endif #ifndef _NO_OLDNAMES -_CRTIMP int __cdecl fgetchar (void); -_CRTIMP int __cdecl fputchar (int); -_CRTIMP FILE* __cdecl fdopen (int, const char*); -_CRTIMP int __cdecl fileno (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fgetchar (void); +_CRTIMP int __cdecl __MINGW_NOTHROW fputchar (int); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW fdopen (int, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW fileno (FILE*); #endif /* Not _NO_OLDNAMES */ #define _fileno(__F) ((__F)->_file) @@ -405,19 +531,19 @@ _CRTIMP int __cdecl fileno (FILE*); #if defined (__MSVCRT__) && !defined (__NO_MINGW_LFS) #include -__CRT_INLINE FILE* __cdecl fopen64 (const char* filename, const char* mode) +__CRT_INLINE FILE* __cdecl __MINGW_NOTHROW fopen64 (const char* filename, const char* mode) { return fopen (filename, mode); } -int __cdecl fseeko64 (FILE*, off64_t, int); +int __cdecl __MINGW_NOTHROW fseeko64 (FILE*, off64_t, int); #ifdef __USE_MINGW_FSEEK -int __cdecl __mingw_fseeko64 (FILE *, off64_t, int); +int __cdecl __MINGW_NOTHROW __mingw_fseeko64 (FILE *, off64_t, int); #define fseeko64(fp, offset, whence) __mingw_fseeko64(fp, offset, whence) #endif -__CRT_INLINE off64_t __cdecl ftello64 (FILE * stream) +__CRT_INLINE off64_t __cdecl __MINGW_NOTHROW ftello64 (FILE * stream) { fpos_t pos; if (fgetpos(stream, &pos)) @@ -433,51 +559,55 @@ __CRT_INLINE off64_t __cdecl ftello64 (FILE * stream) #ifndef _WSTDIO_DEFINED /* also in wchar.h - keep in sync */ -_CRTIMP int __cdecl fwprintf (FILE*, const wchar_t*, ...); -_CRTIMP int __cdecl wprintf (const wchar_t*, ...); -_CRTIMP int __cdecl swprintf (wchar_t*, const wchar_t*, ...); -_CRTIMP int __cdecl _snwprintf (wchar_t*, size_t, const wchar_t*, ...); -_CRTIMP int __cdecl vfwprintf (FILE*, const wchar_t*, __VALIST); -_CRTIMP int __cdecl vwprintf (const wchar_t*, __VALIST); -_CRTIMP int __cdecl vswprintf (wchar_t*, const wchar_t*, __VALIST); -_CRTIMP int __cdecl _vsnwprintf (wchar_t*, size_t, const wchar_t*, __VALIST); -_CRTIMP int __cdecl fwscanf (FILE*, const wchar_t*, ...); -_CRTIMP int __cdecl wscanf (const wchar_t*, ...); -_CRTIMP int __cdecl swscanf (const wchar_t*, const wchar_t*, ...); -_CRTIMP wint_t __cdecl fgetwc (FILE*); -_CRTIMP wint_t __cdecl fputwc (wchar_t, FILE*); -_CRTIMP wint_t __cdecl ungetwc (wchar_t, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fwprintf (FILE*, const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW wprintf (const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW _snwprintf (wchar_t*, size_t, const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW vfwprintf (FILE*, const wchar_t*, __VALIST); +_CRTIMP int __cdecl __MINGW_NOTHROW vwprintf (const wchar_t*, __VALIST); +_CRTIMP int __cdecl __MINGW_NOTHROW _vsnwprintf (wchar_t*, size_t, const wchar_t*, __VALIST); +_CRTIMP int __cdecl __MINGW_NOTHROW fwscanf (FILE*, const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW wscanf (const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW swscanf (const wchar_t*, const wchar_t*, ...); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW fgetwc (FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW fputwc (wchar_t, FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW ungetwc (wchar_t, FILE*); + +/* These differ from the ISO C prototypes, which have a maxlen parameter (like snprintf). */ +#ifndef __STRICT_ANSI__ +_CRTIMP int __cdecl __MINGW_NOTHROW swprintf (wchar_t*, const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW vswprintf (wchar_t*, const wchar_t*, __VALIST); +#endif #ifdef __MSVCRT__ -_CRTIMP wchar_t* __cdecl fgetws (wchar_t*, int, FILE*); -_CRTIMP int __cdecl fputws (const wchar_t*, FILE*); -_CRTIMP wint_t __cdecl getwc (FILE*); -_CRTIMP wint_t __cdecl getwchar (void); -_CRTIMP wchar_t* __cdecl _getws (wchar_t*); -_CRTIMP wint_t __cdecl putwc (wint_t, FILE*); -_CRTIMP int __cdecl _putws (const wchar_t*); -_CRTIMP wint_t __cdecl putwchar (wint_t); -_CRTIMP FILE* __cdecl _wfdopen(int, wchar_t *); -_CRTIMP FILE* __cdecl _wfopen (const wchar_t*, const wchar_t*); -_CRTIMP FILE* __cdecl _wfreopen (const wchar_t*, const wchar_t*, FILE*); -_CRTIMP FILE* __cdecl _wfsopen (const wchar_t*, const wchar_t*, int); -_CRTIMP wchar_t* __cdecl _wtmpnam (wchar_t*); -_CRTIMP wchar_t* __cdecl _wtempnam (const wchar_t*, const wchar_t*); -_CRTIMP int __cdecl _wrename (const wchar_t*, const wchar_t*); -_CRTIMP int __cdecl _wremove (const wchar_t*); -_CRTIMP void __cdecl _wperror (const wchar_t*); -_CRTIMP FILE* __cdecl _wpopen (const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW fgetws (wchar_t*, int, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fputws (const wchar_t*, FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW getwc (FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW getwchar (void); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _getws (wchar_t*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW putwc (wint_t, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW _putws (const wchar_t*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW putwchar (wint_t); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wfdopen(int, const wchar_t *); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wfopen (const wchar_t*, const wchar_t*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wfreopen (const wchar_t*, const wchar_t*, FILE*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wfsopen (const wchar_t*, const wchar_t*, int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wtmpnam (wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wtempnam (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wrename (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wremove (const wchar_t*); +_CRTIMP void __cdecl __MINGW_NOTHROW _wperror (const wchar_t*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wpopen (const wchar_t*, const wchar_t*); #endif /* __MSVCRT__ */ #ifndef __NO_ISOCEXT /* externs in libmingwex.a */ -int __cdecl snwprintf (wchar_t* s, size_t n, const wchar_t* format, ...); -__CRT_INLINE int __cdecl +int __cdecl __MINGW_NOTHROW snwprintf (wchar_t* s, size_t n, const wchar_t* format, ...); +__CRT_INLINE int __cdecl __MINGW_NOTHROW vsnwprintf (wchar_t* s, size_t n, const wchar_t* format, __VALIST arg) { return _vsnwprintf ( s, n, format, arg);} -int __cdecl vwscanf (const wchar_t * __restrict__, __VALIST); -int __cdecl vfwscanf (FILE * __restrict__, +int __cdecl __MINGW_NOTHROW vwscanf (const wchar_t * __restrict__, __VALIST); +int __cdecl __MINGW_NOTHROW vfwscanf (FILE * __restrict__, const wchar_t * __restrict__, __VALIST); -int __cdecl vswscanf (const wchar_t * __restrict__, +int __cdecl __MINGW_NOTHROW vswscanf (const wchar_t * __restrict__, const wchar_t * __restrict__, __VALIST); #endif @@ -487,23 +617,23 @@ int __cdecl vswscanf (const wchar_t * __restrict__, #ifndef __STRICT_ANSI__ #ifdef __MSVCRT__ #ifndef NO_OLDNAMES -_CRTIMP FILE* __cdecl wpopen (const wchar_t*, const wchar_t*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW wpopen (const wchar_t*, const wchar_t*); #endif /* not NO_OLDNAMES */ #endif /* MSVCRT runtime */ /* * Other Non ANSI wide functions */ -_CRTIMP wint_t __cdecl _fgetwchar (void); -_CRTIMP wint_t __cdecl _fputwchar (wint_t); -_CRTIMP int __cdecl _getw (FILE*); -_CRTIMP int __cdecl _putw (int, FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW _fgetwchar (void); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW _fputwchar (wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _getw (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW _putw (int, FILE*); #ifndef _NO_OLDNAMES -_CRTIMP wint_t __cdecl fgetwchar (void); -_CRTIMP wint_t __cdecl fputwchar (wint_t); -_CRTIMP int __cdecl getw (FILE*); -_CRTIMP int __cdecl putw (int, FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW fgetwchar (void); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW fputwchar (wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW getw (FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW putw (int, FILE*); #endif /* Not _NO_OLDNAMES */ #endif /* __STRICT_ANSI */ diff --git a/mingw/include/stdlib.h b/mingw/include/stdlib.h index dd407b12..b5864305 100644 --- a/mingw/include/stdlib.h +++ b/mingw/include/stdlib.h @@ -21,8 +21,6 @@ #include #endif /* RC_INVOKED */ -#include /* For uintptr_t */ - /* * RAND_MAX is the maximum value that may be returned by rand. * The minimum is zero. @@ -76,9 +74,9 @@ extern char** _argv; /* imports from runtime dll of the above variables */ #ifdef __MSVCRT__ -extern int* __cdecl __p___argc(void); -extern char*** __cdecl __p___argv(void); -extern wchar_t*** __cdecl __p___wargv(void); +extern int* __cdecl __MINGW_NOTHROW __p___argc(void); +extern char*** __cdecl __MINGW_NOTHROW __p___argv(void); +extern wchar_t*** __cdecl __MINGW_NOTHROW __p___wargv(void); #define __argc (*__p___argc()) #define __argv (*__p___argv()) @@ -136,10 +134,10 @@ __MINGW_IMPORT char** __argv_dll; #undef errno extern int errno; #else - _CRTIMP int* __cdecl _errno(void); + _CRTIMP int* __cdecl __MINGW_NOTHROW _errno(void); #define errno (*_errno()) #endif - _CRTIMP int* __cdecl __doserrno(void); + _CRTIMP int* __cdecl __MINGW_NOTHROW __doserrno(void); #define _doserrno (*__doserrno()) #if !defined (__STRICT_ANSI__) @@ -148,8 +146,8 @@ extern int errno; */ #ifdef __MSVCRT__ - extern _CRTIMP char *** __cdecl __p__environ(void); - extern _CRTIMP wchar_t *** __cdecl __p__wenviron(void); + extern _CRTIMP char *** __cdecl __MINGW_NOTHROW __p__environ(void); + extern _CRTIMP wchar_t *** __cdecl __MINGW_NOTHROW __p__wenviron(void); # define _environ (*__p__environ()) # define _wenviron (*__p__wenviron()) #else /* ! __MSVCRT__ */ @@ -208,10 +206,10 @@ __MINGW_IMPORT char* _sys_errlist[]; #ifdef __MSVCRT__ /* msvcrtxx.dll */ -extern _CRTIMP unsigned __cdecl int* __p__osver(void); -extern _CRTIMP unsigned __cdecl int* __p__winver(void); -extern _CRTIMP unsigned __cdecl int* __p__winmajor(void); -extern _CRTIMP unsigned __cdecl int* __p__winminor(void); +extern _CRTIMP unsigned __cdecl __MINGW_NOTHROW int* __p__osver(void); +extern _CRTIMP unsigned __cdecl __MINGW_NOTHROW int* __p__winver(void); +extern _CRTIMP unsigned __cdecl __MINGW_NOTHROW int* __p__winmajor(void); +extern _CRTIMP unsigned __cdecl __MINGW_NOTHROW int* __p__winminor(void); #ifndef __DECLSPEC_SUPPORTED # define _osver (*__p__osver()) @@ -259,9 +257,9 @@ __MINGW_IMPORT unsigned int _winminor_dll; #if defined __MSVCRT__ /* although the _pgmptr is exported as DATA, * be safe and use the access function __p__pgmptr() to get it. */ -_CRTIMP char** __cdecl __p__pgmptr(void); +_CRTIMP char** __cdecl __MINGW_NOTHROW __p__pgmptr(void); #define _pgmptr (*__p__pgmptr()) -_CRTIMP wchar_t** __cdecl __p__wpgmptr(void); +_CRTIMP wchar_t** __cdecl __MINGW_NOTHROW __p__wpgmptr(void); #define _wpgmptr (*__p__wpgmptr()) #else /* ! __MSVCRT__ */ # ifndef __DECLSPEC_SUPPORTED @@ -302,66 +300,86 @@ __MINGW_IMPORT int _fmode_dll; #endif /* Not __STRICT_ANSI__ */ -_CRTIMP double __cdecl atof (const char*); -_CRTIMP int __cdecl atoi (const char*); -_CRTIMP long __cdecl atol (const char*); +_CRTIMP double __cdecl __MINGW_NOTHROW atof (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW atoi (const char*); +_CRTIMP long __cdecl __MINGW_NOTHROW atol (const char*); #if !defined (__STRICT_ANSI__) -_CRTIMP int __cdecl _wtoi (const wchar_t *); -_CRTIMP long __cdecl _wtol (const wchar_t *); +_CRTIMP int __cdecl __MINGW_NOTHROW _wtoi (const wchar_t *); +_CRTIMP long __cdecl __MINGW_NOTHROW _wtol (const wchar_t *); #endif -_CRTIMP double __cdecl strtod (const char*, char**); #if !defined __NO_ISOCEXT /* in libmingwex.a */ -float __cdecl strtof (const char * __restrict__, char ** __restrict__); -long double __cdecl strtold (const char * __restrict__, char ** __restrict__); +double __cdecl __MINGW_NOTHROW __strtod (const char*, char**); +#ifdef __cplusplus +/* We require a function with external linkage. */ +#else +static +#endif /* Not __cplusplus */ +__inline__ double __cdecl __MINGW_NOTHROW +strtod (const char* __restrict__ __nptr, char** __restrict__ __endptr) +{ + return __strtod(__nptr, __endptr); +} +float __cdecl __MINGW_NOTHROW strtof (const char * __restrict__, char ** __restrict__); +long double __cdecl __MINGW_NOTHROW strtold (const char * __restrict__, char ** __restrict__); +#else +_CRTIMP double __cdecl __MINGW_NOTHROW strtod (const char*, char**); #endif /* __NO_ISOCEXT */ -_CRTIMP long __cdecl strtol (const char*, char**, int); -_CRTIMP unsigned long __cdecl strtoul (const char*, char**, int); +_CRTIMP long __cdecl __MINGW_NOTHROW strtol (const char*, char**, int); +_CRTIMP unsigned long __cdecl __MINGW_NOTHROW strtoul (const char*, char**, int); #ifndef _WSTDLIB_DEFINED /* also declared in wchar.h */ -_CRTIMP double __cdecl wcstod (const wchar_t*, wchar_t**); +_CRTIMP long __cdecl __MINGW_NOTHROW wcstol (const wchar_t*, wchar_t**, int); +_CRTIMP unsigned long __cdecl __MINGW_NOTHROW wcstoul (const wchar_t*, wchar_t**, int); +_CRTIMP double __cdecl __MINGW_NOTHROW wcstod (const wchar_t*, wchar_t**); #if !defined __NO_ISOCEXT /* in libmingwex.a */ -float __cdecl wcstof( const wchar_t * __restrict__, wchar_t ** __restrict__); -long double __cdecl wcstold (const wchar_t * __restrict__, wchar_t ** __restrict__); +float __cdecl __MINGW_NOTHROW wcstof( const wchar_t * __restrict__, wchar_t ** __restrict__); +long double __cdecl __MINGW_NOTHROW wcstold (const wchar_t * __restrict__, wchar_t ** __restrict__); #endif /* __NO_ISOCEXT */ - -_CRTIMP long __cdecl wcstol (const wchar_t*, wchar_t**, int); -_CRTIMP unsigned long __cdecl wcstoul (const wchar_t*, wchar_t**, int); +#ifdef __MSVCRT__ +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wgetenv(const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wputenv(const wchar_t*); +_CRTIMP void __cdecl __MINGW_NOTHROW _wsearchenv(const wchar_t*, const wchar_t*, wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wsystem(const wchar_t*); +_CRTIMP void __cdecl __MINGW_NOTHROW _wmakepath(wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*); +_CRTIMP void __cdecl __MINGW_NOTHROW _wsplitpath (const wchar_t*, wchar_t*, wchar_t*, wchar_t*, wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wfullpath (wchar_t*, const wchar_t*, size_t); +#endif #define _WSTDLIB_DEFINED #endif -_CRTIMP size_t __cdecl wcstombs (char*, const wchar_t*, size_t); -_CRTIMP int __cdecl wctomb (char*, wchar_t); +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcstombs (char*, const wchar_t*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW wctomb (char*, wchar_t); -_CRTIMP int __cdecl mblen (const char*, size_t); -_CRTIMP size_t __cdecl mbstowcs (wchar_t*, const char*, size_t); -_CRTIMP int __cdecl mbtowc (wchar_t*, const char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW mblen (const char*, size_t); +_CRTIMP size_t __cdecl __MINGW_NOTHROW mbstowcs (wchar_t*, const char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW mbtowc (wchar_t*, const char*, size_t); -_CRTIMP int __cdecl rand (void); -_CRTIMP void __cdecl srand (unsigned int); +_CRTIMP int __cdecl __MINGW_NOTHROW rand (void); +_CRTIMP void __cdecl __MINGW_NOTHROW srand (unsigned int); -_CRTIMP void* __cdecl calloc (size_t, size_t) __MINGW_ATTRIB_MALLOC; -_CRTIMP void* __cdecl malloc (size_t) __MINGW_ATTRIB_MALLOC; -_CRTIMP void* __cdecl realloc (void*, size_t); -_CRTIMP void __cdecl free (void*); -_CRTIMP void __cdecl abort (void) __MINGW_ATTRIB_NORETURN; -_CRTIMP void __cdecl exit (int) __MINGW_ATTRIB_NORETURN; +_CRTIMP void* __cdecl __MINGW_NOTHROW calloc (size_t, size_t) __MINGW_ATTRIB_MALLOC; +_CRTIMP void* __cdecl __MINGW_NOTHROW malloc (size_t) __MINGW_ATTRIB_MALLOC; +_CRTIMP void* __cdecl __MINGW_NOTHROW realloc (void*, size_t); +_CRTIMP void __cdecl __MINGW_NOTHROW free (void*); +_CRTIMP void __cdecl __MINGW_NOTHROW abort (void) __MINGW_ATTRIB_NORETURN; +_CRTIMP void __cdecl __MINGW_NOTHROW exit (int) __MINGW_ATTRIB_NORETURN; /* Note: This is in startup code, not imported directly from dll */ -int __cdecl atexit (void (*)(void)); +int __cdecl __MINGW_NOTHROW atexit (void (*)(void)); -_CRTIMP int __cdecl system (const char*); -_CRTIMP char* __cdecl getenv (const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW system (const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW getenv (const char*); /* bsearch and qsort are also in non-ANSI header search.h */ -_CRTIMP void* __cdecl bsearch (const void*, const void*, size_t, size_t, - int (*)(const void*, const void*)); -_CRTIMP void __cdecl qsort (void*, size_t, size_t, - int (*)(const void*, const void*)); +_CRTIMP void* __cdecl bsearch (const void*, const void*, size_t, size_t, + int (*)(const void*, const void*)); +_CRTIMP void __cdecl qsort(void*, size_t, size_t, + int (*)(const void*, const void*)); -_CRTIMP int __cdecl abs (int) __MINGW_ATTRIB_CONST; -_CRTIMP long __cdecl labs (long) __MINGW_ATTRIB_CONST; +_CRTIMP int __cdecl __MINGW_NOTHROW abs (int) __MINGW_ATTRIB_CONST; +_CRTIMP long __cdecl __MINGW_NOTHROW labs (long) __MINGW_ATTRIB_CONST; /* * div_t and ldiv_t are structures used to return the results of div and @@ -374,8 +392,8 @@ _CRTIMP long __cdecl labs (long) __MINGW_ATTRIB_CONST; typedef struct { int quot, rem; } div_t; typedef struct { long quot, rem; } ldiv_t; -_CRTIMP div_t __cdecl div (int, int) __MINGW_ATTRIB_CONST; -_CRTIMP ldiv_t __cdecl ldiv (long, long) __MINGW_ATTRIB_CONST; +_CRTIMP div_t __cdecl __MINGW_NOTHROW div (int, int) __MINGW_ATTRIB_CONST; +_CRTIMP ldiv_t __cdecl __MINGW_NOTHROW ldiv (long, long) __MINGW_ATTRIB_CONST; #if !defined (__STRICT_ANSI__) @@ -383,90 +401,96 @@ _CRTIMP ldiv_t __cdecl ldiv (long, long) __MINGW_ATTRIB_CONST; * NOTE: Officially the three following functions are obsolete. The Win32 API * functions SetErrorMode, Beep and Sleep are their replacements. */ -_CRTIMP void __cdecl _beep (unsigned int, unsigned int) __MINGW_ATTRIB_DEPRECATED; +_CRTIMP void __cdecl __MINGW_NOTHROW _beep (unsigned int, unsigned int) __MINGW_ATTRIB_DEPRECATED; /* Not to be confused with _set_error_mode (int). */ -_CRTIMP void __cdecl _seterrormode (int) __MINGW_ATTRIB_DEPRECATED; -_CRTIMP void __cdecl _sleep (unsigned long) __MINGW_ATTRIB_DEPRECATED; +_CRTIMP void __cdecl __MINGW_NOTHROW _seterrormode (int) __MINGW_ATTRIB_DEPRECATED; +_CRTIMP void __cdecl __MINGW_NOTHROW _sleep (unsigned long) __MINGW_ATTRIB_DEPRECATED; -_CRTIMP void __cdecl _exit (int) __MINGW_ATTRIB_NORETURN; +_CRTIMP void __cdecl __MINGW_NOTHROW _exit (int) __MINGW_ATTRIB_NORETURN; /* _onexit is MS extension. Use atexit for portability. */ /* Note: This is in startup code, not imported directly from dll */ typedef int (* _onexit_t)(void); -_onexit_t __cdecl _onexit( _onexit_t ); - -_CRTIMP int __cdecl _putenv (const char*); -_CRTIMP void __cdecl _searchenv (const char*, const char*, char*); +_onexit_t __cdecl __MINGW_NOTHROW _onexit( _onexit_t ); +_CRTIMP int __cdecl __MINGW_NOTHROW _putenv (const char*); +_CRTIMP void __cdecl __MINGW_NOTHROW _searchenv (const char*, const char*, char*); -_CRTIMP char* __cdecl _ecvt (double, int, int*, int*); -_CRTIMP char* __cdecl _fcvt (double, int, int*, int*); -_CRTIMP char* __cdecl _gcvt (double, int, char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _ecvt (double, int, int*, int*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _fcvt (double, int, int*, int*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _gcvt (double, int, char*); -_CRTIMP void __cdecl _makepath (char*, const char*, const char*, const char*, const char*); -_CRTIMP void __cdecl _splitpath (const char*, char*, char*, char*, char*); -_CRTIMP char* __cdecl _fullpath (char*, const char*, size_t); +_CRTIMP void __cdecl __MINGW_NOTHROW _makepath (char*, const char*, const char*, const char*, const char*); +_CRTIMP void __cdecl __MINGW_NOTHROW _splitpath (const char*, char*, char*, char*, char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _fullpath (char*, const char*, size_t); -_CRTIMP char* __cdecl _itoa (int, char*, int); -_CRTIMP char* __cdecl _ltoa (long, char*, int); -_CRTIMP char* __cdecl _ultoa(unsigned long, char*, int); -_CRTIMP wchar_t* __cdecl _itow (int, wchar_t*, int); -_CRTIMP wchar_t* __cdecl _ltow (long, wchar_t*, int); -_CRTIMP wchar_t* __cdecl _ultow (unsigned long, wchar_t*, int); +_CRTIMP char* __cdecl __MINGW_NOTHROW _itoa (int, char*, int); +_CRTIMP char* __cdecl __MINGW_NOTHROW _ltoa (long, char*, int); +_CRTIMP char* __cdecl __MINGW_NOTHROW _ultoa(unsigned long, char*, int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _itow (int, wchar_t*, int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _ltow (long, wchar_t*, int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _ultow (unsigned long, wchar_t*, int); #ifdef __MSVCRT__ -_CRTIMP __int64 __cdecl _atoi64(const char *); -_CRTIMP char* __cdecl _i64toa(__int64, char *, int); -_CRTIMP char* __cdecl _ui64toa(unsigned __int64, char *, int); -_CRTIMP __int64 __cdecl _wtoi64(const wchar_t *); -_CRTIMP wchar_t* __cdecl _i64tow(__int64, wchar_t *, int); -_CRTIMP wchar_t* __cdecl _ui64tow(unsigned __int64, wchar_t *, int); - -_CRTIMP wchar_t* __cdecl _wgetenv(const wchar_t*); -_CRTIMP int __cdecl _wputenv(const wchar_t*); -_CRTIMP void __cdecl _wsearchenv(const wchar_t*, const wchar_t*, wchar_t*); -_CRTIMP void __cdecl _wmakepath(wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*); -_CRTIMP void __cdecl _wsplitpath (const wchar_t*, wchar_t*, wchar_t*, wchar_t*, wchar_t*); -_CRTIMP wchar_t* __cdecl _wfullpath (wchar_t*, const wchar_t*, size_t); - -_CRTIMP unsigned int __cdecl _rotl(unsigned int, int) __MINGW_ATTRIB_CONST; -_CRTIMP unsigned int __cdecl _rotr(unsigned int, int) __MINGW_ATTRIB_CONST; -_CRTIMP unsigned long __cdecl _lrotl(unsigned long, int) __MINGW_ATTRIB_CONST; -_CRTIMP unsigned long __cdecl _lrotr(unsigned long, int) __MINGW_ATTRIB_CONST; - -_CRTIMP int __cdecl _set_error_mode (int); -#define _OUT_TO_DEFAULT 0 -#define _OUT_TO_STDERR 1 -#define _OUT_TO_MSGBOX 2 -#define _REPORT_ERRMODE 3 - -#if __MSVCRT_VERSION__ >= 0x800 -_CRTIMP unsigned int __cdecl _set_abort_behavior (unsigned int, unsigned int); +_CRTIMP __int64 __cdecl __MINGW_NOTHROW _atoi64(const char *); +_CRTIMP char* __cdecl __MINGW_NOTHROW _i64toa(__int64, char *, int); +_CRTIMP char* __cdecl __MINGW_NOTHROW _ui64toa(unsigned __int64, char *, int); +_CRTIMP __int64 __cdecl __MINGW_NOTHROW _wtoi64(const wchar_t *); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _i64tow(__int64, wchar_t *, int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _ui64tow(unsigned __int64, wchar_t *, int); + +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _rotl(unsigned int, int) __MINGW_ATTRIB_CONST; +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _rotr(unsigned int, int) __MINGW_ATTRIB_CONST; +_CRTIMP unsigned long __cdecl __MINGW_NOTHROW _lrotl(unsigned long, int) __MINGW_ATTRIB_CONST; +_CRTIMP unsigned long __cdecl __MINGW_NOTHROW _lrotr(unsigned long, int) __MINGW_ATTRIB_CONST; + +_CRTIMP int __cdecl __MINGW_NOTHROW _set_error_mode (int); + +# define _OUT_TO_DEFAULT 0 +# define _OUT_TO_STDERR 1 +# define _OUT_TO_MSGBOX 2 +# define _REPORT_ERRMODE 3 + +# if __MSVCRT_VERSION__ >= 0x800 +# ifndef _UINTPTR_T_DEFINED +# define _UINTPTR_T_DEFINED +# ifdef _WIN64 + typedef unsigned __int64 uintptr_t; +# else + typedef unsigned int uintptr_t; +# endif +# endif + +_CRTIMP unsigned int __cdecl __MINGW_NOTHROW _set_abort_behavior (unsigned int, unsigned int); + /* These masks work with msvcr80.dll version 8.0.50215.44 (a beta release). */ -#define _WRITE_ABORT_MSG 1 -#define _CALL_REPORTFAULT 2 - -typedef void (* _invalid_parameter_handler) (const wchar_t *, - const wchar_t *, - const wchar_t *, - unsigned int, - uintptr_t); +# define _WRITE_ABORT_MSG 1 +# define _CALL_REPORTFAULT 2 + +typedef void +(* _invalid_parameter_handler) ( + const wchar_t *, + const wchar_t *, + const wchar_t *, + unsigned int, + uintptr_t); _invalid_parameter_handler _set_invalid_parameter_handler (_invalid_parameter_handler); -#endif /* __MSVCRT_VERSION__ >= 0x800 */ + +# endif /* __MSVCRT_VERSION__ >= 0x800 */ #endif /* __MSVCRT__ */ #ifndef _NO_OLDNAMES -_CRTIMP int __cdecl putenv (const char*); -_CRTIMP void __cdecl searchenv (const char*, const char*, char*); +_CRTIMP int __cdecl __MINGW_NOTHROW putenv (const char*); +_CRTIMP void __cdecl __MINGW_NOTHROW searchenv (const char*, const char*, char*); -_CRTIMP char* __cdecl itoa (int, char*, int); -_CRTIMP char* __cdecl ltoa (long, char*, int); +_CRTIMP char* __cdecl __MINGW_NOTHROW itoa (int, char*, int); +_CRTIMP char* __cdecl __MINGW_NOTHROW ltoa (long, char*, int); #ifndef _UWIN -_CRTIMP char* __cdecl ecvt (double, int, int*, int*); -_CRTIMP char* __cdecl fcvt (double, int, int*, int*); -_CRTIMP char* __cdecl gcvt (double, int, char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW ecvt (double, int, int*, int*); +_CRTIMP char* __cdecl __MINGW_NOTHROW fcvt (double, int, int*, int*); +_CRTIMP char* __cdecl __MINGW_NOTHROW gcvt (double, int, char*); #endif /* _UWIN */ #endif /* Not _NO_OLDNAMES */ @@ -477,45 +501,45 @@ _CRTIMP char* __cdecl gcvt (double, int, char*); #if !defined __NO_ISOCEXT /* externs in static libmingwex.a */ /* C99 name for _exit */ -void __cdecl _Exit(int) __MINGW_ATTRIB_NORETURN; +void __cdecl __MINGW_NOTHROW _Exit(int) __MINGW_ATTRIB_NORETURN; #ifndef __STRICT_ANSI__ /* inline using non-ansi functions */ -__CRT_INLINE void __cdecl _Exit(int __status) +__CRT_INLINE void __cdecl __MINGW_NOTHROW _Exit(int __status) { _exit (__status); } #endif typedef struct { long long quot, rem; } lldiv_t; -lldiv_t __cdecl lldiv (long long, long long) __MINGW_ATTRIB_CONST; +lldiv_t __cdecl __MINGW_NOTHROW lldiv (long long, long long) __MINGW_ATTRIB_CONST; -long long __cdecl llabs(long long); -__CRT_INLINE long long __cdecl llabs(long long _j) +long long __cdecl __MINGW_NOTHROW llabs(long long); +__CRT_INLINE long long __cdecl __MINGW_NOTHROW llabs(long long _j) {return (_j >= 0 ? _j : -_j);} -long long __cdecl strtoll (const char* __restrict__, char** __restrict, int); -unsigned long long __cdecl strtoull (const char* __restrict__, char** __restrict__, int); +long long __cdecl __MINGW_NOTHROW strtoll (const char* __restrict__, char** __restrict, int); +unsigned long long __cdecl __MINGW_NOTHROW strtoull (const char* __restrict__, char** __restrict__, int); #if defined (__MSVCRT__) /* these are stubs for MS _i64 versions */ -long long __cdecl atoll (const char *); +long long __cdecl __MINGW_NOTHROW atoll (const char *); #if !defined (__STRICT_ANSI__) -long long __cdecl wtoll (const wchar_t *); -char* __cdecl lltoa (long long, char *, int); -char* __cdecl ulltoa (unsigned long long , char *, int); -wchar_t* __cdecl lltow (long long, wchar_t *, int); -wchar_t* __cdecl ulltow (unsigned long long, wchar_t *, int); +long long __cdecl __MINGW_NOTHROW wtoll (const wchar_t *); +char* __cdecl __MINGW_NOTHROW lltoa (long long, char *, int); +char* __cdecl __MINGW_NOTHROW ulltoa (unsigned long long , char *, int); +wchar_t* __cdecl __MINGW_NOTHROW lltow (long long, wchar_t *, int); +wchar_t* __cdecl __MINGW_NOTHROW ulltow (unsigned long long, wchar_t *, int); /* inline using non-ansi functions */ -__CRT_INLINE long long __cdecl atoll (const char * _c) +__CRT_INLINE long long __cdecl __MINGW_NOTHROW atoll (const char * _c) { return _atoi64 (_c); } -__CRT_INLINE char* __cdecl lltoa (long long _n, char * _c, int _i) +__CRT_INLINE char* __cdecl __MINGW_NOTHROW lltoa (long long _n, char * _c, int _i) { return _i64toa (_n, _c, _i); } -__CRT_INLINE char* __cdecl ulltoa (unsigned long long _n, char * _c, int _i) +__CRT_INLINE char* __cdecl __MINGW_NOTHROW ulltoa (unsigned long long _n, char * _c, int _i) { return _ui64toa (_n, _c, _i); } -__CRT_INLINE long long __cdecl wtoll (const wchar_t * _w) +__CRT_INLINE long long __cdecl __MINGW_NOTHROW wtoll (const wchar_t * _w) { return _wtoi64 (_w); } -__CRT_INLINE wchar_t* __cdecl lltow (long long _n, wchar_t * _w, int _i) +__CRT_INLINE wchar_t* __cdecl __MINGW_NOTHROW lltow (long long _n, wchar_t * _w, int _i) { return _i64tow (_n, _w, _i); } -__CRT_INLINE wchar_t* __cdecl ulltow (unsigned long long _n, wchar_t * _w, int _i) +__CRT_INLINE wchar_t* __cdecl __MINGW_NOTHROW ulltow (unsigned long long _n, wchar_t * _w, int _i) { return _ui64tow (_n, _w, _i); } #endif /* (__STRICT_ANSI__) */ diff --git a/mingw/include/string.h b/mingw/include/string.h dissimilarity index 71% index 1047e501..62bdb3f1 100644 --- a/mingw/include/string.h +++ b/mingw/include/string.h @@ -1,193 +1,195 @@ -/* - * string.h - * This file has no copyright assigned and is placed in the Public Domain. - * This file is a part of the mingw-runtime package. - * No warranty is given; refer to the file DISCLAIMER within the package. - * - * Definitions for memory and string functions. - * - */ - -#ifndef _STRING_H_ -#define _STRING_H_ - -/* All the headers include this file. */ -#include <_mingw.h> - -/* - * Define size_t, wchar_t and NULL - */ -#define __need_size_t -#define __need_wchar_t -#define __need_NULL -#ifndef RC_INVOKED -#include -#endif /* Not RC_INVOKED */ - -#ifndef RC_INVOKED - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Prototypes of the ANSI Standard C library string functions. - */ -_CRTIMP void* __cdecl memchr (const void*, int, size_t) __MINGW_ATTRIB_PURE; -_CRTIMP int __cdecl memcmp (const void*, const void*, size_t) __MINGW_ATTRIB_PURE; -_CRTIMP void* __cdecl memcpy (void*, const void*, size_t); -_CRTIMP void* __cdecl memmove (void*, const void*, size_t); -_CRTIMP void* __cdecl memset (void*, int, size_t); -_CRTIMP char* __cdecl strcat (char*, const char*); -_CRTIMP char* __cdecl strchr (const char*, int) __MINGW_ATTRIB_PURE; -_CRTIMP int __cdecl strcmp (const char*, const char*) __MINGW_ATTRIB_PURE; -_CRTIMP int __cdecl strcoll (const char*, const char*); /* Compare using locale */ -_CRTIMP char* __cdecl strcpy (char*, const char*); -_CRTIMP size_t __cdecl strcspn (const char*, const char*) __MINGW_ATTRIB_PURE; -_CRTIMP char* __cdecl strerror (int); /* NOTE: NOT an old name wrapper. */ - -_CRTIMP size_t __cdecl strlen (const char*) __MINGW_ATTRIB_PURE; -_CRTIMP char* __cdecl strncat (char*, const char*, size_t); -_CRTIMP int __cdecl strncmp (const char*, const char*, size_t) __MINGW_ATTRIB_PURE; -_CRTIMP char* __cdecl strncpy (char*, const char*, size_t); -_CRTIMP char* __cdecl strpbrk (const char*, const char*) __MINGW_ATTRIB_PURE; -_CRTIMP char* __cdecl strrchr (const char*, int) __MINGW_ATTRIB_PURE; -_CRTIMP size_t __cdecl strspn (const char*, const char*) __MINGW_ATTRIB_PURE; -_CRTIMP char* __cdecl strstr (const char*, const char*) __MINGW_ATTRIB_PURE; -_CRTIMP char* __cdecl strtok (char*, const char*); -_CRTIMP size_t __cdecl strxfrm (char*, const char*, size_t); - -#ifndef __STRICT_ANSI__ -/* - * Extra non-ANSI functions provided by the CRTDLL library - */ -_CRTIMP char* __cdecl _strerror (const char *); -_CRTIMP void* __cdecl _memccpy (void*, const void*, int, size_t); -_CRTIMP int __cdecl _memicmp (const void*, const void*, size_t); -_CRTIMP char* __cdecl _strdup (const char*) __MINGW_ATTRIB_MALLOC; -_CRTIMP int __cdecl _strcmpi (const char*, const char*); -_CRTIMP int __cdecl _stricmp (const char*, const char*); -_CRTIMP int __cdecl _stricoll (const char*, const char*); -_CRTIMP char* __cdecl _strlwr (char*); -_CRTIMP int __cdecl _strnicmp (const char*, const char*, size_t); -_CRTIMP char* __cdecl _strnset (char*, int, size_t); -_CRTIMP char* __cdecl _strrev (char*); -_CRTIMP char* __cdecl _strset (char*, int); -_CRTIMP char* __cdecl _strupr (char*); -_CRTIMP void __cdecl _swab (const char*, char*, size_t); - -#ifdef __MSVCRT__ -_CRTIMP int __cdecl _strncoll(const char*, const char*, size_t); -_CRTIMP int __cdecl _strnicoll(const char*, const char*, size_t); -#endif - -#ifndef _NO_OLDNAMES -/* - * Non-underscored versions of non-ANSI functions. They live in liboldnames.a - * and provide a little extra portability. Also a few extra UNIX-isms like - * strcasecmp. - */ -_CRTIMP void* __cdecl memccpy (void*, const void*, int, size_t); -_CRTIMP int __cdecl memicmp (const void*, const void*, size_t); -_CRTIMP char* __cdecl strdup (const char*) __MINGW_ATTRIB_MALLOC; -_CRTIMP int __cdecl strcmpi (const char*, const char*); -_CRTIMP int __cdecl stricmp (const char*, const char*); -__CRT_INLINE int __cdecl -strcasecmp (const char * __sz1, const char * __sz2) - {return _stricmp (__sz1, __sz2);} -_CRTIMP int __cdecl stricoll (const char*, const char*); -_CRTIMP char* __cdecl strlwr (char*); -_CRTIMP int __cdecl strnicmp (const char*, const char*, size_t); -__CRT_INLINE int __cdecl -strncasecmp (const char * __sz1, const char * __sz2, size_t __sizeMaxCompare) - {return _strnicmp (__sz1, __sz2, __sizeMaxCompare);} -_CRTIMP char* __cdecl strnset (char*, int, size_t); -_CRTIMP char* __cdecl strrev (char*); -_CRTIMP char* __cdecl strset (char*, int); -_CRTIMP char* __cdecl strupr (char*); -#ifndef _UWIN -_CRTIMP void __cdecl swab (const char*, char*, size_t); -#endif /* _UWIN */ -#endif /* _NO_OLDNAMES */ - -#endif /* Not __STRICT_ANSI__ */ - -#ifndef _WSTRING_DEFINED -/* - * Unicode versions of the standard calls. - * Also in wchar.h, where they belong according to ISO standard. - */ -_CRTIMP wchar_t* __cdecl wcscat (wchar_t*, const wchar_t*); -_CRTIMP wchar_t* __cdecl wcschr (const wchar_t*, wchar_t); -_CRTIMP int __cdecl wcscmp (const wchar_t*, const wchar_t*); -_CRTIMP int __cdecl wcscoll (const wchar_t*, const wchar_t*); -_CRTIMP wchar_t* __cdecl wcscpy (wchar_t*, const wchar_t*); -_CRTIMP size_t __cdecl wcscspn (const wchar_t*, const wchar_t*); -/* Note: _wcserror requires __MSVCRT_VERSION__ >= 0x0700. */ -_CRTIMP size_t __cdecl wcslen (const wchar_t*); -_CRTIMP wchar_t* __cdecl wcsncat (wchar_t*, const wchar_t*, size_t); -_CRTIMP int __cdecl wcsncmp(const wchar_t*, const wchar_t*, size_t); -_CRTIMP wchar_t* __cdecl wcsncpy(wchar_t*, const wchar_t*, size_t); -_CRTIMP wchar_t* __cdecl wcspbrk(const wchar_t*, const wchar_t*); -_CRTIMP wchar_t* __cdecl wcsrchr(const wchar_t*, wchar_t); -_CRTIMP size_t __cdecl wcsspn(const wchar_t*, const wchar_t*); -_CRTIMP wchar_t* __cdecl wcsstr(const wchar_t*, const wchar_t*); -_CRTIMP wchar_t* __cdecl wcstok(wchar_t*, const wchar_t*); -_CRTIMP size_t __cdecl wcsxfrm(wchar_t*, const wchar_t*, size_t); - -#ifndef __STRICT_ANSI__ -/* - * Unicode versions of non-ANSI string functions provided by CRTDLL. - */ - -/* NOTE: _wcscmpi not provided by CRTDLL, this define is for portability */ -#define _wcscmpi _wcsicmp - -_CRTIMP wchar_t* __cdecl _wcsdup (const wchar_t*); -_CRTIMP int __cdecl _wcsicmp (const wchar_t*, const wchar_t*); -_CRTIMP int __cdecl _wcsicoll (const wchar_t*, const wchar_t*); -_CRTIMP wchar_t* __cdecl _wcslwr (wchar_t*); -_CRTIMP int __cdecl _wcsnicmp (const wchar_t*, const wchar_t*, size_t); -_CRTIMP wchar_t* __cdecl _wcsnset (wchar_t*, wchar_t, size_t); -_CRTIMP wchar_t* __cdecl _wcsrev (wchar_t*); -_CRTIMP wchar_t* __cdecl _wcsset (wchar_t*, wchar_t); -_CRTIMP wchar_t* __cdecl _wcsupr (wchar_t*); - -#ifdef __MSVCRT__ -_CRTIMP int __cdecl _wcsncoll(const wchar_t*, const wchar_t*, size_t); -_CRTIMP int __cdecl _wcsnicoll(const wchar_t*, const wchar_t*, size_t); -#if __MSVCRT_VERSION__ >= 0x0700 -_CRTIMP wchar_t* __cdecl _wcserror(int); -_CRTIMP wchar_t* __cdecl __wcserror(const wchar_t*); -#endif -#endif - -#ifndef _NO_OLDNAMES -/* NOTE: There is no _wcscmpi, but this is for compatibility. */ -int __cdecl wcscmpi (const wchar_t * __ws1, const wchar_t * __ws2); -__CRT_INLINE int __cdecl -wcscmpi (const wchar_t * __ws1, const wchar_t * __ws2) - {return _wcsicmp (__ws1, __ws2);} -_CRTIMP wchar_t* __cdecl wcsdup (const wchar_t*); -_CRTIMP int __cdecl wcsicmp (const wchar_t*, const wchar_t*); -_CRTIMP int __cdecl wcsicoll (const wchar_t*, const wchar_t*); -_CRTIMP wchar_t* __cdecl wcslwr (wchar_t*); -_CRTIMP int __cdecl wcsnicmp (const wchar_t*, const wchar_t*, size_t); -_CRTIMP wchar_t* __cdecl wcsnset (wchar_t*, wchar_t, size_t); -_CRTIMP wchar_t* __cdecl wcsrev (wchar_t*); -_CRTIMP wchar_t* __cdecl wcsset (wchar_t*, wchar_t); -_CRTIMP wchar_t* __cdecl wcsupr (wchar_t*); -#endif /* Not _NO_OLDNAMES */ - -#endif /* Not strict ANSI */ - -#define _WSTRING_DEFINED -#endif /* _WSTRING_DEFINED */ - -#ifdef __cplusplus -} -#endif - -#endif /* Not RC_INVOKED */ - -#endif /* Not _STRING_H_ */ +/* + * string.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Definitions for memory and string functions. + * + */ + +#ifndef _STRING_H_ +#define _STRING_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +/* + * Define size_t, wchar_t and NULL + */ +#define __need_size_t +#define __need_wchar_t +#define __need_NULL +#ifndef RC_INVOKED +#include +#endif /* Not RC_INVOKED */ + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Prototypes of the ANSI Standard C library string functions. + */ +_CRTIMP void* __cdecl __MINGW_NOTHROW memchr (const void*, int, size_t) __MINGW_ATTRIB_PURE; +_CRTIMP int __cdecl __MINGW_NOTHROW memcmp (const void*, const void*, size_t) __MINGW_ATTRIB_PURE; +_CRTIMP void* __cdecl __MINGW_NOTHROW memcpy (void*, const void*, size_t); +_CRTIMP void* __cdecl __MINGW_NOTHROW memmove (void*, const void*, size_t); +_CRTIMP void* __cdecl __MINGW_NOTHROW memset (void*, int, size_t); +_CRTIMP char* __cdecl __MINGW_NOTHROW strcat (char*, const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW strchr (const char*, int) __MINGW_ATTRIB_PURE; +_CRTIMP int __cdecl __MINGW_NOTHROW strcmp (const char*, const char*) __MINGW_ATTRIB_PURE; +_CRTIMP int __cdecl __MINGW_NOTHROW strcoll (const char*, const char*); /* Compare using locale */ +_CRTIMP char* __cdecl __MINGW_NOTHROW strcpy (char*, const char*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW strcspn (const char*, const char*) __MINGW_ATTRIB_PURE; +_CRTIMP char* __cdecl __MINGW_NOTHROW strerror (int); /* NOTE: NOT an old name wrapper. */ + +_CRTIMP size_t __cdecl __MINGW_NOTHROW strlen (const char*) __MINGW_ATTRIB_PURE; +_CRTIMP char* __cdecl __MINGW_NOTHROW strncat (char*, const char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW strncmp (const char*, const char*, size_t) __MINGW_ATTRIB_PURE; +_CRTIMP char* __cdecl __MINGW_NOTHROW strncpy (char*, const char*, size_t); +_CRTIMP char* __cdecl __MINGW_NOTHROW strpbrk (const char*, const char*) __MINGW_ATTRIB_PURE; +_CRTIMP char* __cdecl __MINGW_NOTHROW strrchr (const char*, int) __MINGW_ATTRIB_PURE; +_CRTIMP size_t __cdecl __MINGW_NOTHROW strspn (const char*, const char*) __MINGW_ATTRIB_PURE; +_CRTIMP char* __cdecl __MINGW_NOTHROW strstr (const char*, const char*) __MINGW_ATTRIB_PURE; +_CRTIMP char* __cdecl __MINGW_NOTHROW strtok (char*, const char*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW strxfrm (char*, const char*, size_t); + +#ifndef __STRICT_ANSI__ +/* + * Extra non-ANSI functions provided by the CRTDLL library + */ +_CRTIMP char* __cdecl __MINGW_NOTHROW _strerror (const char *); +_CRTIMP void* __cdecl __MINGW_NOTHROW _memccpy (void*, const void*, int, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _memicmp (const void*, const void*, size_t); +_CRTIMP char* __cdecl __MINGW_NOTHROW _strdup (const char*) __MINGW_ATTRIB_MALLOC; +_CRTIMP int __cdecl __MINGW_NOTHROW _strcmpi (const char*, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _stricmp (const char*, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _stricoll (const char*, const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _strlwr (char*); +_CRTIMP int __cdecl __MINGW_NOTHROW _strnicmp (const char*, const char*, size_t); +_CRTIMP char* __cdecl __MINGW_NOTHROW _strnset (char*, int, size_t); +_CRTIMP char* __cdecl __MINGW_NOTHROW _strrev (char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _strset (char*, int); +_CRTIMP char* __cdecl __MINGW_NOTHROW _strupr (char*); +_CRTIMP void __cdecl __MINGW_NOTHROW _swab (const char*, char*, size_t); + +#ifdef __MSVCRT__ +_CRTIMP int __cdecl __MINGW_NOTHROW _strncoll(const char*, const char*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _strnicoll(const char*, const char*, size_t); +#endif + +#ifndef _NO_OLDNAMES +/* + * Non-underscored versions of non-ANSI functions. They live in liboldnames.a + * and provide a little extra portability. Also a few extra UNIX-isms like + * strcasecmp. + */ +_CRTIMP void* __cdecl __MINGW_NOTHROW memccpy (void*, const void*, int, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW memicmp (const void*, const void*, size_t); +_CRTIMP char* __cdecl __MINGW_NOTHROW strdup (const char*) __MINGW_ATTRIB_MALLOC; +_CRTIMP int __cdecl __MINGW_NOTHROW strcmpi (const char*, const char*); +_CRTIMP int __cdecl __MINGW_NOTHROW stricmp (const char*, const char*); +__CRT_INLINE int __cdecl __MINGW_NOTHROW strcasecmp (const char*, const char *); +__CRT_INLINE int __cdecl __MINGW_NOTHROW +strcasecmp (const char * __sz1, const char * __sz2) + {return _stricmp (__sz1, __sz2);} +_CRTIMP int __cdecl __MINGW_NOTHROW stricoll (const char*, const char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW strlwr (char*); +_CRTIMP int __cdecl __MINGW_NOTHROW strnicmp (const char*, const char*, size_t); +__CRT_INLINE int __cdecl __MINGW_NOTHROW strncasecmp (const char *, const char *, size_t); +__CRT_INLINE int __cdecl __MINGW_NOTHROW +strncasecmp (const char * __sz1, const char * __sz2, size_t __sizeMaxCompare) + {return _strnicmp (__sz1, __sz2, __sizeMaxCompare);} +_CRTIMP char* __cdecl __MINGW_NOTHROW strnset (char*, int, size_t); +_CRTIMP char* __cdecl __MINGW_NOTHROW strrev (char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW strset (char*, int); +_CRTIMP char* __cdecl __MINGW_NOTHROW strupr (char*); +#ifndef _UWIN +_CRTIMP void __cdecl __MINGW_NOTHROW swab (const char*, char*, size_t); +#endif /* _UWIN */ +#endif /* _NO_OLDNAMES */ + +#endif /* Not __STRICT_ANSI__ */ + +#ifndef _WSTRING_DEFINED +/* + * Unicode versions of the standard calls. + * Also in wchar.h, where they belong according to ISO standard. + */ +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcscat (wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcschr (const wchar_t*, wchar_t); +_CRTIMP int __cdecl __MINGW_NOTHROW wcscmp (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW wcscoll (const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcscpy (wchar_t*, const wchar_t*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcscspn (const wchar_t*, const wchar_t*); +/* Note: _wcserror requires __MSVCRT_VERSION__ >= 0x0700. */ +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcslen (const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsncat (wchar_t*, const wchar_t*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW wcsncmp(const wchar_t*, const wchar_t*, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsncpy(wchar_t*, const wchar_t*, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcspbrk(const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsrchr(const wchar_t*, wchar_t); +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcsspn(const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsstr(const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcstok(wchar_t*, const wchar_t*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcsxfrm(wchar_t*, const wchar_t*, size_t); + +#ifndef __STRICT_ANSI__ +/* + * Unicode versions of non-ANSI string functions provided by CRTDLL. + */ + +/* NOTE: _wcscmpi not provided by CRTDLL, this define is for portability */ +#define _wcscmpi _wcsicmp + +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsdup (const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsicmp (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsicoll (const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcslwr (wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsnicmp (const wchar_t*, const wchar_t*, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsnset (wchar_t*, wchar_t, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsrev (wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsset (wchar_t*, wchar_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsupr (wchar_t*); + +#ifdef __MSVCRT__ +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsncoll(const wchar_t*, const wchar_t*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsnicoll(const wchar_t*, const wchar_t*, size_t); +#if __MSVCRT_VERSION__ >= 0x0700 +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcserror(int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW __wcserror(const wchar_t*); +#endif +#endif + +#ifndef _NO_OLDNAMES +/* NOTE: There is no _wcscmpi, but this is for compatibility. */ +int __cdecl __MINGW_NOTHROW wcscmpi (const wchar_t * __ws1, const wchar_t * __ws2); +__CRT_INLINE int __cdecl __MINGW_NOTHROW +wcscmpi (const wchar_t * __ws1, const wchar_t * __ws2) + {return _wcsicmp (__ws1, __ws2);} +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsdup (const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW wcsicmp (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW wcsicoll (const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcslwr (wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW wcsnicmp (const wchar_t*, const wchar_t*, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsnset (wchar_t*, wchar_t, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsrev (wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsset (wchar_t*, wchar_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsupr (wchar_t*); +#endif /* Not _NO_OLDNAMES */ + +#endif /* Not strict ANSI */ + +#define _WSTRING_DEFINED +#endif /* _WSTRING_DEFINED */ + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _STRING_H_ */ diff --git a/mingw/include/sys/fcntl.h b/mingw/include/sys/fcntl.h new file mode 100644 index 00000000..a2090bc8 --- /dev/null +++ b/mingw/include/sys/fcntl.h @@ -0,0 +1,7 @@ +/* + * This file is part of the Mingw32 package. + * + * This fcntl.h maps to the root fcntl.h + */ + +#include diff --git a/mingw/include/sys/file.h b/mingw/include/sys/file.h new file mode 100644 index 00000000..e95654c0 --- /dev/null +++ b/mingw/include/sys/file.h @@ -0,0 +1,7 @@ +/* + * This file is part of the Mingw32 package. + * + * This file.h maps to the root fcntl.h + * TODO? + */ +#include diff --git a/mingw/include/sys/locking.h b/mingw/include/sys/locking.h new file mode 100644 index 00000000..eee5e3c5 --- /dev/null +++ b/mingw/include/sys/locking.h @@ -0,0 +1,31 @@ +/* + * locking.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Constants for the mode parameter of the locking function. + * + */ + +#ifndef _LOCKING_H_ +#define _LOCKING_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#define _LK_UNLCK 0 /* Unlock */ +#define _LK_LOCK 1 /* Lock */ +#define _LK_NBLCK 2 /* Non-blocking lock */ +#define _LK_RLCK 3 /* Lock for read only */ +#define _LK_NBRLCK 4 /* Non-blocking lock for read only */ + +#ifndef NO_OLDNAMES +#define LK_UNLCK _LK_UNLCK +#define LK_LOCK _LK_LOCK +#define LK_NBLCK _LK_NBLCK +#define LK_RLCK _LK_RLCK +#define LK_NBRLCK _LK_NBRLCK +#endif /* Not NO_OLDNAMES */ + +#endif /* Not _LOCKING_H_ */ diff --git a/mingw/include/sys/stat.h b/mingw/include/sys/stat.h index e0d01eb1..3bd46271 100644 --- a/mingw/include/sys/stat.h +++ b/mingw/include/sys/stat.h @@ -103,14 +103,14 @@ struct _stat /* NOTE: Must be the same as _stat above. */ struct stat { - _dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */ - _ino_t st_ino; /* Always zero ? */ - _mode_t st_mode; /* See above constants */ + dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */ + ino_t st_ino; /* Always zero ? */ + mode_t st_mode; /* See above constants */ short st_nlink; /* Number of links. */ short st_uid; /* User: Maybe significant on NT ? */ short st_gid; /* Group: Ditto */ - _dev_t st_rdev; /* Seems useless (not even filled in) */ - _off_t st_size; /* File size in bytes */ + dev_t st_rdev; /* Seems useless (not even filled in) */ + off_t st_size; /* File size in bytes */ time_t st_atime; /* Accessed date (always 00:00 hrs local * on FAT) */ time_t st_mtime; /* Modified time */ @@ -122,7 +122,7 @@ struct stat struct _stati64 { _dev_t st_dev; _ino_t st_ino; - unsigned short st_mode; + _mode_t st_mode; short st_nlink; short st_uid; short st_gid; @@ -132,7 +132,7 @@ struct _stati64 { time_t st_mtime; time_t st_ctime; }; - +#if __MSVCRT_VERSION__ >= 0x0601 struct __stat64 { _dev_t st_dev; @@ -147,6 +147,7 @@ struct __stat64 __time64_t st_mtime; __time64_t st_ctime; }; +#endif /* __MSVCRT_VERSION__ */ #endif /* __MSVCRT__ */ #define _STAT_DEFINED #endif /* _STAT_DEFINED */ @@ -155,32 +156,32 @@ struct __stat64 extern "C" { #endif -_CRTIMP int __cdecl _fstat (int, struct _stat*); -_CRTIMP int __cdecl _chmod (const char*, int); -_CRTIMP int __cdecl _stat (const char*, struct _stat*); +_CRTIMP int __cdecl __MINGW_NOTHROW _fstat (int, struct _stat*); +_CRTIMP int __cdecl __MINGW_NOTHROW _chmod (const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _stat (const char*, struct _stat*); #ifndef _NO_OLDNAMES /* These functions live in liboldnames.a. */ -_CRTIMP int __cdecl fstat (int, struct stat*); -_CRTIMP int __cdecl chmod (const char*, int); -_CRTIMP int __cdecl stat (const char*, struct stat*); +_CRTIMP int __cdecl __MINGW_NOTHROW fstat (int, struct stat*); +_CRTIMP int __cdecl __MINGW_NOTHROW chmod (const char*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW stat (const char*, struct stat*); #endif /* Not _NO_OLDNAMES */ #if defined (__MSVCRT__) -_CRTIMP int __cdecl _fstati64(int, struct _stati64 *); -_CRTIMP int __cdecl _stati64(const char *, struct _stati64 *); +_CRTIMP int __cdecl __MINGW_NOTHROW _fstati64(int, struct _stati64 *); +_CRTIMP int __cdecl __MINGW_NOTHROW _stati64(const char *, struct _stati64 *); /* These require newer versions of msvcrt.dll (6.10 or higher). */ #if __MSVCRT_VERSION__ >= 0x0601 -_CRTIMP int __cdecl _fstat64 (int, struct __stat64*); -_CRTIMP int __cdecl _stat64 (const char*, struct __stat64*); +_CRTIMP int __cdecl __MINGW_NOTHROW _fstat64 (int, struct __stat64*); +_CRTIMP int __cdecl __MINGW_NOTHROW _stat64 (const char*, struct __stat64*); #endif /* __MSVCRT_VERSION__ >= 0x0601 */ #if !defined ( _WSTAT_DEFINED) /* also declared in wchar.h */ -_CRTIMP int __cdecl _wstat(const wchar_t*, struct _stat*); -_CRTIMP int __cdecl _wstati64 (const wchar_t*, struct _stati64*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wstat(const wchar_t*, struct _stat*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wstati64 (const wchar_t*, struct _stati64*); #if __MSVCRT_VERSION__ >= 0x0601 -_CRTIMP int __cdecl _wstat64 (const wchar_t*, struct __stat64*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wstat64 (const wchar_t*, struct __stat64*); #endif /* __MSVCRT_VERSION__ >= 0x0601 */ #define _WSTAT_DEFINED #endif /* _WSTAT_DEFIND */ diff --git a/mingw/include/sys/time.h b/mingw/include/sys/time.h index 17a3960a..b689d736 100644 --- a/mingw/include/sys/time.h +++ b/mingw/include/sys/time.h @@ -36,7 +36,7 @@ struct timezone The timezone pointer arg is ignored. Errors are ignored. */ -int __cdecl gettimeofday(struct timeval *__restrict__, +int __cdecl __MINGW_NOTHROW gettimeofday(struct timeval *__restrict__, void *__restrict__ /* tzp (unused) */); #ifdef __cplusplus diff --git a/mingw/include/sys/timeb.h b/mingw/include/sys/timeb.h new file mode 100644 index 00000000..24af3673 --- /dev/null +++ b/mingw/include/sys/timeb.h @@ -0,0 +1,74 @@ +/* + * timeb.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Support for the UNIX System V ftime system call. + * + */ + +#ifndef _TIMEB_H_ +#define _TIMEB_H_ + +/* All the headers include this file. */ +#include <_mingw.h> +#include + +#ifndef RC_INVOKED + +/* + * TODO: Structure not tested. + */ +struct _timeb +{ + time_t time; + short millitm; + short timezone; + short dstflag; +}; + +#ifndef _NO_OLDNAMES +/* + * TODO: Structure not tested. + */ +struct timeb +{ + time_t time; + short millitm; + short timezone; + short dstflag; +}; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* TODO: Not tested. */ +_CRTIMP void __cdecl __MINGW_NOTHROW _ftime (struct _timeb*); + +#ifndef _NO_OLDNAMES +_CRTIMP void __cdecl __MINGW_NOTHROW ftime (struct timeb*); +#endif /* Not _NO_OLDNAMES */ + +/* This requires newer versions of msvcrt.dll (6.10 or higher). */ +#if __MSVCRT_VERSION__ >= 0x0601 +struct __timeb64 +{ + __time64_t time; + short millitm; + short timezone; + short dstflag; +}; + +_CRTIMP void __cdecl __MINGW_NOTHROW _ftime64 (struct __timeb64*); +#endif /* __MSVCRT_VERSION__ >= 0x0601 */ + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _TIMEB_H_ */ diff --git a/mingw/include/sys/types.h b/mingw/include/sys/types.h index 2bc04e75..ed25e527 100644 --- a/mingw/include/sys/types.h +++ b/mingw/include/sys/types.h @@ -115,6 +115,10 @@ typedef long long fpos64_t; typedef long long off64_t; #endif +#if !defined __NO_ISOCEXT +typedef unsigned int useconds_t; +#endif /* Not __NO_ISOCEXT */ + #endif /* Not RC_INVOKED */ #endif /* Not _TYPES_H_ */ diff --git a/mingw/include/sys/unistd.h b/mingw/include/sys/unistd.h new file mode 100644 index 00000000..39eac4a9 --- /dev/null +++ b/mingw/include/sys/unistd.h @@ -0,0 +1,6 @@ +/* + * This file is part of the Mingw32 package. + * + * unistd.h maps (roughly) to io.h + */ +#include diff --git a/mingw/include/sys/utime.h b/mingw/include/sys/utime.h index 75cfeb45..b4447925 100644 --- a/mingw/include/sys/utime.h +++ b/mingw/include/sys/utime.h @@ -41,36 +41,35 @@ struct utimbuf }; #endif /* Not _NO_OLDNAMES */ -struct __utimbuf64 -{ - __time64_t actime; - __time64_t modtime; -}; - - #ifdef __cplusplus extern "C" { #endif -_CRTIMP int __cdecl _utime (const char*, struct _utimbuf*); +_CRTIMP int __cdecl __MINGW_NOTHROW _utime (const char*, struct _utimbuf*); #ifndef _NO_OLDNAMES -_CRTIMP int __cdecl utime (const char*, struct utimbuf*); +_CRTIMP int __cdecl __MINGW_NOTHROW utime (const char*, struct utimbuf*); #endif /* Not _NO_OLDNAMES */ -_CRTIMP int __cdecl _futime (int, struct _utimbuf*); +_CRTIMP int __cdecl __MINGW_NOTHROW _futime (int, struct _utimbuf*); /* The wide character version, only available for MSVCRT versions of the * C runtime library. */ #ifdef __MSVCRT__ -_CRTIMP int __cdecl _wutime (const wchar_t*, struct _utimbuf*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wutime (const wchar_t*, struct _utimbuf*); #endif /* MSVCRT runtime */ /* These require newer versions of msvcrt.dll (6.10 or higher). */ #if __MSVCRT_VERSION__ >= 0x0601 -_CRTIMP int __cdecl _utime64 (const char*, struct __utimbuf64*); -_CRTIMP int __cdecl _wutime64 (const wchar_t*, struct __utimbuf64*); -_CRTIMP int __cdecl _futime64 (int, struct __utimbuf64*); +struct __utimbuf64 +{ + __time64_t actime; + __time64_t modtime; +}; + +_CRTIMP int __cdecl __MINGW_NOTHROW _utime64 (const char*, struct __utimbuf64*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wutime64 (const wchar_t*, struct __utimbuf64*); +_CRTIMP int __cdecl __MINGW_NOTHROW _futime64 (int, struct __utimbuf64*); #endif /* __MSVCRT_VERSION__ >= 0x0601 */ #ifdef __cplusplus diff --git a/mingw/include/tchar.h b/mingw/include/tchar.h index a07d75f4..f6805626 100644 --- a/mingw/include/tchar.h +++ b/mingw/include/tchar.h @@ -188,6 +188,7 @@ typedef wchar_t _TCHAR; #define _tgetenv _wgetenv #define _tputenv _wputenv #define _tsearchenv _wsearchenv +#define _tsystem _wsystem #define _tmakepath _wmakepath #define _tsplitpath _wsplitpath #define _tfullpath _wfullpath @@ -282,6 +283,7 @@ typedef char _TCHAR; #define _tgetenv getenv #define _tputenv _putenv #define _tsearchenv _searchenv +#define _tsystem system #define _tmakepath _makepath #define _tsplitpath _splitpath #define _tfullpath _fullpath diff --git a/mingw/include/time.h b/mingw/include/time.h index 13d4d163..804778f4 100644 --- a/mingw/include/time.h +++ b/mingw/include/time.h @@ -81,10 +81,10 @@ struct tm extern "C" { #endif -_CRTIMP clock_t __cdecl clock (void); -_CRTIMP time_t __cdecl time (time_t*); -_CRTIMP double __cdecl difftime (time_t, time_t); -_CRTIMP time_t __cdecl mktime (struct tm*); +_CRTIMP clock_t __cdecl __MINGW_NOTHROW clock (void); +_CRTIMP time_t __cdecl __MINGW_NOTHROW time (time_t*); +_CRTIMP double __cdecl __MINGW_NOTHROW difftime (time_t, time_t); +_CRTIMP time_t __cdecl __MINGW_NOTHROW mktime (struct tm*); /* * These functions write to and return pointers to static buffers that may @@ -96,31 +96,31 @@ _CRTIMP time_t __cdecl mktime (struct tm*); * Fault and crap out your program. Guess how I know. Hint: stat called on * a directory gives 'invalid' times in st_atime etc... */ -_CRTIMP char* __cdecl asctime (const struct tm*); -_CRTIMP char* __cdecl ctime (const time_t*); -_CRTIMP struct tm* __cdecl gmtime (const time_t*); -_CRTIMP struct tm* __cdecl localtime (const time_t*); +_CRTIMP char* __cdecl __MINGW_NOTHROW asctime (const struct tm*); +_CRTIMP char* __cdecl __MINGW_NOTHROW ctime (const time_t*); +_CRTIMP struct tm* __cdecl __MINGW_NOTHROW gmtime (const time_t*); +_CRTIMP struct tm* __cdecl __MINGW_NOTHROW localtime (const time_t*); -_CRTIMP size_t __cdecl strftime (char*, size_t, const char*, const struct tm*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW strftime (char*, size_t, const char*, const struct tm*); #ifndef __STRICT_ANSI__ -extern _CRTIMP void __cdecl _tzset (void); +extern _CRTIMP void __cdecl __MINGW_NOTHROW _tzset (void); #ifndef _NO_OLDNAMES -extern _CRTIMP void __cdecl tzset (void); +extern _CRTIMP void __cdecl __MINGW_NOTHROW tzset (void); #endif -_CRTIMP char* __cdecl _strdate(char*); -_CRTIMP char* __cdecl _strtime(char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _strdate(char*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _strtime(char*); /* These require newer versions of msvcrt.dll (6.10 or higher). */ #if __MSVCRT_VERSION__ >= 0x0601 -_CRTIMP __time64_t __cdecl _time64( __time64_t*); -_CRTIMP __time64_t __cdecl _mktime64 (struct tm*); -_CRTIMP char* __cdecl _ctime64 (const __time64_t*); -_CRTIMP struct tm* __cdecl _gmtime64 (const __time64_t*); -_CRTIMP struct tm* __cdecl _localtime64 (const __time64_t*); +_CRTIMP __time64_t __cdecl __MINGW_NOTHROW _time64( __time64_t*); +_CRTIMP __time64_t __cdecl __MINGW_NOTHROW _mktime64 (struct tm*); +_CRTIMP char* __cdecl __MINGW_NOTHROW _ctime64 (const __time64_t*); +_CRTIMP struct tm* __cdecl __MINGW_NOTHROW _gmtime64 (const __time64_t*); +_CRTIMP struct tm* __cdecl __MINGW_NOTHROW _localtime64 (const __time64_t*); #endif /* __MSVCRT_VERSION__ >= 0x0601 */ /* @@ -132,9 +132,9 @@ _CRTIMP struct tm* __cdecl _localtime64 (const __time64_t*); #ifdef __MSVCRT__ /* These are for compatibility with pre-VC 5.0 suppied MSVCRT. */ -extern _CRTIMP int* __cdecl __p__daylight (void); -extern _CRTIMP long* __cdecl __p__timezone (void); -extern _CRTIMP char** __cdecl __p__tzname (void); +extern _CRTIMP int* __cdecl __MINGW_NOTHROW __p__daylight (void); +extern _CRTIMP long* __cdecl __MINGW_NOTHROW __p__timezone (void); +extern _CRTIMP char** __cdecl __MINGW_NOTHROW __p__tzname (void); __MINGW_IMPORT int _daylight; __MINGW_IMPORT long _timezone; @@ -195,16 +195,16 @@ __MINGW_IMPORT char *tzname[2]; /* wide function prototypes, also declared in wchar.h */ #ifndef __STRICT_ANSI__ #ifdef __MSVCRT__ -_CRTIMP wchar_t* __cdecl _wasctime(const struct tm*); -_CRTIMP wchar_t* __cdecl _wctime(const time_t*); -_CRTIMP wchar_t* __cdecl _wstrdate(wchar_t*); -_CRTIMP wchar_t* __cdecl _wstrtime(wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wasctime(const struct tm*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wctime(const time_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wstrdate(wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wstrtime(wchar_t*); #if __MSVCRT_VERSION__ >= 0x0601 -_CRTIMP wchar_t* __cdecl _wctime64 (const __time64_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wctime64 (const __time64_t*); #endif #endif /* __MSVCRT__ */ #endif /* __STRICT_ANSI__ */ -_CRTIMP size_t __cdecl wcsftime (wchar_t*, size_t, const wchar_t*, const struct tm*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcsftime (wchar_t*, size_t, const wchar_t*, const struct tm*); #define _WTIME_DEFINED #endif /* _WTIME_DEFINED */ diff --git a/mingw/include/unistd.h b/mingw/include/unistd.h index 90934a0e..3e7f2364 100644 --- a/mingw/include/unistd.h +++ b/mingw/include/unistd.h @@ -1,18 +1,17 @@ +#ifndef _UNISTD_H /* * This file is part of the Mingw32 package. * * unistd.h maps (roughly) to io.h + * Other headers included by unistd.h may be selectively processed; + * __UNISTD_H_SOURCED__ enables such selective processing. */ - -#ifndef _UNISTD_H #define _UNISTD_H +#define __UNISTD_H_SOURCED__ 1 #include #include - -#define __UNISTD_GETOPT__ #include -#undef __UNISTD_GETOPT__ /* These are also defined in stdio.h. */ #ifndef SEEK_SET @@ -31,6 +30,11 @@ extern "C" { #endif +#if !defined __NO_ISOCEXT +#include /* For useconds_t. */ + +int __cdecl __MINGW_NOTHROW usleep(useconds_t useconds); +#endif /* Not __NO_ISOCEXT */ /* This is defined as a real library function to allow autoconf to verify its existence. */ @@ -44,4 +48,5 @@ __CRT_INLINE int ftruncate(int __fd, off_t __length) } #endif +#undef __UNISTD_H_SOURCED__ #endif /* _UNISTD_H */ diff --git a/mingw/include/values.h b/mingw/include/values.h new file mode 100644 index 00000000..10e16a28 --- /dev/null +++ b/mingw/include/values.h @@ -0,0 +1,4 @@ +/* + * TODO: Nothing here yet. Should provide UNIX compatibility constants + * comparible to those in limits.h and float.h. + */ diff --git a/mingw/include/varargs.h b/mingw/include/varargs.h new file mode 100644 index 00000000..c1197e97 --- /dev/null +++ b/mingw/include/varargs.h @@ -0,0 +1,7 @@ +/* + * This is just an RC_INVOKED guard for the real varargs.h + * fixincluded in gcc system dir. One day we will delete this file. + */ +#ifndef RC_INVOKED +#include_next +#endif diff --git a/mingw/include/wchar.h b/mingw/include/wchar.h new file mode 100644 index 00000000..be769527 --- /dev/null +++ b/mingw/include/wchar.h @@ -0,0 +1,518 @@ +/* + * wchar.h + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + * Defines of all functions for supporting wide characters. Actually it + * just includes all those headers, which is not a good thing to do from a + * processing time point of view, but it does mean that everything will be + * in sync. + * + */ + +#ifndef _WCHAR_H_ +#define _WCHAR_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#ifndef RC_INVOKED + +#define __need_size_t +#define __need_wint_t +#define __need_wchar_t +#define __need_NULL +#include + +#ifndef __VALIST +#if defined __GNUC__ && __GNUC__ >= 3 +#define __need___va_list +#include +#define __VALIST __builtin_va_list +#else +#define __VALIST char* +#endif +#endif + +#endif /* Not RC_INVOKED */ + +/* + * MSDN says that isw* char classifications are in wchar.h and wctype.h. + * Although the wctype names are ANSI, their exposure in this header is + * not. + */ +#include + +#ifndef __STRICT_ANSI__ +/* This is necessary to support the the non-ANSI wchar declarations + here. */ +#include +#endif /* __STRICT_ANSI__ */ + +#define WCHAR_MIN 0 +#define WCHAR_MAX 0xffff + +#ifndef WEOF +#define WEOF (wchar_t)(0xFFFF) +#endif + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _FILE_DEFINED /* Also in stdio.h */ +#define _FILE_DEFINED +typedef struct _iobuf +{ + char* _ptr; + int _cnt; + char* _base; + int _flag; + int _file; + int _charbuf; + int _bufsiz; + char* _tmpfname; +} FILE; +#endif /* Not _FILE_DEFINED */ + +#ifndef _TIME_T_DEFINED /* Also in time.h */ +typedef long time_t; +#define _TIME_T_DEFINED +#endif + +#ifndef _TM_DEFINED /* Also in time.h */ +struct tm { + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years since 1900 */ + int tm_wday; /* days since Sunday - [0,6] */ + int tm_yday; /* days since January 1 - [0,365] */ + int tm_isdst; /* daylight savings time flag */ + }; +#define _TM_DEFINED +#endif + +#ifndef _WSTDIO_DEFINED +/* Also in stdio.h - keep in sync */ +_CRTIMP int __cdecl __MINGW_NOTHROW fwprintf (FILE*, const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW wprintf (const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW _snwprintf (wchar_t*, size_t, const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW vfwprintf (FILE*, const wchar_t*, __VALIST); +_CRTIMP int __cdecl __MINGW_NOTHROW vwprintf (const wchar_t*, __VALIST); +_CRTIMP int __cdecl __MINGW_NOTHROW _vsnwprintf (wchar_t*, size_t, const wchar_t*, __VALIST); +_CRTIMP int __cdecl __MINGW_NOTHROW fwscanf (FILE*, const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW wscanf (const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW swscanf (const wchar_t*, const wchar_t*, ...); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW fgetwc (FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW fputwc (wchar_t, FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW ungetwc (wchar_t, FILE*); + +/* These differ from the ISO C prototypes, which have a maxlen parameter like snprintf. */ +#ifndef __STRICT_ANSI__ +_CRTIMP int __cdecl __MINGW_NOTHROW swprintf (wchar_t*, const wchar_t*, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW vswprintf (wchar_t*, const wchar_t*, __VALIST); +#endif + +#ifdef __MSVCRT__ +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW fgetws (wchar_t*, int, FILE*); +_CRTIMP int __cdecl __MINGW_NOTHROW fputws (const wchar_t*, FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW getwc (FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW getwchar (void); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW putwc (wint_t, FILE*); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW putwchar (wint_t); +#ifndef __STRICT_ANSI__ +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _getws (wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _putws (const wchar_t*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wfdopen(int, const wchar_t *); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wfopen (const wchar_t*, const wchar_t*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wfreopen (const wchar_t*, const wchar_t*, FILE*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wfsopen (const wchar_t*, const wchar_t*, int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wtmpnam (wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wtempnam (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wrename (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wremove (const wchar_t*); +_CRTIMP void __cdecl __MINGW_NOTHROW _wperror (const wchar_t*); +_CRTIMP FILE* __cdecl __MINGW_NOTHROW _wpopen (const wchar_t*, const wchar_t*); +#endif /* __STRICT_ANSI__ */ +#endif /* __MSVCRT__ */ + +#ifndef __NO_ISOCEXT /* externs in libmingwex.a */ +int __cdecl __MINGW_NOTHROW snwprintf (wchar_t* s, size_t n, const wchar_t* format, ...); +__CRT_INLINE int __cdecl __MINGW_NOTHROW +vsnwprintf (wchar_t* s, size_t n, const wchar_t* format, __VALIST arg) + { return _vsnwprintf ( s, n, format, arg);} +int __cdecl __MINGW_NOTHROW vwscanf (const wchar_t * __restrict__, __VALIST); +int __cdecl __MINGW_NOTHROW vfwscanf (FILE * __restrict__, + const wchar_t * __restrict__, __VALIST); +int __cdecl __MINGW_NOTHROW vswscanf (const wchar_t * __restrict__, + const wchar_t * __restrict__, __VALIST); +#endif + +#define _WSTDIO_DEFINED +#endif /* _WSTDIO_DEFINED */ + +#ifndef _WSTDLIB_DEFINED /* also declared in stdlib.h */ +_CRTIMP long __cdecl __MINGW_NOTHROW wcstol (const wchar_t*, wchar_t**, int); +_CRTIMP unsigned long __cdecl __MINGW_NOTHROW wcstoul (const wchar_t*, wchar_t**, int); +_CRTIMP double __cdecl __MINGW_NOTHROW wcstod (const wchar_t*, wchar_t**); +#if !defined __NO_ISOCEXT /* in libmingwex.a */ +float __cdecl __MINGW_NOTHROW wcstof (const wchar_t * __restrict__, wchar_t ** __restrict__); +long double __cdecl __MINGW_NOTHROW wcstold (const wchar_t * __restrict__, wchar_t ** __restrict__); +#endif /* __NO_ISOCEXT */ +#ifdef __MSVCRT__ +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wgetenv(const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wputenv(const wchar_t*); +_CRTIMP void __cdecl __MINGW_NOTHROW _wsearchenv(const wchar_t*, const wchar_t*, wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wsystem(const wchar_t*); +_CRTIMP void __cdecl __MINGW_NOTHROW _wmakepath(wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*); +_CRTIMP void __cdecl __MINGW_NOTHROW _wsplitpath (const wchar_t*, wchar_t*, wchar_t*, wchar_t*, wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wfullpath (wchar_t*, const wchar_t*, size_t); +#endif +#define _WSTDLIB_DEFINED +#endif /* _WSTDLIB_DEFINED */ + +#ifndef _WTIME_DEFINED +#ifndef __STRICT_ANSI__ +#ifdef __MSVCRT__ +/* wide function prototypes, also declared in time.h */ +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wasctime (const struct tm*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wctime (const time_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wstrdate (wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wstrtime (wchar_t*); +#if __MSVCRT_VERSION__ >= 0x601 +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wctime64 (const __time64_t*); +#endif +#endif /* __MSVCRT__ */ +#endif /* __STRICT_ANSI__ */ +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcsftime (wchar_t*, size_t, const wchar_t*, const struct tm*); +#define _WTIME_DEFINED +#endif /* _WTIME_DEFINED */ + + +#ifndef _WSTRING_DEFINED +/* + * Unicode versions of the standard string calls. + * Also in string.h. + */ +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcscat (wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcschr (const wchar_t*, wchar_t); +_CRTIMP int __cdecl __MINGW_NOTHROW wcscmp (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW wcscoll (const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcscpy (wchar_t*, const wchar_t*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcscspn (const wchar_t*, const wchar_t*); +/* Note: _wcserror requires __MSVCRT_VERSION__ >= 0x0700. */ +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcslen (const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsncat (wchar_t*, const wchar_t*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW wcsncmp(const wchar_t*, const wchar_t*, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsncpy(wchar_t*, const wchar_t*, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcspbrk(const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsrchr(const wchar_t*, wchar_t); +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcsspn(const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsstr(const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcstok(wchar_t*, const wchar_t*); +_CRTIMP size_t __cdecl __MINGW_NOTHROW wcsxfrm(wchar_t*, const wchar_t*, size_t); + +#ifndef __STRICT_ANSI__ +/* + * Unicode versions of non-ANSI functions provided by CRTDLL. + */ + +/* NOTE: _wcscmpi not provided by CRTDLL, this define is for portability */ +#define _wcscmpi _wcsicmp + +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsdup (const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsicmp (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsicoll (const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcslwr (wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsnicmp (const wchar_t*, const wchar_t*, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsnset (wchar_t*, wchar_t, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsrev (wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsset (wchar_t*, wchar_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcsupr (wchar_t*); + +#ifdef __MSVCRT__ +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsncoll(const wchar_t*, const wchar_t*, size_t); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcsnicoll(const wchar_t*, const wchar_t*, size_t); +#if __MSVCRT_VERSION__ >= 0x0700 +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wcserror(int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW __wcserror(const wchar_t*); +#endif +#endif + +#ifndef _NO_OLDNAMES +/* NOTE: There is no _wcscmpi, but this is for compatibility. */ +__CRT_INLINE int __cdecl __MINGW_NOTHROW +wcscmpi (const wchar_t * __ws1, const wchar_t * __ws2) + {return _wcsicmp (__ws1, __ws2);} +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsdup (const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW wcsicmp (const wchar_t*, const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW wcsicoll (const wchar_t*, const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcslwr (wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW wcsnicmp (const wchar_t*, const wchar_t*, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsnset (wchar_t*, wchar_t, size_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsrev (wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsset (wchar_t*, wchar_t); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW wcsupr (wchar_t*); +#endif /* Not _NO_OLDNAMES */ + +#endif /* Not strict ANSI */ + +#define _WSTRING_DEFINED +#endif /* _WSTRING_DEFINED */ + +/* These are resolved by -lmingwex. Alternatively, they can be resolved by + adding -lmsvcp60 to your command line, which will give you the VC++ + versions of these functions. If you want the latter and don't have + msvcp60.dll in your windows system directory, you can easily obtain + it with a search from your favorite search engine. */ +#ifndef __STRICT_ANSI__ +typedef wchar_t _Wint_t; +#endif + +typedef int mbstate_t; + +wint_t __cdecl __MINGW_NOTHROW btowc(int); +size_t __cdecl __MINGW_NOTHROW mbrlen(const char * __restrict__, size_t, + mbstate_t * __restrict__); +size_t __cdecl __MINGW_NOTHROW mbrtowc(wchar_t * __restrict__, const char * __restrict__, + size_t, mbstate_t * __restrict__); +size_t __cdecl __MINGW_NOTHROW mbsrtowcs(wchar_t * __restrict__, const char ** __restrict__, + size_t, mbstate_t * __restrict__); +size_t __cdecl __MINGW_NOTHROW wcrtomb(char * __restrict__, wchar_t, + mbstate_t * __restrict__); +size_t __cdecl __MINGW_NOTHROW wcsrtombs(char * __restrict__, const wchar_t ** __restrict__, + size_t, mbstate_t * __restrict__); +int __cdecl __MINGW_NOTHROW wctob(wint_t); + +#ifndef __NO_ISOCEXT /* these need static lib libmingwex.a */ +int __cdecl __MINGW_NOTHROW fwide(FILE*, int); +int __cdecl __MINGW_NOTHROW mbsinit(const mbstate_t*); +#ifndef __NO_INLINE__ +__CRT_INLINE int __cdecl __MINGW_NOTHROW fwide(FILE* __UNUSED_PARAM(stream), + int mode) + {return mode;} /* Nothing to do */ +__CRT_INLINE int __cdecl __MINGW_NOTHROW mbsinit(const mbstate_t* __UNUSED_PARAM(ps)) + {return 1;} +#endif +wchar_t* __cdecl __MINGW_NOTHROW wmemset(wchar_t *, wchar_t, size_t); +wchar_t* __cdecl __MINGW_NOTHROW wmemchr(const wchar_t*, wchar_t, size_t); +int wmemcmp(const wchar_t*, const wchar_t *, size_t); +wchar_t* __cdecl __MINGW_NOTHROW wmemcpy(wchar_t* __restrict__, + const wchar_t* __restrict__, + size_t); +wchar_t* __cdecl __MINGW_NOTHROW wmemmove(wchar_t* s1, const wchar_t *, size_t); +long long __cdecl __MINGW_NOTHROW wcstoll(const wchar_t * __restrict__, + wchar_t** __restrict__, int); +unsigned long long __cdecl __MINGW_NOTHROW wcstoull(const wchar_t * __restrict__, + wchar_t ** __restrict__, int); +#endif /* __NO_ISOCEXT */ + +#ifndef __STRICT_ANSI__ +/* non-ANSI wide char functions from io.h, direct.h, sys/stat.h and locale.h. */ + +#ifndef _FSIZE_T_DEFINED +typedef unsigned long _fsize_t; +#define _FSIZE_T_DEFINED +#endif + +#ifndef _WFINDDATA_T_DEFINED +struct _wfinddata_t { + unsigned attrib; + time_t time_create; /* -1 for FAT file systems */ + time_t time_access; /* -1 for FAT file systems */ + time_t time_write; + _fsize_t size; + wchar_t name[260]; /* may include spaces. */ +}; +struct _wfinddatai64_t { + unsigned attrib; + time_t time_create; + time_t time_access; + time_t time_write; + __int64 size; + wchar_t name[260]; +}; +#if __MSVCRT_VERSION__ >= 0x0601 +struct __wfinddata64_t { + unsigned attrib; + __time64_t time_create; + __time64_t time_access; + __time64_t time_write; +/* 8 bytes are returned so it can't be _fsize_t */ + __int64 size; + wchar_t name[260]; +}; +#endif +#define _WFINDDATA_T_DEFINED +#endif + +/* Wide character versions. Also defined in io.h. */ +/* CHECK: I believe these only exist in MSVCRT, and not in CRTDLL. Also + applies to other wide character versions? */ +#if !defined (_WIO_DEFINED) +#if defined (__MSVCRT__) +#include /* For intptr_t. */ +_CRTIMP int __cdecl __MINGW_NOTHROW _waccess (const wchar_t*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _wchmod (const wchar_t*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _wcreat (const wchar_t*, int); +_CRTIMP long __cdecl __MINGW_NOTHROW _wfindfirst (const wchar_t*, struct _wfinddata_t *); +_CRTIMP int __cdecl __MINGW_NOTHROW _wfindnext (long, struct _wfinddata_t *); +_CRTIMP int __cdecl __MINGW_NOTHROW _wunlink (const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wopen (const wchar_t*, int, ...); +_CRTIMP int __cdecl __MINGW_NOTHROW _wsopen (const wchar_t*, int, int, ...); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wmktemp (wchar_t*); +_CRTIMP long __cdecl __MINGW_NOTHROW _wfindfirsti64 (const wchar_t*, struct _wfinddatai64_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wfindnexti64 (long, struct _wfinddatai64_t*); +#if __MSVCRT_VERSION__ >= 0x0601 +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wfindfirst64(const wchar_t*, struct __wfinddata64_t*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wfindnext64(intptr_t, struct __wfinddata64_t*); +#endif /* __MSVCRT_VERSION__ >= 0x0601 */ +#endif /* defined (__MSVCRT__) */ +#define _WIO_DEFINED +#endif /* _WIO_DEFINED */ + +#ifndef _WDIRECT_DEFINED +/* Also in direct.h */ +#ifdef __MSVCRT__ +_CRTIMP int __cdecl __MINGW_NOTHROW _wchdir (const wchar_t*); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wgetcwd (wchar_t*, int); +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wgetdcwd (int, wchar_t*, int); +_CRTIMP int __cdecl __MINGW_NOTHROW _wmkdir (const wchar_t*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wrmdir (const wchar_t*); +#endif /* __MSVCRT__ */ +#define _WDIRECT_DEFINED +#endif /* _WDIRECT_DEFINED */ + +#ifndef _STAT_DEFINED +/* + * The structure manipulated and returned by stat and fstat. + * + * NOTE: If called on a directory the values in the time fields are not only + * invalid, they will cause localtime et. al. to return NULL. And calling + * asctime with a NULL pointer causes an Invalid Page Fault. So watch it! + */ +struct _stat +{ + _dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */ + _ino_t st_ino; /* Always zero ? */ + _mode_t st_mode; /* See above constants */ + short st_nlink; /* Number of links. */ + short st_uid; /* User: Maybe significant on NT ? */ + short st_gid; /* Group: Ditto */ + _dev_t st_rdev; /* Seems useless (not even filled in) */ + _off_t st_size; /* File size in bytes */ + time_t st_atime; /* Accessed date (always 00:00 hrs local + * on FAT) */ + time_t st_mtime; /* Modified time */ + time_t st_ctime; /* Creation time */ +}; + +#ifndef _NO_OLDNAMES +/* NOTE: Must be the same as _stat above. */ +struct stat +{ + dev_t st_dev; /* Equivalent to drive number 0=A 1=B ... */ + ino_t st_ino; /* Always zero ? */ + mode_t st_mode; /* See above constants */ + short st_nlink; /* Number of links. */ + short st_uid; /* User: Maybe significant on NT ? */ + short st_gid; /* Group: Ditto */ + dev_t st_rdev; /* Seems useless (not even filled in) */ + off_t st_size; /* File size in bytes */ + time_t st_atime; /* Accessed date (always 00:00 hrs local + * on FAT) */ + time_t st_mtime; /* Modified time */ + time_t st_ctime; /* Creation time */ +}; +#endif /* _NO_OLDNAMES */ + +#if defined (__MSVCRT__) +struct _stati64 { + _dev_t st_dev; + _ino_t st_ino; + unsigned short st_mode; + short st_nlink; + short st_uid; + short st_gid; + _dev_t st_rdev; + __int64 st_size; + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +}; + +#if __MSVCRT_VERSION__ >= 0x0601 +struct __stat64 +{ + _dev_t st_dev; + _ino_t st_ino; + _mode_t st_mode; + short st_nlink; + short st_uid; + short st_gid; + _dev_t st_rdev; + __int64 st_size; + __time64_t st_atime; + __time64_t st_mtime; + __time64_t st_ctime; +}; +#endif /* __MSVCRT_VERSION__ */ +#endif /* __MSVCRT__ */ +#define _STAT_DEFINED +#endif /* _STAT_DEFINED */ + +#if !defined ( _WSTAT_DEFINED) +/* also declared in sys/stat.h */ +#if defined __MSVCRT__ +_CRTIMP int __cdecl __MINGW_NOTHROW _wstat (const wchar_t*, struct _stat*); +_CRTIMP int __cdecl __MINGW_NOTHROW _wstati64 (const wchar_t*, struct _stati64*); +#if __MSVCRT_VERSION__ >= 0x0601 +_CRTIMP int __cdecl __MINGW_NOTHROW _wstat64 (const wchar_t*, struct __stat64*); +#endif /* __MSVCRT_VERSION__ >= 0x0601 */ +#endif /* __MSVCRT__ */ +#define _WSTAT_DEFINED +#endif /* ! _WSTAT_DEFIND */ + +#ifndef _WLOCALE_DEFINED /* also declared in locale.h */ +_CRTIMP wchar_t* __cdecl __MINGW_NOTHROW _wsetlocale (int, const wchar_t*); +#define _WLOCALE_DEFINED +#endif + +#ifndef _WPROCESS_DEFINED /* also declared in process.h */ +#include /* For intptr_t. */ +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wexecl (const wchar_t*, const wchar_t*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wexecle (const wchar_t*, const wchar_t*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wexeclp (const wchar_t*, const wchar_t*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wexeclpe (const wchar_t*, const wchar_t*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wexecv (const wchar_t*, const wchar_t* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wexecve (const wchar_t*, const wchar_t* const*, const wchar_t* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wexecvp (const wchar_t*, const wchar_t* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wexecvpe (const wchar_t*, const wchar_t* const*, const wchar_t* const*); + +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wspawnl (int, const wchar_t*, const wchar_t*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wspawnle (int, const wchar_t*, const wchar_t*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wspawnlp (int, const wchar_t*, const wchar_t*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wspawnlpe (int, const wchar_t*, const wchar_t*, ...); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wspawnv (int, const wchar_t*, const wchar_t* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wspawnve (int, const wchar_t*, const wchar_t* const*, const wchar_t* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wspawnvp (int, const wchar_t*, const wchar_t* const*); +_CRTIMP intptr_t __cdecl __MINGW_NOTHROW _wspawnvpe (int, const wchar_t*, const wchar_t* const*, const wchar_t* const*); + +#define _WPROCESS_DEFINED +#endif +#endif /* not __STRICT_ANSI__ */ + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* not _WCHAR_H_ */ + diff --git a/mingw/include/wctype.h b/mingw/include/wctype.h new file mode 100644 index 00000000..12660345 --- /dev/null +++ b/mingw/include/wctype.h @@ -0,0 +1,168 @@ +/* + * wctype.h + * + * Functions for testing wide character types and converting characters. + * + * This file is part of the Mingw32 package. + * + * Contributors: + * Created by Mumit Khan + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef _WCTYPE_H_ +#define _WCTYPE_H_ + +/* All the headers include this file. */ +#include <_mingw.h> + +#define __need_wchar_t +#define __need_wint_t +#ifndef RC_INVOKED +#include +#endif /* Not RC_INVOKED */ + +/* + * The following flags are used to tell iswctype and _isctype what character + * types you are looking for. + */ +#define _UPPER 0x0001 +#define _LOWER 0x0002 +#define _DIGIT 0x0004 +#define _SPACE 0x0008 +#define _PUNCT 0x0010 +#define _CONTROL 0x0020 +#define _BLANK 0x0040 +#define _HEX 0x0080 +#define _LEADBYTE 0x8000 + +#define _ALPHA 0x0103 + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WEOF +#define WEOF (wchar_t)(0xFFFF) +#endif + +#ifndef _WCTYPE_T_DEFINED +typedef wchar_t wctype_t; +#define _WCTYPE_T_DEFINED +#endif + +/* Wide character equivalents - also in ctype.h */ +_CRTIMP int __cdecl __MINGW_NOTHROW iswalnum(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswalpha(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswascii(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswcntrl(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswctype(wint_t, wctype_t); +_CRTIMP int __cdecl __MINGW_NOTHROW is_wctype(wint_t, wctype_t); /* Obsolete! */ +_CRTIMP int __cdecl __MINGW_NOTHROW iswdigit(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswgraph(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswlower(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswprint(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswpunct(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswspace(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswupper(wint_t); +_CRTIMP int __cdecl __MINGW_NOTHROW iswxdigit(wint_t); + +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ + || !defined __STRICT_ANSI__ || defined __cplusplus +int __cdecl __MINGW_NOTHROW iswblank (wint_t); +#endif + +/* Older MS docs uses wchar_t for arg and return type, while newer + online MS docs say arg is wint_t and return is int. + ISO C uses wint_t for both. */ +_CRTIMP wint_t __cdecl __MINGW_NOTHROW towlower (wint_t); +_CRTIMP wint_t __cdecl __MINGW_NOTHROW towupper (wint_t); + +_CRTIMP int __cdecl __MINGW_NOTHROW isleadbyte (int); + +/* Also in ctype.h */ + +#ifdef __DECLSPEC_SUPPORTED +# if __MSVCRT_VERSION__ <= 0x0700 + __MINGW_IMPORT unsigned short _ctype[]; +# endif +# ifdef __MSVCRT__ + __MINGW_IMPORT unsigned short* _pctype; +# else /* CRTDLL */ + __MINGW_IMPORT unsigned short* _pctype_dll; +# define _pctype _pctype_dll +# endif + +#else /* ! __DECLSPEC_SUPPORTED */ +# if __MSVCRT_VERSION__ <= 0x0700 + extern unsigned short** _imp___ctype; +# define _ctype (*_imp___ctype) +# endif +# ifdef __MSVCRT__ + extern unsigned short** _imp___pctype; +# define _pctype (*_imp___pctype) +# else /* CRTDLL */ + extern unsigned short** _imp___pctype_dll; +# define _pctype (*_imp___pctype_dll) +# endif /* CRTDLL */ +#endif /* __DECLSPEC_SUPPORTED */ + + +#if !(defined (__NO_INLINE__) || defined(__NO_CTYPE_INLINES) \ + || defined(__WCTYPE_INLINES_DEFINED)) +#define __WCTYPE_INLINES_DEFINED +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswalnum(wint_t wc) {return (iswctype(wc,_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswalpha(wint_t wc) {return (iswctype(wc,_ALPHA));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswascii(wint_t wc) {return ((wc & ~0x7F) ==0);} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswcntrl(wint_t wc) {return (iswctype(wc,_CONTROL));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswdigit(wint_t wc) {return (iswctype(wc,_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswgraph(wint_t wc) {return (iswctype(wc,_PUNCT|_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswlower(wint_t wc) {return (iswctype(wc,_LOWER));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswprint(wint_t wc) {return (iswctype(wc,_BLANK|_PUNCT|_ALPHA|_DIGIT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswpunct(wint_t wc) {return (iswctype(wc,_PUNCT));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswspace(wint_t wc) {return (iswctype(wc,_SPACE));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswupper(wint_t wc) {return (iswctype(wc,_UPPER));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswxdigit(wint_t wc) {return (iswctype(wc,_HEX));} +__CRT_INLINE int __cdecl __MINGW_NOTHROW isleadbyte(int c) {return (_pctype[(unsigned char)(c)] & _LEADBYTE);} + +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ + || !defined __STRICT_ANSI__ || defined __cplusplus +__CRT_INLINE int __cdecl __MINGW_NOTHROW iswblank (wint_t wc) + {return (iswctype(wc, _BLANK) || wc == L'\t');} +#endif + +#endif /* !(defined(__NO_CTYPE_INLINES) || defined(__WCTYPE_INLINES_DEFINED)) */ + +typedef wchar_t wctrans_t; + +/* These are resolved by libmingwex.a. Note, that they are also exported + by the MS C++ runtime lib (msvcp60.dll). The msvcp60.dll implementations + of wctrans and towctrans are not C99 compliant in that wctrans("tolower") + returns 0, while std specifies that a non-zero value should be returned + for a valid string descriptor. If you want the MS behaviour (and you have + msvcp60.dll in your path) add -lmsvcp60 to your command line. */ + +wint_t __cdecl __MINGW_NOTHROW towctrans(wint_t, wctrans_t); +wctrans_t __cdecl __MINGW_NOTHROW wctrans(const char*); +wctype_t __cdecl __MINGW_NOTHROW wctype(const char*); + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _WCTYPE_H_ */ + diff --git a/mingw/info/cpp.info b/mingw/info/cpp.info new file mode 100644 index 00000000..b1ebf712 --- /dev/null +++ b/mingw/info/cpp.info @@ -0,0 +1,5166 @@ +This is doc/cpp.info, produced by makeinfo version 4.8 from +/home/gdr/build/gcc-3.4.5/gcc-3.4.5/gcc/doc/cpp.texi. + + Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004 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.1 or +any later version published by the Free Software Foundation. A copy of +the license is included in the section entitled "GNU Free Documentation +License". + + This manual contains no Invariant Sections. The Front-Cover Texts +are (a) (see below), and the Back-Cover Texts are (b) (see below). + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU +software. Copies published by the Free Software Foundation raise +funds for GNU development. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* Cpp: (cpp). The GNU C preprocessor. +END-INFO-DIR-ENTRY + + +File: cpp.info, Node: Top, Next: Overview, Up: (dir) + +The C Preprocessor +****************** + +The C preprocessor implements the macro language used to transform C, +C++, and Objective-C programs before they are compiled. It can also be +useful on its own. + +* Menu: + +* Overview:: +* Header Files:: +* Macros:: +* Conditionals:: +* Diagnostics:: +* Line Control:: +* Pragmas:: +* Other Directives:: +* Preprocessor Output:: +* Traditional Mode:: +* Implementation Details:: +* Invocation:: +* Environment Variables:: +* GNU Free Documentation License:: +* Index of Directives:: +* Option Index:: +* Concept Index:: + + --- The Detailed Node Listing --- + +Overview + +* Character sets:: +* Initial processing:: +* Tokenization:: +* The preprocessing language:: + +Header Files + +* Include Syntax:: +* Include Operation:: +* Search Path:: +* Once-Only Headers:: +* Computed Includes:: +* Wrapper Headers:: +* System Headers:: + +Macros + +* Object-like Macros:: +* Function-like Macros:: +* Macro Arguments:: +* Stringification:: +* Concatenation:: +* Variadic Macros:: +* Predefined Macros:: +* Undefining and Redefining Macros:: +* Directives Within Macro Arguments:: +* Macro Pitfalls:: + +Predefined Macros + +* Standard Predefined Macros:: +* Common Predefined Macros:: +* System-specific Predefined Macros:: +* C++ Named Operators:: + +Macro Pitfalls + +* Misnesting:: +* Operator Precedence Problems:: +* Swallowing the Semicolon:: +* Duplication of Side Effects:: +* Self-Referential Macros:: +* Argument Prescan:: +* Newlines in Arguments:: + +Conditionals + +* Conditional Uses:: +* Conditional Syntax:: +* Deleted Code:: + +Conditional Syntax + +* Ifdef:: +* If:: +* Defined:: +* Else:: +* Elif:: + +Implementation Details + +* Implementation-defined behavior:: +* Implementation limits:: +* Obsolete Features:: +* Differences from previous versions:: + +Obsolete Features + +* Assertions:: +* Obsolete once-only headers:: + + Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004 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.1 or +any later version published by the Free Software Foundation. A copy of +the license is included in the section entitled "GNU Free Documentation +License". + + This manual contains no Invariant Sections. The Front-Cover Texts +are (a) (see below), and the Back-Cover Texts are (b) (see below). + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU +software. Copies published by the Free Software Foundation raise +funds for GNU development. + + +File: cpp.info, Node: Overview, Next: Header Files, Prev: Top, Up: Top + +1 Overview +********** + +The C preprocessor, often known as "cpp", is a "macro processor" that +is used automatically by the C compiler to transform your program +before compilation. It is called a macro processor because it allows +you to define "macros", which are brief abbreviations for longer +constructs. + + The C preprocessor is intended to be used only with C, C++, and +Objective-C source code. In the past, it has been abused as a general +text processor. It will choke on input which does not obey C's lexical +rules. For example, apostrophes will be interpreted as the beginning of +character constants, and cause errors. Also, you cannot rely on it +preserving characteristics of the input which are not significant to +C-family languages. If a Makefile is preprocessed, all the hard tabs +will be removed, and the Makefile will not work. + + Having said that, you can often get away with using cpp on things +which are not C. Other Algol-ish programming languages are often safe +(Pascal, Ada, etc.) So is assembly, with caution. `-traditional-cpp' +mode preserves more white space, and is otherwise more permissive. Many +of the problems can be avoided by writing C or C++ style comments +instead of native language comments, and keeping macros simple. + + Wherever possible, you should use a preprocessor geared to the +language you are writing in. Modern versions of the GNU assembler have +macro facilities. Most high level programming languages have their own +conditional compilation and inclusion mechanism. If all else fails, +try a true general text processor, such as GNU M4. + + C preprocessors vary in some details. This manual discusses the GNU +C preprocessor, which provides a small superset of the features of ISO +Standard C. In its default mode, the GNU C preprocessor does not do a +few things required by the standard. These are features which are +rarely, if ever, used, and may cause surprising changes to the meaning +of a program which does not expect them. To get strict ISO Standard C, +you should use the `-std=c89' or `-std=c99' options, depending on which +version of the standard you want. To get all the mandatory +diagnostics, you must also use `-pedantic'. *Note Invocation::. + + This manual describes the behavior of the ISO preprocessor. To +minimize gratuitous differences, where the ISO preprocessor's behavior +does not conflict with traditional semantics, the traditional +preprocessor should behave the same way. The various differences that +do exist are detailed in the section *Note Traditional Mode::. + + For clarity, unless noted otherwise, references to `CPP' in this +manual refer to GNU CPP. + +* Menu: + +* Character sets:: +* Initial processing:: +* Tokenization:: +* The preprocessing language:: + + +File: cpp.info, Node: Character sets, Next: Initial processing, Up: Overview + +1.1 Character sets +================== + +Source code character set processing in C and related languages is +rather complicated. The C standard discusses two character sets, but +there are really at least four. + + The files input to CPP might be in any character set at all. CPP's +very first action, before it even looks for line boundaries, is to +convert the file into the character set it uses for internal +processing. That set is what the C standard calls the "source" +character set. It must be isomorphic with ISO 10646, also known as +Unicode. CPP uses the UTF-8 encoding of Unicode. + + At present, GNU CPP does not implement conversion from arbitrary file +encodings to the source character set. Use of any encoding other than +plain ASCII or UTF-8, except in comments, will cause errors. Use of +encodings that are not strict supersets of ASCII, such as Shift JIS, +may cause errors even if non-ASCII characters appear only in comments. +We plan to fix this in the near future. + + All preprocessing work (the subject of the rest of this manual) is +carried out in the source character set. If you request textual output +from the preprocessor with the `-E' option, it will be in UTF-8. + + After preprocessing is complete, string and character constants are +converted again, into the "execution" character set. This character +set is under control of the user; the default is UTF-8, matching the +source character set. Wide string and character constants have their +own character set, which is not called out specifically in the +standard. Again, it is under control of the user. The default is +UTF-16 or UTF-32, whichever fits in the target's `wchar_t' type, in the +target machine's byte order.(1) Octal and hexadecimal escape sequences +do not undergo conversion; '\x12' has the value 0x12 regardless of the +currently selected execution character set. All other escapes are +replaced by the character in the source character set that they +represent, then converted to the execution character set, just like +unescaped characters. + + GCC does not permit the use of characters outside the ASCII range, +nor `\u' and `\U' escapes, in identifiers. We hope this will change +eventually, but there are problems with the standard semantics of such +"extended identifiers" which must be resolved through the ISO C and C++ +committees first. + + ---------- Footnotes ---------- + + (1) UTF-16 does not meet the requirements of the C standard for a +wide character set, but the choice of 16-bit `wchar_t' is enshrined in +some system ABIs so we cannot fix this. + + +File: cpp.info, Node: Initial processing, Next: Tokenization, Prev: Character sets, Up: Overview + +1.2 Initial processing +====================== + +The preprocessor performs a series of textual transformations on its +input. These happen before all other processing. Conceptually, they +happen in a rigid order, and the entire file is run through each +transformation before the next one begins. CPP actually does them all +at once, for performance reasons. These transformations correspond +roughly to the first three "phases of translation" described in the C +standard. + + 1. The input file is read into memory and broken into lines. + + Different systems use different conventions to indicate the end of + a line. GCC accepts the ASCII control sequences `LF', `CR LF' and + `CR' as end-of-line markers. These are the canonical sequences + used by Unix, DOS and VMS, and the classic Mac OS (before OSX) + respectively. You may therefore safely copy source code written + on any of those systems to a different one and use it without + conversion. (GCC may lose track of the current line number if a + file doesn't consistently use one convention, as sometimes happens + when it is edited on computers with different conventions that + share a network file system.) + + If the last line of any input file lacks an end-of-line marker, + the end of the file is considered to implicitly supply one. The C + standard says that this condition provokes undefined behavior, so + GCC will emit a warning message. + + 2. If trigraphs are enabled, they are replaced by their corresponding + single characters. By default GCC ignores trigraphs, but if you + request a strictly conforming mode with the `-std' option, or you + specify the `-trigraphs' option, then it converts them. + + These are nine three-character sequences, all starting with `??', + that are defined by ISO C to stand for single characters. They + permit obsolete systems that lack some of C's punctuation to use + C. For example, `??/' stands for `\', so '??/n' is a character + constant for a newline. + + Trigraphs are not popular and many compilers implement them + incorrectly. Portable code should not rely on trigraphs being + either converted or ignored. With `-Wtrigraphs' GCC will warn you + when a trigraph may change the meaning of your program if it were + converted. *Note Wtrigraphs::. + + In a string constant, you can prevent a sequence of question marks + from being confused with a trigraph by inserting a backslash + between the question marks, or by separating the string literal at + the trigraph and making use of string literal concatenation. + "(??\?)" is the string `(???)', not `(?]'. Traditional C + compilers do not recognize these idioms. + + The nine trigraphs and their replacements are + + Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- + Replacement: [ ] { } # \ ^ | ~ + + 3. Continued lines are merged into one long line. + + A continued line is a line which ends with a backslash, `\'. The + backslash is removed and the following line is joined with the + current one. No space is inserted, so you may split a line + anywhere, even in the middle of a word. (It is generally more + readable to split lines only at white space.) + + The trailing backslash on a continued line is commonly referred to + as a "backslash-newline". + + If there is white space between a backslash and the end of a line, + that is still a continued line. However, as this is usually the + result of an editing mistake, and many compilers will not accept + it as a continued line, GCC will warn you about it. + + 4. All comments are replaced with single spaces. + + There are two kinds of comments. "Block comments" begin with `/*' + and continue until the next `*/'. Block comments do not nest: + + /* this is /* one comment */ text outside comment + + "Line comments" begin with `//' and continue to the end of the + current line. Line comments do not nest either, but it does not + matter, because they would end in the same place anyway. + + // this is // one comment + text outside comment + + It is safe to put line comments inside block comments, or vice versa. + + /* block comment + // contains line comment + yet more comment + */ outside comment + + // line comment /* contains block comment */ + + But beware of commenting out one end of a block comment with a line +comment. + + // l.c. /* block comment begins + oops! this isn't a comment anymore */ + + Comments are not recognized within string literals. "/* blah */" is +the string constant `/* blah */', not an empty string. + + Line comments are not in the 1989 edition of the C standard, but they +are recognized by GCC as an extension. In C++ and in the 1999 edition +of the C standard, they are an official part of the language. + + Since these transformations happen before all other processing, you +can split a line mechanically with backslash-newline anywhere. You can +comment out the end of a line. You can continue a line comment onto the +next line with backslash-newline. You can even split `/*', `*/', and +`//' onto multiple lines with backslash-newline. For example: + + /\ + * + */ # /* + */ defi\ + ne FO\ + O 10\ + 20 + +is equivalent to `#define FOO 1020'. All these tricks are extremely +confusing and should not be used in code intended to be readable. + + There is no way to prevent a backslash at the end of a line from +being interpreted as a backslash-newline. This cannot affect any +correct program, however. + + +File: cpp.info, Node: Tokenization, Next: The preprocessing language, Prev: Initial processing, Up: Overview + +1.3 Tokenization +================ + +After the textual transformations are finished, the input file is +converted into a sequence of "preprocessing tokens". These mostly +correspond to the syntactic tokens used by the C compiler, but there are +a few differences. White space separates tokens; it is not itself a +token of any kind. Tokens do not have to be separated by white space, +but it is often necessary to avoid ambiguities. + + When faced with a sequence of characters that has more than one +possible tokenization, the preprocessor is greedy. It always makes +each token, starting from the left, as big as possible before moving on +to the next token. For instance, `a+++++b' is interpreted as +`a ++ ++ + b', not as `a ++ + ++ b', even though the latter +tokenization could be part of a valid C program and the former could +not. + + Once the input file is broken into tokens, the token boundaries never +change, except when the `##' preprocessing operator is used to paste +tokens together. *Note Concatenation::. For example, + + #define foo() bar + foo()baz + ==> bar baz + _not_ + ==> barbaz + + The compiler does not re-tokenize the preprocessor's output. Each +preprocessing token becomes one compiler token. + + Preprocessing tokens fall into five broad classes: identifiers, +preprocessing numbers, string literals, punctuators, and other. An +"identifier" is the same as an identifier in C: any sequence of +letters, digits, or underscores, which begins with a letter or +underscore. Keywords of C have no significance to the preprocessor; +they are ordinary identifiers. You can define a macro whose name is a +keyword, for instance. The only identifier which can be considered a +preprocessing keyword is `defined'. *Note Defined::. + + This is mostly true of other languages which use the C preprocessor. +However, a few of the keywords of C++ are significant even in the +preprocessor. *Note C++ Named Operators::. + + In the 1999 C standard, identifiers may contain letters which are not +part of the "basic source character set," at the implementation's +discretion (such as accented Latin letters, Greek letters, or Chinese +ideograms). This may be done with an extended character set, or the +`\u' and `\U' escape sequences. GCC does not presently implement +either feature in the preprocessor or the compiler. + + As an extension, GCC treats `$' as a letter. This is for +compatibility with some systems, such as VMS, where `$' is commonly +used in system-defined function and object names. `$' is not a letter +in strictly conforming mode, or if you specify the `-$' option. *Note +Invocation::. + + A "preprocessing number" has a rather bizarre definition. The +category includes all the normal integer and floating point constants +one expects of C, but also a number of other things one might not +initially recognize as a number. Formally, preprocessing numbers begin +with an optional period, a required decimal digit, and then continue +with any sequence of letters, digits, underscores, periods, and +exponents. Exponents are the two-character sequences `e+', `e-', `E+', +`E-', `p+', `p-', `P+', and `P-'. (The exponents that begin with `p' +or `P' are new to C99. They are used for hexadecimal floating-point +constants.) + + The purpose of this unusual definition is to isolate the preprocessor +from the full complexity of numeric constants. It does not have to +distinguish between lexically valid and invalid floating-point numbers, +which is complicated. The definition also permits you to split an +identifier at any position and get exactly two tokens, which can then be +pasted back together with the `##' operator. + + It's possible for preprocessing numbers to cause programs to be +misinterpreted. For example, `0xE+12' is a preprocessing number which +does not translate to any valid numeric constant, therefore a syntax +error. It does not mean `0xE + 12', which is what you might have +intended. + + "String literals" are string constants, character constants, and +header file names (the argument of `#include').(1) String constants +and character constants are straightforward: "..." or '...'. In either +case embedded quotes should be escaped with a backslash: '\'' is the +character constant for `''. There is no limit on the length of a +character constant, but the value of a character constant that contains +more than one character is implementation-defined. *Note +Implementation Details::. + + Header file names either look like string constants, "...", or are +written with angle brackets instead, <...>. In either case, backslash +is an ordinary character. There is no way to escape the closing quote +or angle bracket. The preprocessor looks for the header file in +different places depending on which form you use. *Note Include +Operation::. + + No string literal may extend past the end of a line. Older versions +of GCC accepted multi-line string constants. You may use continued +lines instead, or string constant concatenation. *Note Differences +from previous versions::. + + "Punctuators" are all the usual bits of punctuation which are +meaningful to C and C++. All but three of the punctuation characters in +ASCII are C punctuators. The exceptions are `@', `$', and ``'. In +addition, all the two- and three-character operators are punctuators. +There are also six "digraphs", which the C++ standard calls +"alternative tokens", which are merely alternate ways to spell other +punctuators. This is a second attempt to work around missing +punctuation in obsolete systems. It has no negative side effects, +unlike trigraphs, but does not cover as much ground. The digraphs and +their corresponding normal punctuators are: + + Digraph: <% %> <: :> %: %:%: + Punctuator: { } [ ] # ## + + Any other single character is considered "other." It is passed on to +the preprocessor's output unmolested. The C compiler will almost +certainly reject source code containing "other" tokens. In ASCII, the +only other characters are `@', `$', ``', and control characters other +than NUL (all bits zero). (Note that `$' is normally considered a +letter.) All characters with the high bit set (numeric range +0x7F-0xFF) are also "other" in the present implementation. This will +change when proper support for international character sets is added to +GCC. + + NUL is a special case because of the high probability that its +appearance is accidental, and because it may be invisible to the user +(many terminals do not display NUL at all). Within comments, NULs are +silently ignored, just as any other character would be. In running +text, NUL is considered white space. For example, these two directives +have the same meaning. + + #define X^@1 + #define X 1 + +(where `^@' is ASCII NUL). Within string or character constants, NULs +are preserved. In the latter two cases the preprocessor emits a +warning message. + + ---------- Footnotes ---------- + + (1) The C standard uses the term "string literal" to refer only to +what we are calling "string constants". + + +File: cpp.info, Node: The preprocessing language, Prev: Tokenization, Up: Overview + +1.4 The preprocessing language +============================== + +After tokenization, the stream of tokens may simply be passed straight +to the compiler's parser. However, if it contains any operations in the +"preprocessing language", it will be transformed first. This stage +corresponds roughly to the standard's "translation phase 4" and is what +most people think of as the preprocessor's job. + + The preprocessing language consists of "directives" to be executed +and "macros" to be expanded. Its primary capabilities are: + + * Inclusion of header files. These are files of declarations that + can be substituted into your program. + + * Macro expansion. You can define "macros", which are abbreviations + for arbitrary fragments of C code. The preprocessor will replace + the macros with their definitions throughout the program. Some + macros are automatically defined for you. + + * Conditional compilation. You can include or exclude parts of the + program according to various conditions. + + * Line control. If you use a program to combine or rearrange source + files into an intermediate file which is then compiled, you can + use line control to inform the compiler where each source line + originally came from. + + * Diagnostics. You can detect problems at compile time and issue + errors or warnings. + + There are a few more, less useful, features. + + Except for expansion of predefined macros, all these operations are +triggered with "preprocessing directives". Preprocessing directives +are lines in your program that start with `#'. Whitespace is allowed +before and after the `#'. The `#' is followed by an identifier, the +"directive name". It specifies the operation to perform. Directives +are commonly referred to as `#NAME' where NAME is the directive name. +For example, `#define' is the directive that defines a macro. + + The `#' which begins a directive cannot come from a macro expansion. +Also, the directive name is not macro expanded. Thus, if `foo' is +defined as a macro expanding to `define', that does not make `#foo' a +valid preprocessing directive. + + The set of valid directive names is fixed. Programs cannot define +new preprocessing directives. + + Some directives require arguments; these make up the rest of the +directive line and must be separated from the directive name by +whitespace. For example, `#define' must be followed by a macro name +and the intended expansion of the macro. + + A preprocessing directive cannot cover more than one line. The line +may, however, be continued with backslash-newline, or by a block comment +which extends past the end of the line. In either case, when the +directive is processed, the continuations have already been merged with +the first line to make one long line. + + +File: cpp.info, Node: Header Files, Next: Macros, Prev: Overview, Up: Top + +2 Header Files +************** + +A header file is a file containing C declarations and macro definitions +(*note Macros::) to be shared between several source files. You request +the use of a header file in your program by "including" it, with the C +preprocessing directive `#include'. + + Header files serve two purposes. + + * System header files declare the interfaces to parts of the + operating system. You include them in your program to supply the + definitions and declarations you need to invoke system calls and + libraries. + + * Your own header files contain declarations for interfaces between + the source files of your program. Each time you have a group of + related declarations and macro definitions all or most of which + are needed in several different source files, it is a good idea to + create a header file for them. + + Including a header file produces the same results as copying the +header file into each source file that needs it. Such copying would be +time-consuming and error-prone. With a header file, the related +declarations appear in only one place. If they need to be changed, they +can be changed in one place, and programs that include the header file +will automatically use the new version when next recompiled. The header +file eliminates the labor of finding and changing all the copies as well +as the risk that a failure to find one copy will result in +inconsistencies within a program. + + In C, the usual convention is to give header files names that end +with `.h'. It is most portable to use only letters, digits, dashes, and +underscores in header file names, and at most one dot. + +* Menu: + +* Include Syntax:: +* Include Operation:: +* Search Path:: +* Once-Only Headers:: +* Computed Includes:: +* Wrapper Headers:: +* System Headers:: + + +File: cpp.info, Node: Include Syntax, Next: Include Operation, Up: Header Files + +2.1 Include Syntax +================== + +Both user and system header files are included using the preprocessing +directive `#include'. It has two variants: + +`#include ' + This variant is used for system header files. It searches for a + file named FILE in a standard list of system directories. You can + prepend directories to this list with the `-I' option (*note + Invocation::). + +`#include "FILE"' + This variant is used for header files of your own program. It + searches for a file named FILE first in the directory containing + the current file, then in the same directories used for `'. + + The argument of `#include', whether delimited with quote marks or +angle brackets, behaves like a string constant in that comments are not +recognized, and macro names are not expanded. Thus, `#include ' +specifies inclusion of a system header file named `x/*y'. + + However, if backslashes occur within FILE, they are considered +ordinary text characters, not escape characters. None of the character +escape sequences appropriate to string constants in C are processed. +Thus, `#include "x\n\\y"' specifies a filename containing three +backslashes. (Some systems interpret `\' as a pathname separator. All +of these also interpret `/' the same way. It is most portable to use +only `/'.) + + It is an error if there is anything (other than comments) on the line +after the file name. + + +File: cpp.info, Node: Include Operation, Next: Search Path, Prev: Include Syntax, Up: Header Files + +2.2 Include Operation +===================== + +The `#include' directive works by directing the C preprocessor to scan +the specified file as input before continuing with the rest of the +current file. The output from the preprocessor contains the output +already generated, followed by the output resulting from the included +file, followed by the output that comes from the text after the +`#include' directive. For example, if you have a header file +`header.h' as follows, + + char *test (void); + +and a main program called `program.c' that uses the header file, like +this, + + int x; + #include "header.h" + + int + main (void) + { + puts (test ()); + } + +the compiler will see the same token stream as it would if `program.c' +read + + int x; + char *test (void); + + int + main (void) + { + puts (test ()); + } + + Included files are not limited to declarations and macro definitions; +those are merely the typical uses. Any fragment of a C program can be +included from another file. The include file could even contain the +beginning of a statement that is concluded in the containing file, or +the end of a statement that was started in the including file. However, +an included file must consist of complete tokens. Comments and string +literals which have not been closed by the end of an included file are +invalid. For error recovery, they are considered to end at the end of +the file. + + To avoid confusion, it is best if header files contain only complete +syntactic units--function declarations or definitions, type +declarations, etc. + + The line following the `#include' directive is always treated as a +separate line by the C preprocessor, even if the included file lacks a +final newline. + + +File: cpp.info, Node: Search Path, Next: Once-Only Headers, Prev: Include Operation, Up: Header Files + +2.3 Search Path +=============== + +GCC looks in several different places for headers. On a normal Unix +system, if you do not instruct it otherwise, it will look for headers +requested with `#include ' in: + + /usr/local/include + LIBDIR/gcc/TARGET/VERSION/include + /usr/TARGET/include + /usr/include + + For C++ programs, it will also look in `/usr/include/g++-v3', first. +In the above, TARGET is the canonical name of the system GCC was +configured to compile code for; often but not always the same as the +canonical name of the system it runs on. VERSION is the version of GCC +in use. + + You can add to this list with the `-IDIR' command line option. All +the directories named by `-I' are searched, in left-to-right order, +_before_ the default directories. The only exception is when `dir' is +already searched by default. In this case, the option is ignored and +the search order for system directories remains unchanged. + + Duplicate directories are removed from the quote and bracket search +chains before the two chains are merged to make the final search chain. +Thus, it is possible for a directory to occur twice in the final search +chain if it was specified in both the quote and bracket chains. + + You can prevent GCC from searching any of the default directories +with the `-nostdinc' option. This is useful when you are compiling an +operating system kernel or some other program that does not use the +standard C library facilities, or the standard C library itself. `-I' +options are not ignored as described above when `-nostdinc' is in +effect. + + GCC looks for headers requested with `#include "FILE"' first in the +directory containing the current file, then in the same places it would +have looked for a header requested with angle brackets. For example, +if `/usr/include/sys/stat.h' contains `#include "types.h"', GCC looks +for `types.h' first in `/usr/include/sys', then in its usual search +path. + + `#line' (*note Line Control::) does not change GCC's idea of the +directory containing the current file. + + You may put `-I-' at any point in your list of `-I' options. This +has two effects. First, directories appearing before the `-I-' in the +list are searched only for headers requested with quote marks. +Directories after `-I-' are searched for all headers. Second, the +directory containing the current file is not searched for anything, +unless it happens to be one of the directories named by an `-I' switch. + + `-I. -I-' is not the same as no `-I' options at all, and does not +cause the same behavior for `<>' includes that `""' includes get with +no special options. `-I.' searches the compiler's current working +directory for header files. That may or may not be the same as the +directory containing the current file. + + If you need to look for headers in a directory named `-', write +`-I./-'. + + There are several more ways to adjust the header search path. They +are generally less useful. *Note Invocation::. + + +File: cpp.info, Node: Once-Only Headers, Next: Computed Includes, Prev: Search Path, Up: Header Files + +2.4 Once-Only Headers +===================== + +If a header file happens to be included twice, the compiler will process +its contents twice. This is very likely to cause an error, e.g. when +the compiler sees the same structure definition twice. Even if it does +not, it will certainly waste time. + + The standard way to prevent this is to enclose the entire real +contents of the file in a conditional, like this: + + /* File foo. */ + #ifndef FILE_FOO_SEEN + #define FILE_FOO_SEEN + + THE ENTIRE FILE + + #endif /* !FILE_FOO_SEEN */ + + This construct is commonly known as a "wrapper #ifndef". When the +header is included again, the conditional will be false, because +`FILE_FOO_SEEN' is defined. The preprocessor will skip over the entire +contents of the file, and the compiler will not see it twice. + + CPP optimizes even further. It remembers when a header file has a +wrapper `#ifndef'. If a subsequent `#include' specifies that header, +and the macro in the `#ifndef' is still defined, it does not bother to +rescan the file at all. + + You can put comments outside the wrapper. They will not interfere +with this optimization. + + The macro `FILE_FOO_SEEN' is called the "controlling macro" or +"guard macro". In a user header file, the macro name should not begin +with `_'. In a system header file, it should begin with `__' to avoid +conflicts with user programs. In any kind of header file, the macro +name should contain the name of the file and some additional text, to +avoid conflicts with other header files. + + +File: cpp.info, Node: Computed Includes, Next: Wrapper Headers, Prev: Once-Only Headers, Up: Header Files + +2.5 Computed Includes +===================== + +Sometimes it is necessary to select one of several different header +files to be included into your program. They might specify +configuration parameters to be used on different sorts of operating +systems, for instance. You could do this with a series of conditionals, + + #if SYSTEM_1 + # include "system_1.h" + #elif SYSTEM_2 + # include "system_2.h" + #elif SYSTEM_3 + ... + #endif + + That rapidly becomes tedious. Instead, the preprocessor offers the +ability to use a macro for the header name. This is called a "computed +include". Instead of writing a header name as the direct argument of +`#include', you simply put a macro name there instead: + + #define SYSTEM_H "system_1.h" + ... + #include SYSTEM_H + +`SYSTEM_H' will be expanded, and the preprocessor will look for +`system_1.h' as if the `#include' had been written that way originally. +`SYSTEM_H' could be defined by your Makefile with a `-D' option. + + You must be careful when you define the macro. `#define' saves +tokens, not text. The preprocessor has no way of knowing that the macro +will be used as the argument of `#include', so it generates ordinary +tokens, not a header name. This is unlikely to cause problems if you +use double-quote includes, which are close enough to string constants. +If you use angle brackets, however, you may have trouble. + + The syntax of a computed include is actually a bit more general than +the above. If the first non-whitespace character after `#include' is +not `"' or `<', then the entire line is macro-expanded like running +text would be. + + If the line expands to a single string constant, the contents of that +string constant are the file to be included. CPP does not re-examine +the string for embedded quotes, but neither does it process backslash +escapes in the string. Therefore + + #define HEADER "a\"b" + #include HEADER + +looks for a file named `a\"b'. CPP searches for the file according to +the rules for double-quoted includes. + + If the line expands to a token stream beginning with a `<' token and +including a `>' token, then the tokens between the `<' and the first +`>' are combined to form the filename to be included. Any whitespace +between tokens is reduced to a single space; then any space after the +initial `<' is retained, but a trailing space before the closing `>' is +ignored. CPP searches for the file according to the rules for +angle-bracket includes. + + In either case, if there are any tokens on the line after the file +name, an error occurs and the directive is not processed. It is also +an error if the result of expansion does not match either of the two +expected forms. + + These rules are implementation-defined behavior according to the C +standard. To minimize the risk of different compilers interpreting your +computed includes differently, we recommend you use only a single +object-like macro which expands to a string constant. This will also +minimize confusion for people reading your program. + + +File: cpp.info, Node: Wrapper Headers, Next: System Headers, Prev: Computed Includes, Up: Header Files + +2.6 Wrapper Headers +=================== + +Sometimes it is necessary to adjust the contents of a system-provided +header file without editing it directly. GCC's `fixincludes' operation +does this, for example. One way to do that would be to create a new +header file with the same name and insert it in the search path before +the original header. That works fine as long as you're willing to +replace the old header entirely. But what if you want to refer to the +old header from the new one? + + You cannot simply include the old header with `#include'. That will +start from the beginning, and find your new header again. If your +header is not protected from multiple inclusion (*note Once-Only +Headers::), it will recurse infinitely and cause a fatal error. + + You could include the old header with an absolute pathname: + #include "/usr/include/old-header.h" + This works, but is not clean; should the system headers ever move, +you would have to edit the new headers to match. + + There is no way to solve this problem within the C standard, but you +can use the GNU extension `#include_next'. It means, "Include the +_next_ file with this name." This directive works like `#include' +except in searching for the specified file: it starts searching the +list of header file directories _after_ the directory in which the +current file was found. + + Suppose you specify `-I /usr/local/include', and the list of +directories to search also includes `/usr/include'; and suppose both +directories contain `signal.h'. Ordinary `#include ' finds +the file under `/usr/local/include'. If that file contains +`#include_next ', it starts searching after that directory, +and finds the file in `/usr/include'. + + `#include_next' does not distinguish between `' and `"FILE"' +inclusion, nor does it check that the file you specify has the same +name as the current file. It simply looks for the file named, starting +with the directory in the search path after the one where the current +file was found. + + The use of `#include_next' can lead to great confusion. We +recommend it be used only when there is no other alternative. In +particular, it should not be used in the headers belonging to a specific +program; it should be used only to make global corrections along the +lines of `fixincludes'. + + +File: cpp.info, Node: System Headers, Prev: Wrapper Headers, Up: Header Files + +2.7 System Headers +================== + +The header files declaring interfaces to the operating system and +runtime libraries often cannot be written in strictly conforming C. +Therefore, GCC gives code found in "system headers" special treatment. +All warnings, other than those generated by `#warning' (*note +Diagnostics::), are suppressed while GCC is processing a system header. +Macros defined in a system header are immune to a few warnings +wherever they are expanded. This immunity is granted on an ad-hoc +basis, when we find that a warning generates lots of false positives +because of code in macros defined in system headers. + + Normally, only the headers found in specific directories are +considered system headers. These directories are determined when GCC +is compiled. There are, however, two ways to make normal headers into +system headers. + + The `-isystem' command line option adds its argument to the list of +directories to search for headers, just like `-I'. Any headers found +in that directory will be considered system headers. + + All directories named by `-isystem' are searched _after_ all +directories named by `-I', no matter what their order was on the +command line. If the same directory is named by both `-I' and +`-isystem', the `-I' option is ignored. GCC provides an informative +message when this occurs if `-v' is used. + + There is also a directive, `#pragma GCC system_header', which tells +GCC to consider the rest of the current include file a system header, +no matter where it was found. Code that comes before the `#pragma' in +the file will not be affected. `#pragma GCC system_header' has no +effect in the primary source file. + + On very old systems, some of the pre-defined system header +directories get even more special treatment. GNU C++ considers code in +headers found in those directories to be surrounded by an `extern "C"' +block. There is no way to request this behavior with a `#pragma', or +from the command line. + + +File: cpp.info, Node: Macros, Next: Conditionals, Prev: Header Files, Up: Top + +3 Macros +******** + +A "macro" is a fragment of code which has been given a name. Whenever +the name is used, it is replaced by the contents of the macro. There +are two kinds of macros. They differ mostly in what they look like +when they are used. "Object-like" macros resemble data objects when +used, "function-like" macros resemble function calls. + + You may define any valid identifier as a macro, even if it is a C +keyword. The preprocessor does not know anything about keywords. This +can be useful if you wish to hide a keyword such as `const' from an +older compiler that does not understand it. However, the preprocessor +operator `defined' (*note Defined::) can never be defined as a macro, +and C++'s named operators (*note C++ Named Operators::) cannot be +macros when you are compiling C++. + +* Menu: + +* Object-like Macros:: +* Function-like Macros:: +* Macro Arguments:: +* Stringification:: +* Concatenation:: +* Variadic Macros:: +* Predefined Macros:: +* Undefining and Redefining Macros:: +* Directives Within Macro Arguments:: +* Macro Pitfalls:: + + +File: cpp.info, Node: Object-like Macros, Next: Function-like Macros, Up: Macros + +3.1 Object-like Macros +====================== + +An "object-like macro" is a simple identifier which will be replaced by +a code fragment. It is called object-like because it looks like a data +object in code that uses it. They are most commonly used to give +symbolic names to numeric constants. + + You create macros with the `#define' directive. `#define' is +followed by the name of the macro and then the token sequence it should +be an abbreviation for, which is variously referred to as the macro's +"body", "expansion" or "replacement list". For example, + + #define BUFFER_SIZE 1024 + +defines a macro named `BUFFER_SIZE' as an abbreviation for the token +`1024'. If somewhere after this `#define' directive there comes a C +statement of the form + + foo = (char *) malloc (BUFFER_SIZE); + +then the C preprocessor will recognize and "expand" the macro +`BUFFER_SIZE'. The C compiler will see the same tokens as it would if +you had written + + foo = (char *) malloc (1024); + + By convention, macro names are written in uppercase. Programs are +easier to read when it is possible to tell at a glance which names are +macros. + + The macro's body ends at the end of the `#define' line. You may +continue the definition onto multiple lines, if necessary, using +backslash-newline. When the macro is expanded, however, it will all +come out on one line. For example, + + #define NUMBERS 1, \ + 2, \ + 3 + int x[] = { NUMBERS }; + ==> int x[] = { 1, 2, 3 }; + +The most common visible consequence of this is surprising line numbers +in error messages. + + There is no restriction on what can go in a macro body provided it +decomposes into valid preprocessing tokens. Parentheses need not +balance, and the body need not resemble valid C code. (If it does not, +you may get error messages from the C compiler when you use the macro.) + + The C preprocessor scans your program sequentially. Macro +definitions take effect at the place you write them. Therefore, the +following input to the C preprocessor + + foo = X; + #define X 4 + bar = X; + +produces + + foo = X; + bar = 4; + + When the preprocessor expands a macro name, the macro's expansion +replaces the macro invocation, then the expansion is examined for more +macros to expand. For example, + + #define TABLESIZE BUFSIZE + #define BUFSIZE 1024 + TABLESIZE + ==> BUFSIZE + ==> 1024 + +`TABLESIZE' is expanded first to produce `BUFSIZE', then that macro is +expanded to produce the final result, `1024'. + + Notice that `BUFSIZE' was not defined when `TABLESIZE' was defined. +The `#define' for `TABLESIZE' uses exactly the expansion you +specify--in this case, `BUFSIZE'--and does not check to see whether it +too contains macro names. Only when you _use_ `TABLESIZE' is the +result of its expansion scanned for more macro names. + + This makes a difference if you change the definition of `BUFSIZE' at +some point in the source file. `TABLESIZE', defined as shown, will +always expand using the definition of `BUFSIZE' that is currently in +effect: + + #define BUFSIZE 1020 + #define TABLESIZE BUFSIZE + #undef BUFSIZE + #define BUFSIZE 37 + +Now `TABLESIZE' expands (in two stages) to `37'. + + If the expansion of a macro contains its own name, either directly or +via intermediate macros, it is not expanded again when the expansion is +examined for more macros. This prevents infinite recursion. *Note +Self-Referential Macros::, for the precise details. + + +File: cpp.info, Node: Function-like Macros, Next: Macro Arguments, Prev: Object-like Macros, Up: Macros + +3.2 Function-like Macros +======================== + +You can also define macros whose use looks like a function call. These +are called "function-like macros". To define a function-like macro, +you use the same `#define' directive, but you put a pair of parentheses +immediately after the macro name. For example, + + #define lang_init() c_init() + lang_init() + ==> c_init() + + A function-like macro is only expanded if its name appears with a +pair of parentheses after it. If you write just the name, it is left +alone. This can be useful when you have a function and a macro of the +same name, and you wish to use the function sometimes. + + extern void foo(void); + #define foo() /* optimized inline version */ + ... + foo(); + funcptr = foo; + + Here the call to `foo()' will use the macro, but the function +pointer will get the address of the real function. If the macro were to +be expanded, it would cause a syntax error. + + If you put spaces between the macro name and the parentheses in the +macro definition, that does not define a function-like macro, it defines +an object-like macro whose expansion happens to begin with a pair of +parentheses. + + #define lang_init () c_init() + lang_init() + ==> () c_init()() + + The first two pairs of parentheses in this expansion come from the +macro. The third is the pair that was originally after the macro +invocation. Since `lang_init' is an object-like macro, it does not +consume those parentheses. + + +File: cpp.info, Node: Macro Arguments, Next: Stringification, Prev: Function-like Macros, Up: Macros + +3.3 Macro Arguments +=================== + +Function-like macros can take "arguments", just like true functions. +To define a macro that uses arguments, you insert "parameters" between +the pair of parentheses in the macro definition that make the macro +function-like. The parameters must be valid C identifiers, separated +by commas and optionally whitespace. + + To invoke a macro that takes arguments, you write the name of the +macro followed by a list of "actual arguments" in parentheses, separated +by commas. The invocation of the macro need not be restricted to a +single logical line--it can cross as many lines in the source file as +you wish. The number of arguments you give must match the number of +parameters in the macro definition. When the macro is expanded, each +use of a parameter in its body is replaced by the tokens of the +corresponding argument. (You need not use all of the parameters in the +macro body.) + + As an example, here is a macro that computes the minimum of two +numeric values, as it is defined in many C programs, and some uses. + + #define min(X, Y) ((X) < (Y) ? (X) : (Y)) + x = min(a, b); ==> x = ((a) < (b) ? (a) : (b)); + y = min(1, 2); ==> y = ((1) < (2) ? (1) : (2)); + z = min(a + 28, *p); ==> z = ((a + 28) < (*p) ? (a + 28) : (*p)); + +(In this small example you can already see several of the dangers of +macro arguments. *Note Macro Pitfalls::, for detailed explanations.) + + Leading and trailing whitespace in each argument is dropped, and all +whitespace between the tokens of an argument is reduced to a single +space. Parentheses within each argument must balance; a comma within +such parentheses does not end the argument. However, there is no +requirement for square brackets or braces to balance, and they do not +prevent a comma from separating arguments. Thus, + + macro (array[x = y, x + 1]) + +passes two arguments to `macro': `array[x = y' and `x + 1]'. If you +want to supply `array[x = y, x + 1]' as an argument, you can write it +as `array[(x = y, x + 1)]', which is equivalent C code. + + All arguments to a macro are completely macro-expanded before they +are substituted into the macro body. After substitution, the complete +text is scanned again for macros to expand, including the arguments. +This rule may seem strange, but it is carefully designed so you need +not worry about whether any function call is actually a macro +invocation. You can run into trouble if you try to be too clever, +though. *Note Argument Prescan::, for detailed discussion. + + For example, `min (min (a, b), c)' is first expanded to + + min (((a) < (b) ? (a) : (b)), (c)) + +and then to + + ((((a) < (b) ? (a) : (b))) < (c) + ? (((a) < (b) ? (a) : (b))) + : (c)) + +(Line breaks shown here for clarity would not actually be generated.) + + You can leave macro arguments empty; this is not an error to the +preprocessor (but many macros will then expand to invalid code). You +cannot leave out arguments entirely; if a macro takes two arguments, +there must be exactly one comma at the top level of its argument list. +Here are some silly examples using `min': + + min(, b) ==> (( ) < (b) ? ( ) : (b)) + min(a, ) ==> ((a ) < ( ) ? (a ) : ( )) + min(,) ==> (( ) < ( ) ? ( ) : ( )) + min((,),) ==> (((,)) < ( ) ? ((,)) : ( )) + + min() error--> macro "min" requires 2 arguments, but only 1 given + min(,,) error--> macro "min" passed 3 arguments, but takes just 2 + + Whitespace is not a preprocessing token, so if a macro `foo' takes +one argument, `foo ()' and `foo ( )' both supply it an empty argument. +Previous GNU preprocessor implementations and documentation were +incorrect on this point, insisting that a function-like macro that +takes a single argument be passed a space if an empty argument was +required. + + Macro parameters appearing inside string literals are not replaced by +their corresponding actual arguments. + + #define foo(x) x, "x" + foo(bar) ==> bar, "x" + + +File: cpp.info, Node: Stringification, Next: Concatenation, Prev: Macro Arguments, Up: Macros + +3.4 Stringification +=================== + +Sometimes you may want to convert a macro argument into a string +constant. Parameters are not replaced inside string constants, but you +can use the `#' preprocessing operator instead. When a macro parameter +is used with a leading `#', the preprocessor replaces it with the +literal text of the actual argument, converted to a string constant. +Unlike normal parameter replacement, the argument is not macro-expanded +first. This is called "stringification". + + There is no way to combine an argument with surrounding text and +stringify it all together. Instead, you can write a series of adjacent +string constants and stringified arguments. The preprocessor will +replace the stringified arguments with string constants. The C +compiler will then combine all the adjacent string constants into one +long string. + + Here is an example of a macro definition that uses stringification: + + #define WARN_IF(EXP) \ + do { if (EXP) \ + fprintf (stderr, "Warning: " #EXP "\n"); } \ + while (0) + WARN_IF (x == 0); + ==> do { if (x == 0) + fprintf (stderr, "Warning: " "x == 0" "\n"); } while (0); + +The argument for `EXP' is substituted once, as-is, into the `if' +statement, and once, stringified, into the argument to `fprintf'. If +`x' were a macro, it would be expanded in the `if' statement, but not +in the string. + + The `do' and `while (0)' are a kludge to make it possible to write +`WARN_IF (ARG);', which the resemblance of `WARN_IF' to a function +would make C programmers want to do; see *Note Swallowing the +Semicolon::. + + Stringification in C involves more than putting double-quote +characters around the fragment. The preprocessor backslash-escapes the +quotes surrounding embedded string constants, and all backslashes +within string and character constants, in order to get a valid C string +constant with the proper contents. Thus, stringifying `p = "foo\n";' +results in "p = \"foo\\n\";". However, backslashes that are not inside +string or character constants are not duplicated: `\n' by itself +stringifies to "\n". + + All leading and trailing whitespace in text being stringified is +ignored. Any sequence of whitespace in the middle of the text is +converted to a single space in the stringified result. Comments are +replaced by whitespace long before stringification happens, so they +never appear in stringified text. + + There is no way to convert a macro argument into a character +constant. + + If you want to stringify the result of expansion of a macro argument, +you have to use two levels of macros. + + #define xstr(s) str(s) + #define str(s) #s + #define foo 4 + str (foo) + ==> "foo" + xstr (foo) + ==> xstr (4) + ==> str (4) + ==> "4" + + `s' is stringified when it is used in `str', so it is not +macro-expanded first. But `s' is an ordinary argument to `xstr', so it +is completely macro-expanded before `xstr' itself is expanded (*note +Argument Prescan::). Therefore, by the time `str' gets to its +argument, it has already been macro-expanded. + + +File: cpp.info, Node: Concatenation, Next: Variadic Macros, Prev: Stringification, Up: Macros + +3.5 Concatenation +================= + +It is often useful to merge two tokens into one while expanding macros. +This is called "token pasting" or "token concatenation". The `##' +preprocessing operator performs token pasting. When a macro is +expanded, the two tokens on either side of each `##' operator are +combined into a single token, which then replaces the `##' and the two +original tokens in the macro expansion. Usually both will be +identifiers, or one will be an identifier and the other a preprocessing +number. When pasted, they make a longer identifier. This isn't the +only valid case. It is also possible to concatenate two numbers (or a +number and a name, such as `1.5' and `e3') into a number. Also, +multi-character operators such as `+=' can be formed by token pasting. + + However, two tokens that don't together form a valid token cannot be +pasted together. For example, you cannot concatenate `x' with `+' in +either order. If you try, the preprocessor issues a warning and emits +the two tokens. Whether it puts white space between the tokens is +undefined. It is common to find unnecessary uses of `##' in complex +macros. If you get this warning, it is likely that you can simply +remove the `##'. + + Both the tokens combined by `##' could come from the macro body, but +you could just as well write them as one token in the first place. +Token pasting is most useful when one or both of the tokens comes from a +macro argument. If either of the tokens next to an `##' is a parameter +name, it is replaced by its actual argument before `##' executes. As +with stringification, the actual argument is not macro-expanded first. +If the argument is empty, that `##' has no effect. + + Keep in mind that the C preprocessor converts comments to whitespace +before macros are even considered. Therefore, you cannot create a +comment by concatenating `/' and `*'. You can put as much whitespace +between `##' and its operands as you like, including comments, and you +can put comments in arguments that will be concatenated. However, it +is an error if `##' appears at either end of a macro body. + + Consider a C program that interprets named commands. There probably +needs to be a table of commands, perhaps an array of structures declared +as follows: + + struct command + { + char *name; + void (*function) (void); + }; + + struct command commands[] = + { + { "quit", quit_command }, + { "help", help_command }, + ... + }; + + It would be cleaner not to have to give each command name twice, +once in the string constant and once in the function name. A macro +which takes the name of a command as an argument can make this +unnecessary. The string constant can be created with stringification, +and the function name by concatenating the argument with `_command'. +Here is how it is done: + + #define COMMAND(NAME) { #NAME, NAME ## _command } + + struct command commands[] = + { + COMMAND (quit), + COMMAND (help), + ... + }; + + +File: cpp.info, Node: Variadic Macros, Next: Predefined Macros, Prev: Concatenation, Up: Macros + +3.6 Variadic Macros +=================== + +A macro can be declared to accept a variable number of arguments much as +a function can. The syntax for defining the macro is similar to that of +a function. Here is an example: + + #define eprintf(...) fprintf (stderr, __VA_ARGS__) + + This kind of macro is called "variadic". When the macro is invoked, +all the tokens in its argument list after the last named argument (this +macro has none), including any commas, become the "variable argument". +This sequence of tokens replaces the identifier `__VA_ARGS__' in the +macro body wherever it appears. Thus, we have this expansion: + + eprintf ("%s:%d: ", input_file, lineno) + ==> fprintf (stderr, "%s:%d: ", input_file, lineno) + + The variable argument is completely macro-expanded before it is +inserted into the macro expansion, just like an ordinary argument. You +may use the `#' and `##' operators to stringify the variable argument +or to paste its leading or trailing token with another token. (But see +below for an important special case for `##'.) + + If your macro is complicated, you may want a more descriptive name +for the variable argument than `__VA_ARGS__'. CPP permits this, as an +extension. You may write an argument name immediately before the +`...'; that name is used for the variable argument. The `eprintf' +macro above could be written + + #define eprintf(args...) fprintf (stderr, args) + +using this extension. You cannot use `__VA_ARGS__' and this extension +in the same macro. + + You can have named arguments as well as variable arguments in a +variadic macro. We could define `eprintf' like this, instead: + + #define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__) + +This formulation looks more descriptive, but unfortunately it is less +flexible: you must now supply at least one argument after the format +string. In standard C, you cannot omit the comma separating the named +argument from the variable arguments. Furthermore, if you leave the +variable argument empty, you will get a syntax error, because there +will be an extra comma after the format string. + + eprintf("success!\n", ); + ==> fprintf(stderr, "success!\n", ); + + GNU CPP has a pair of extensions which deal with this problem. +First, you are allowed to leave the variable argument out entirely: + + eprintf ("success!\n") + ==> fprintf(stderr, "success!\n", ); + +Second, the `##' token paste operator has a special meaning when placed +between a comma and a variable argument. If you write + + #define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__) + +and the variable argument is left out when the `eprintf' macro is used, +then the comma before the `##' will be deleted. This does _not_ happen +if you pass an empty argument, nor does it happen if the token +preceding `##' is anything other than a comma. + + eprintf ("success!\n") + ==> fprintf(stderr, "success!\n"); + +The above explanation is ambiguous about the case where the only macro +parameter is a variable arguments parameter, as it is meaningless to +try to distinguish whether no argument at all is an empty argument or a +missing argument. In this case the C99 standard is clear that the +comma must remain, however the existing GCC extension used to swallow +the comma. So CPP retains the comma when conforming to a specific C +standard, and drops it otherwise. + + C99 mandates that the only place the identifier `__VA_ARGS__' can +appear is in the replacement list of a variadic macro. It may not be +used as a macro name, macro argument name, or within a different type +of macro. It may also be forbidden in open text; the standard is +ambiguous. We recommend you avoid using it except for its defined +purpose. + + Variadic macros are a new feature in C99. GNU CPP has supported them +for a long time, but only with a named variable argument (`args...', +not `...' and `__VA_ARGS__'). If you are concerned with portability to +previous versions of GCC, you should use only named variable arguments. +On the other hand, if you are concerned with portability to other +conforming implementations of C99, you should use only `__VA_ARGS__'. + + Previous versions of CPP implemented the comma-deletion extension +much more generally. We have restricted it in this release to minimize +the differences from C99. To get the same effect with both this and +previous versions of GCC, the token preceding the special `##' must be +a comma, and there must be white space between that comma and whatever +comes immediately before it: + + #define eprintf(format, args...) fprintf (stderr, format , ##args) + +*Note Differences from previous versions::, for the gory details. + + +File: cpp.info, Node: Predefined Macros, Next: Undefining and Redefining Macros, Prev: Variadic Macros, Up: Macros + +3.7 Predefined Macros +===================== + +Several object-like macros are predefined; you use them without +supplying their definitions. They fall into three classes: standard, +common, and system-specific. + + In C++, there is a fourth category, the named operators. They act +like predefined macros, but you cannot undefine them. + +* Menu: + +* Standard Predefined Macros:: +* Common Predefined Macros:: +* System-specific Predefined Macros:: +* C++ Named Operators:: + + +File: cpp.info, Node: Standard Predefined Macros, Next: Common Predefined Macros, Up: Predefined Macros + +3.7.1 Standard Predefined Macros +-------------------------------- + +The standard predefined macros are specified by the relevant language +standards, so they are available with all compilers that implement +those standards. Older compilers may not provide all of them. Their +names all start with double underscores. + +`__FILE__' + This macro expands to the name of the current input file, in the + form of a C string constant. This is the path by which the + preprocessor opened the file, not the short name specified in + `#include' or as the input file name argument. For example, + `"/usr/local/include/myheader.h"' is a possible expansion of this + macro. + +`__LINE__' + This macro expands to the current input line number, in the form + of a decimal integer constant. While we call it a predefined + macro, it's a pretty strange macro, since its "definition" changes + with each new line of source code. + + `__FILE__' and `__LINE__' are useful in generating an error message +to report an inconsistency detected by the program; the message can +state the source line at which the inconsistency was detected. For +example, + + fprintf (stderr, "Internal error: " + "negative string length " + "%d at %s, line %d.", + length, __FILE__, __LINE__); + + An `#include' directive changes the expansions of `__FILE__' and +`__LINE__' to correspond to the included file. At the end of that +file, when processing resumes on the input file that contained the +`#include' directive, the expansions of `__FILE__' and `__LINE__' +revert to the values they had before the `#include' (but `__LINE__' is +then incremented by one as processing moves to the line after the +`#include'). + + A `#line' directive changes `__LINE__', and may change `__FILE__' as +well. *Note Line Control::. + + C99 introduces `__func__', and GCC has provided `__FUNCTION__' for a +long time. Both of these are strings containing the name of the +current function (there are slight semantic differences; see the GCC +manual). Neither of them is a macro; the preprocessor does not know the +name of the current function. They tend to be useful in conjunction +with `__FILE__' and `__LINE__', though. + +`__DATE__' + This macro expands to a string constant that describes the date on + which the preprocessor is being run. The string constant contains + eleven characters and looks like `"Feb 12 1996"'. If the day of + the month is less than 10, it is padded with a space on the left. + + If GCC cannot determine the current date, it will emit a warning + message (once per compilation) and `__DATE__' will expand to + `"??? ?? ????"'. + +`__TIME__' + This macro expands to a string constant that describes the time at + which the preprocessor is being run. The string constant contains + eight characters and looks like `"23:59:01"'. + + If GCC cannot determine the current time, it will emit a warning + message (once per compilation) and `__TIME__' will expand to + `"??:??:??"'. + +`__STDC__' + In normal operation, this macro expands to the constant 1, to + signify that this compiler conforms to ISO Standard C. If GNU CPP + is used with a compiler other than GCC, this is not necessarily + true; however, the preprocessor always conforms to the standard + unless the `-traditional-cpp' option is used. + + This macro is not defined if the `-traditional-cpp' option is used. + + On some hosts, the system compiler uses a different convention, + where `__STDC__' is normally 0, but is 1 if the user specifies + strict conformance to the C Standard. CPP follows the host + convention when processing system header files, but when + processing user files `__STDC__' is always 1. This has been + reported to cause problems; for instance, some versions of Solaris + provide X Windows headers that expect `__STDC__' to be either + undefined or 1. *Note Invocation::. + +`__STDC_VERSION__' + This macro expands to the C Standard's version number, a long + integer constant of the form `YYYYMML' where YYYY and MM are the + year and month of the Standard version. This signifies which + version of the C Standard the compiler conforms to. Like + `__STDC__', this is not necessarily accurate for the entire + implementation, unless GNU CPP is being used with GCC. + + The value `199409L' signifies the 1989 C standard as amended in + 1994, which is the current default; the value `199901L' signifies + the 1999 revision of the C standard. Support for the 1999 + revision is not yet complete. + + This macro is not defined if the `-traditional-cpp' option is + used, nor when compiling C++ or Objective-C. + +`__STDC_HOSTED__' + This macro is defined, with value 1, if the compiler's target is a + "hosted environment". A hosted environment has the complete + facilities of the standard C library available. + +`__cplusplus' + This macro is defined when the C++ compiler is in use. You can use + `__cplusplus' to test whether a header is compiled by a C compiler + or a C++ compiler. This macro is similar to `__STDC_VERSION__', in + that it expands to a version number. A fully conforming + implementation of the 1998 C++ standard will define this macro to + `199711L'. The GNU C++ compiler is not yet fully conforming, so + it uses `1' instead. It is hoped to complete the implementation + of standard C++ in the near future. + +`__OBJC__' + This macro is defined, with value 1, when the Objective-C compiler + is in use. You can use `__OBJC__' to test whether a header is + compiled by a C compiler or a Objective-C compiler. + +`__ASSEMBLER__' + This macro is defined with value 1 when preprocessing assembly + language. + + + +File: cpp.info, Node: Common Predefined Macros, Next: System-specific Predefined Macros, Prev: Standard Predefined Macros, Up: Predefined Macros + +3.7.2 Common Predefined Macros +------------------------------ + +The common predefined macros are GNU C extensions. They are available +with the same meanings regardless of the machine or operating system on +which you are using GNU C. Their names all start with double +underscores. + +`__GNUC__' +`__GNUC_MINOR__' +`__GNUC_PATCHLEVEL__' + These macros are defined by all GNU compilers that use the C + preprocessor: C, C++, and Objective-C. Their values are the major + version, minor version, and patch level of the compiler, as integer + constants. For example, GCC 3.2.1 will define `__GNUC__' to 3, + `__GNUC_MINOR__' to 2, and `__GNUC_PATCHLEVEL__' to 1. They are + defined only when the entire compiler is in use; if you invoke the + preprocessor directly, they are not defined. + + `__GNUC_PATCHLEVEL__' is new to GCC 3.0; it is also present in the + widely-used development snapshots leading up to 3.0 (which identify + themselves as GCC 2.96 or 2.97, depending on which snapshot you + have). + + If all you need to know is whether or not your program is being + compiled by GCC, you can simply test `__GNUC__'. If you need to + write code which depends on a specific version, you must be more + careful. Each time the minor version is increased, the patch + level is reset to zero; each time the major version is increased + (which happens rarely), the minor version and patch level are + reset. If you wish to use the predefined macros directly in the + conditional, you will need to write it like this: + + /* Test for GCC > 3.2.0 */ + #if __GNUC__ > 3 || \ + (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \ + (__GNUC_MINOR__ == 2 && \ + __GNUC_PATCHLEVEL__ > 0)) + + Another approach is to use the predefined macros to calculate a + single number, then compare that against a threshold: + + #define GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) + ... + /* Test for GCC > 3.2.0 */ + #if GCC_VERSION > 30200 + + Many people find this form easier to understand. + +`__GNUG__' + The GNU C++ compiler defines this. Testing it is equivalent to + testing `(__GNUC__ && __cplusplus)'. + +`__STRICT_ANSI__' + GCC defines this macro if and only if the `-ansi' switch, or a + `-std' switch specifying strict conformance to some version of ISO + C, was specified when GCC was invoked. It is defined to `1'. + This macro exists primarily to direct GNU libc's header files to + restrict their definitions to the minimal set found in the 1989 C + standard. + +`__BASE_FILE__' + This macro expands to the name of the main input file, in the form + of a C string constant. This is the source file that was specified + on the command line of the preprocessor or C compiler. + +`__INCLUDE_LEVEL__' + This macro expands to a decimal integer constant that represents + the depth of nesting in include files. The value of this macro is + incremented on every `#include' directive and decremented at the + end of every included file. It starts out at 0, it's value within + the base file specified on the command line. + +`__ELF__' + This macro is defined if the target uses the ELF object format. + +`__VERSION__' + This macro expands to a string constant which describes the + version of the compiler in use. You should not rely on its + contents having any particular form, but it can be counted on to + contain at least the release number. + +`__OPTIMIZE__' +`__OPTIMIZE_SIZE__' +`__NO_INLINE__' + These macros describe the compilation mode. `__OPTIMIZE__' is + defined in all optimizing compilations. `__OPTIMIZE_SIZE__' is + defined if the compiler is optimizing for size, not speed. + `__NO_INLINE__' is defined if no functions will be inlined into + their callers (when not optimizing, or when inlining has been + specifically disabled by `-fno-inline'). + + These macros cause certain GNU header files to provide optimized + definitions, using macros or inline functions, of system library + functions. You should not use these macros in any way unless you + make sure that programs will execute with the same effect whether + or not they are defined. If they are defined, their value is 1. + +`__CHAR_UNSIGNED__' + GCC defines this macro if and only if the data type `char' is + unsigned on the target machine. It exists to cause the standard + header file `limits.h' to work correctly. You should not use this + macro yourself; instead, refer to the standard macros defined in + `limits.h'. + +`__WCHAR_UNSIGNED__' + Like `__CHAR_UNSIGNED__', this macro is defined if and only if the + data type `wchar_t' is unsigned and the front-end is in C++ mode. + +`__REGISTER_PREFIX__' + This macro expands to a single token (not a string constant) which + is the prefix applied to CPU register names in assembly language + for this target. You can use it to write assembly that is usable + in multiple environments. For example, in the `m68k-aout' + environment it expands to nothing, but in the `m68k-coff' + environment it expands to a single `%'. + +`__USER_LABEL_PREFIX__' + This macro expands to a single token which is the prefix applied to + user labels (symbols visible to C code) in assembly. For example, + in the `m68k-aout' environment it expands to an `_', but in the + `m68k-coff' environment it expands to nothing. + + This macro will have the correct definition even if + `-f(no-)underscores' is in use, but it will not be correct if + target-specific options that adjust this prefix are used (e.g. the + OSF/rose `-mno-underscores' option). + +`__SIZE_TYPE__' +`__PTRDIFF_TYPE__' +`__WCHAR_TYPE__' +`__WINT_TYPE__' + These macros are defined to the correct underlying types for the + `size_t', `ptrdiff_t', `wchar_t', and `wint_t' typedefs, + respectively. They exist to make the standard header files + `stddef.h' and `wchar.h' work correctly. You should not use these + macros directly; instead, include the appropriate headers and use + the typedefs. + +`__CHAR_BIT__' + Defined to the number of bits used in the representation of the + `char' data type. It exists to make the standard header given + numerical limits work correctly. You should not use this macro + directly; instead, include the appropriate headers. + +`__SCHAR_MAX__' +`__WCHAR_MAX__' +`__SHRT_MAX__' +`__INT_MAX__' +`__LONG_MAX__' +`__LONG_LONG_MAX__' + Defined to the maximum value of the `signed char', `wchar_t', + `signed short', `signed int', `signed long', and `signed long + long' types respectively. They exist to make the standard header + given numerical limits work correctly. You should not use these + macros directly; instead, include the appropriate headers. + +`__USING_SJLJ_EXCEPTIONS__' + This macro is defined, with value 1, if the compiler uses the old + mechanism based on `setjmp' and `longjmp' for exception handling. + +`__NEXT_RUNTIME__' + This macro is defined, with value 1, if (and only if) the NeXT + runtime (as in `-fnext-runtime') is in use for Objective-C. If + the GNU runtime is used, this macro is not defined, so that you + can use this macro to determine which runtime (NeXT or GNU) is + being used. + +`__LP64__' +`_LP64' + These macros are defined, with value 1, if (and only if) the + compilation is for a target where `long int' and pointer both use + 64-bits and `int' uses 32-bit. + + +File: cpp.info, Node: System-specific Predefined Macros, Next: C++ Named Operators, Prev: Common Predefined Macros, Up: Predefined Macros + +3.7.3 System-specific Predefined Macros +--------------------------------------- + +The C preprocessor normally predefines several macros that indicate what +type of system and machine is in use. They are obviously different on +each target supported by GCC. This manual, being for all systems and +machines, cannot tell you what their names are, but you can use `cpp +-dM' to see them all. *Note Invocation::. All system-specific +predefined macros expand to the constant 1, so you can test them with +either `#ifdef' or `#if'. + + The C standard requires that all system-specific macros be part of +the "reserved namespace". All names which begin with two underscores, +or an underscore and a capital letter, are reserved for the compiler and +library to use as they wish. However, historically system-specific +macros have had names with no special prefix; for instance, it is common +to find `unix' defined on Unix systems. For all such macros, GCC +provides a parallel macro with two underscores added at the beginning +and the end. If `unix' is defined, `__unix__' will be defined too. +There will never be more than two underscores; the parallel of `_mips' +is `__mips__'. + + When the `-ansi' option, or any `-std' option that requests strict +conformance, is given to the compiler, all the system-specific +predefined macros outside the reserved namespace are suppressed. The +parallel macros, inside the reserved namespace, remain defined. + + We are slowly phasing out all predefined macros which are outside the +reserved namespace. You should never use them in new programs, and we +encourage you to correct older code to use the parallel macros whenever +you find it. We don't recommend you use the system-specific macros that +are in the reserved namespace, either. It is better in the long run to +check specifically for features you need, using a tool such as +`autoconf'. + + +File: cpp.info, Node: C++ Named Operators, Prev: System-specific Predefined Macros, Up: Predefined Macros + +3.7.4 C++ Named Operators +------------------------- + +In C++, there are eleven keywords which are simply alternate spellings +of operators normally written with punctuation. These keywords are +treated as such even in the preprocessor. They function as operators in +`#if', and they cannot be defined as macros or poisoned. In C, you can +request that those keywords take their C++ meaning by including +`iso646.h'. That header defines each one as a normal object-like macro +expanding to the appropriate punctuator. + + These are the named operators and their corresponding punctuators: + +Named Operator Punctuator +`and' `&&' +`and_eq' `&=' +`bitand' `&' +`bitor' `|' +`compl' `~' +`not' `!' +`not_eq' `!=' +`or' `||' +`or_eq' `|=' +`xor' `^' +`xor_eq' `^=' + + +File: cpp.info, Node: Undefining and Redefining Macros, Next: Directives Within Macro Arguments, Prev: Predefined Macros, Up: Macros + +3.8 Undefining and Redefining Macros +==================================== + +If a macro ceases to be useful, it may be "undefined" with the `#undef' +directive. `#undef' takes a single argument, the name of the macro to +undefine. You use the bare macro name, even if the macro is +function-like. It is an error if anything appears on the line after +the macro name. `#undef' has no effect if the name is not a macro. + + #define FOO 4 + x = FOO; ==> x = 4; + #undef FOO + x = FOO; ==> x = FOO; + + Once a macro has been undefined, that identifier may be "redefined" +as a macro by a subsequent `#define' directive. The new definition +need not have any resemblance to the old definition. + + However, if an identifier which is currently a macro is redefined, +then the new definition must be "effectively the same" as the old one. +Two macro definitions are effectively the same if: + * Both are the same type of macro (object- or function-like). + + * All the tokens of the replacement list are the same. + + * If there are any parameters, they are the same. + + * Whitespace appears in the same places in both. It need not be + exactly the same amount of whitespace, though. Remember that + comments count as whitespace. + +These definitions are effectively the same: + #define FOUR (2 + 2) + #define FOUR (2 + 2) + #define FOUR (2 /* two */ + 2) + but these are not: + #define FOUR (2 + 2) + #define FOUR ( 2+2 ) + #define FOUR (2 * 2) + #define FOUR(score,and,seven,years,ago) (2 + 2) + + If a macro is redefined with a definition that is not effectively the +same as the old one, the preprocessor issues a warning and changes the +macro to use the new definition. If the new definition is effectively +the same, the redefinition is silently ignored. This allows, for +instance, two different headers to define a common macro. The +preprocessor will only complain if the definitions do not match. + + +File: cpp.info, Node: Directives Within Macro Arguments, Next: Macro Pitfalls, Prev: Undefining and Redefining Macros, Up: Macros + +3.9 Directives Within Macro Arguments +===================================== + +Occasionally it is convenient to use preprocessor directives within the +arguments of a macro. The C and C++ standards declare that behavior in +these cases is undefined. + + Versions of CPP prior to 3.2 would reject such constructs with an +error message. This was the only syntactic difference between normal +functions and function-like macros, so it seemed attractive to remove +this limitation, and people would often be surprised that they could +not use macros in this way. Moreover, sometimes people would use +conditional compilation in the argument list to a normal library +function like `printf', only to find that after a library upgrade +`printf' had changed to be a function-like macro, and their code would +no longer compile. So from version 3.2 we changed CPP to successfully +process arbitrary directives within macro arguments in exactly the same +way as it would have processed the directive were the function-like +macro invocation not present. + + If, within a macro invocation, that macro is redefined, then the new +definition takes effect in time for argument pre-expansion, but the +original definition is still used for argument replacement. Here is a +pathological example: + + #define f(x) x x + f (1 + #undef f + #define f 2 + f) + +which expands to + + 1 2 1 2 + +with the semantics described above. + + +File: cpp.info, Node: Macro Pitfalls, Prev: Directives Within Macro Arguments, Up: Macros + +3.10 Macro Pitfalls +=================== + +In this section we describe some special rules that apply to macros and +macro expansion, and point out certain cases in which the rules have +counter-intuitive consequences that you must watch out for. + +* Menu: + +* Misnesting:: +* Operator Precedence Problems:: +* Swallowing the Semicolon:: +* Duplication of Side Effects:: +* Self-Referential Macros:: +* Argument Prescan:: +* Newlines in Arguments:: + + +File: cpp.info, Node: Misnesting, Next: Operator Precedence Problems, Up: Macro Pitfalls + +3.10.1 Misnesting +----------------- + +When a macro is called with arguments, the arguments are substituted +into the macro body and the result is checked, together with the rest of +the input file, for more macro calls. It is possible to piece together +a macro call coming partially from the macro body and partially from the +arguments. For example, + + #define twice(x) (2*(x)) + #define call_with_1(x) x(1) + call_with_1 (twice) + ==> twice(1) + ==> (2*(1)) + + Macro definitions do not have to have balanced parentheses. By +writing an unbalanced open parenthesis in a macro body, it is possible +to create a macro call that begins inside the macro body but ends +outside of it. For example, + + #define strange(file) fprintf (file, "%s %d", + ... + strange(stderr) p, 35) + ==> fprintf (stderr, "%s %d", p, 35) + + The ability to piece together a macro call can be useful, but the +use of unbalanced open parentheses in a macro body is just confusing, +and should be avoided. + + +File: cpp.info, Node: Operator Precedence Problems, Next: Swallowing the Semicolon, Prev: Misnesting, Up: Macro Pitfalls + +3.10.2 Operator Precedence Problems +----------------------------------- + +You may have noticed that in most of the macro definition examples shown +above, each occurrence of a macro argument name had parentheses around +it. In addition, another pair of parentheses usually surround the +entire macro definition. Here is why it is best to write macros that +way. + + Suppose you define a macro as follows, + + #define ceil_div(x, y) (x + y - 1) / y + +whose purpose is to divide, rounding up. (One use for this operation is +to compute how many `int' objects are needed to hold a certain number +of `char' objects.) Then suppose it is used as follows: + + a = ceil_div (b & c, sizeof (int)); + ==> a = (b & c + sizeof (int) - 1) / sizeof (int); + +This does not do what is intended. The operator-precedence rules of C +make it equivalent to this: + + a = (b & (c + sizeof (int) - 1)) / sizeof (int); + +What we want is this: + + a = ((b & c) + sizeof (int) - 1)) / sizeof (int); + +Defining the macro as + + #define ceil_div(x, y) ((x) + (y) - 1) / (y) + +provides the desired result. + + Unintended grouping can result in another way. Consider `sizeof +ceil_div(1, 2)'. That has the appearance of a C expression that would +compute the size of the type of `ceil_div (1, 2)', but in fact it means +something very different. Here is what it expands to: + + sizeof ((1) + (2) - 1) / (2) + +This would take the size of an integer and divide it by two. The +precedence rules have put the division outside the `sizeof' when it was +intended to be inside. + + Parentheses around the entire macro definition prevent such problems. +Here, then, is the recommended way to define `ceil_div': + + #define ceil_div(x, y) (((x) + (y) - 1) / (y)) + + +File: cpp.info, Node: Swallowing the Semicolon, Next: Duplication of Side Effects, Prev: Operator Precedence Problems, Up: Macro Pitfalls + +3.10.3 Swallowing the Semicolon +------------------------------- + +Often it is desirable to define a macro that expands into a compound +statement. Consider, for example, the following macro, that advances a +pointer (the argument `p' says where to find it) across whitespace +characters: + + #define SKIP_SPACES(p, limit) \ + { char *lim = (limit); \ + while (p < lim) { \ + if (*p++ != ' ') { \ + p--; break; }}} + +Here backslash-newline is used to split the macro definition, which must +be a single logical line, so that it resembles the way such code would +be laid out if not part of a macro definition. + + A call to this macro might be `SKIP_SPACES (p, lim)'. Strictly +speaking, the call expands to a compound statement, which is a complete +statement with no need for a semicolon to end it. However, since it +looks like a function call, it minimizes confusion if you can use it +like a function call, writing a semicolon afterward, as in `SKIP_SPACES +(p, lim);' + + This can cause trouble before `else' statements, because the +semicolon is actually a null statement. Suppose you write + + if (*p != 0) + SKIP_SPACES (p, lim); + else ... + +The presence of two statements--the compound statement and a null +statement--in between the `if' condition and the `else' makes invalid C +code. + + The definition of the macro `SKIP_SPACES' can be altered to solve +this problem, using a `do ... while' statement. Here is how: + + #define SKIP_SPACES(p, limit) \ + do { char *lim = (limit); \ + while (p < lim) { \ + if (*p++ != ' ') { \ + p--; break; }}} \ + while (0) + + Now `SKIP_SPACES (p, lim);' expands into + + do {...} while (0); + +which is one statement. The loop executes exactly once; most compilers +generate no extra code for it. + + +File: cpp.info, Node: Duplication of Side Effects, Next: Self-Referential Macros, Prev: Swallowing the Semicolon, Up: Macro Pitfalls + +3.10.4 Duplication of Side Effects +---------------------------------- + +Many C programs define a macro `min', for "minimum", like this: + + #define min(X, Y) ((X) < (Y) ? (X) : (Y)) + + When you use this macro with an argument containing a side effect, +as shown here, + + next = min (x + y, foo (z)); + +it expands as follows: + + next = ((x + y) < (foo (z)) ? (x + y) : (foo (z))); + +where `x + y' has been substituted for `X' and `foo (z)' for `Y'. + + The function `foo' is used only once in the statement as it appears +in the program, but the expression `foo (z)' has been substituted twice +into the macro expansion. As a result, `foo' might be called two times +when the statement is executed. If it has side effects or if it takes +a long time to compute, the results might not be what you intended. We +say that `min' is an "unsafe" macro. + + The best solution to this problem is to define `min' in a way that +computes the value of `foo (z)' only once. The C language offers no +standard way to do this, but it can be done with GNU extensions as +follows: + + #define min(X, Y) \ + ({ typeof (X) x_ = (X); \ + typeof (Y) y_ = (Y); \ + (x_ < y_) ? x_ : y_; }) + + The `({ ... })' notation produces a compound statement that acts as +an expression. Its value is the value of its last statement. This +permits us to define local variables and assign each argument to one. +The local variables have underscores after their names to reduce the +risk of conflict with an identifier of wider scope (it is impossible to +avoid this entirely). Now each argument is evaluated exactly once. + + If you do not wish to use GNU C extensions, the only solution is to +be careful when _using_ the macro `min'. For example, you can +calculate the value of `foo (z)', save it in a variable, and use that +variable in `min': + + #define min(X, Y) ((X) < (Y) ? (X) : (Y)) + ... + { + int tem = foo (z); + next = min (x + y, tem); + } + +(where we assume that `foo' returns type `int'). + + +File: cpp.info, Node: Self-Referential Macros, Next: Argument Prescan, Prev: Duplication of Side Effects, Up: Macro Pitfalls + +3.10.5 Self-Referential Macros +------------------------------ + +A "self-referential" macro is one whose name appears in its definition. +Recall that all macro definitions are rescanned for more macros to +replace. If the self-reference were considered a use of the macro, it +would produce an infinitely large expansion. To prevent this, the +self-reference is not considered a macro call. It is passed into the +preprocessor output unchanged. Consider an example: + + #define foo (4 + foo) + +where `foo' is also a variable in your program. + + Following the ordinary rules, each reference to `foo' will expand +into `(4 + foo)'; then this will be rescanned and will expand into `(4 ++ (4 + foo))'; and so on until the computer runs out of memory. + + The self-reference rule cuts this process short after one step, at +`(4 + foo)'. Therefore, this macro definition has the possibly useful +effect of causing the program to add 4 to the value of `foo' wherever +`foo' is referred to. + + In most cases, it is a bad idea to take advantage of this feature. A +person reading the program who sees that `foo' is a variable will not +expect that it is a macro as well. The reader will come across the +identifier `foo' in the program and think its value should be that of +the variable `foo', whereas in fact the value is four greater. + + One common, useful use of self-reference is to create a macro which +expands to itself. If you write + + #define EPERM EPERM + +then the macro `EPERM' expands to `EPERM'. Effectively, it is left +alone by the preprocessor whenever it's used in running text. You can +tell that it's a macro with `#ifdef'. You might do this if you want to +define numeric constants with an `enum', but have `#ifdef' be true for +each constant. + + If a macro `x' expands to use a macro `y', and the expansion of `y' +refers to the macro `x', that is an "indirect self-reference" of `x'. +`x' is not expanded in this case either. Thus, if we have + + #define x (4 + y) + #define y (2 * x) + +then `x' and `y' expand as follows: + + x ==> (4 + y) + ==> (4 + (2 * x)) + + y ==> (2 * x) + ==> (2 * (4 + y)) + +Each macro is expanded when it appears in the definition of the other +macro, but not when it indirectly appears in its own definition. + + +File: cpp.info, Node: Argument Prescan, Next: Newlines in Arguments, Prev: Self-Referential Macros, Up: Macro Pitfalls + +3.10.6 Argument Prescan +----------------------- + +Macro arguments are completely macro-expanded before they are +substituted into a macro body, unless they are stringified or pasted +with other tokens. After substitution, the entire macro body, including +the substituted arguments, is scanned again for macros to be expanded. +The result is that the arguments are scanned _twice_ to expand macro +calls in them. + + Most of the time, this has no effect. If the argument contained any +macro calls, they are expanded during the first scan. The result +therefore contains no macro calls, so the second scan does not change +it. If the argument were substituted as given, with no prescan, the +single remaining scan would find the same macro calls and produce the +same results. + + You might expect the double scan to change the results when a +self-referential macro is used in an argument of another macro (*note +Self-Referential Macros::): the self-referential macro would be +expanded once in the first scan, and a second time in the second scan. +However, this is not what happens. The self-references that do not +expand in the first scan are marked so that they will not expand in the +second scan either. + + You might wonder, "Why mention the prescan, if it makes no +difference? And why not skip it and make the preprocessor faster?" +The answer is that the prescan does make a difference in three special +cases: + + * Nested calls to a macro. + + We say that "nested" calls to a macro occur when a macro's argument + contains a call to that very macro. For example, if `f' is a macro + that expects one argument, `f (f (1))' is a nested pair of calls to + `f'. The desired expansion is made by expanding `f (1)' and + substituting that into the definition of `f'. The prescan causes + the expected result to happen. Without the prescan, `f (1)' itself + would be substituted as an argument, and the inner use of `f' would + appear during the main scan as an indirect self-reference and + would not be expanded. + + * Macros that call other macros that stringify or concatenate. + + If an argument is stringified or concatenated, the prescan does not + occur. If you _want_ to expand a macro, then stringify or + concatenate its expansion, you can do that by causing one macro to + call another macro that does the stringification or concatenation. + For instance, if you have + + #define AFTERX(x) X_ ## x + #define XAFTERX(x) AFTERX(x) + #define TABLESIZE 1024 + #define BUFSIZE TABLESIZE + + then `AFTERX(BUFSIZE)' expands to `X_BUFSIZE', and + `XAFTERX(BUFSIZE)' expands to `X_1024'. (Not to `X_TABLESIZE'. + Prescan always does a complete expansion.) + + * Macros used in arguments, whose expansions contain unshielded + commas. + + This can cause a macro expanded on the second scan to be called + with the wrong number of arguments. Here is an example: + + #define foo a,b + #define bar(x) lose(x) + #define lose(x) (1 + (x)) + + We would like `bar(foo)' to turn into `(1 + (foo))', which would + then turn into `(1 + (a,b))'. Instead, `bar(foo)' expands into + `lose(a,b)', and you get an error because `lose' requires a single + argument. In this case, the problem is easily solved by the same + parentheses that ought to be used to prevent misnesting of + arithmetic operations: + + #define foo (a,b) + or + #define bar(x) lose((x)) + + The extra pair of parentheses prevents the comma in `foo''s + definition from being interpreted as an argument separator. + + + +File: cpp.info, Node: Newlines in Arguments, Prev: Argument Prescan, Up: Macro Pitfalls + +3.10.7 Newlines in Arguments +---------------------------- + +The invocation of a function-like macro can extend over many logical +lines. However, in the present implementation, the entire expansion +comes out on one line. Thus line numbers emitted by the compiler or +debugger refer to the line the invocation started on, which might be +different to the line containing the argument causing the problem. + + Here is an example illustrating this: + + #define ignore_second_arg(a,b,c) a; c + + ignore_second_arg (foo (), + ignored (), + syntax error); + +The syntax error triggered by the tokens `syntax error' results in an +error message citing line three--the line of ignore_second_arg-- even +though the problematic code comes from line five. + + We consider this a bug, and intend to fix it in the near future. + + +File: cpp.info, Node: Conditionals, Next: Diagnostics, Prev: Macros, Up: Top + +4 Conditionals +************** + +A "conditional" is a directive that instructs the preprocessor to +select whether or not to include a chunk of code in the final token +stream passed to the compiler. Preprocessor conditionals can test +arithmetic expressions, or whether a name is defined as a macro, or both +simultaneously using the special `defined' operator. + + A conditional in the C preprocessor resembles in some ways an `if' +statement in C, but it is important to understand the difference between +them. The condition in an `if' statement is tested during the +execution of your program. Its purpose is to allow your program to +behave differently from run to run, depending on the data it is +operating on. The condition in a preprocessing conditional directive is +tested when your program is compiled. Its purpose is to allow different +code to be included in the program depending on the situation at the +time of compilation. + + However, the distinction is becoming less clear. Modern compilers +often do test `if' statements when a program is compiled, if their +conditions are known not to vary at run time, and eliminate code which +can never be executed. If you can count on your compiler to do this, +you may find that your program is more readable if you use `if' +statements with constant conditions (perhaps determined by macros). Of +course, you can only use this to exclude code, not type definitions or +other preprocessing directives, and you can only do it if the code +remains syntactically valid when it is not to be used. + + GCC version 3 eliminates this kind of never-executed code even when +not optimizing. Older versions did it only when optimizing. + +* Menu: + +* Conditional Uses:: +* Conditional Syntax:: +* Deleted Code:: + + +File: cpp.info, Node: Conditional Uses, Next: Conditional Syntax, Up: Conditionals + +4.1 Conditional Uses +==================== + +There are three general reasons to use a conditional. + + * A program may need to use different code depending on the machine + or operating system it is to run on. In some cases the code for + one operating system may be erroneous on another operating system; + for example, it might refer to data types or constants that do not + exist on the other system. When this happens, it is not enough to + avoid executing the invalid code. Its mere presence will cause + the compiler to reject the program. With a preprocessing + conditional, the offending code can be effectively excised from + the program when it is not valid. + + * You may want to be able to compile the same source file into two + different programs. One version might make frequent time-consuming + consistency checks on its intermediate data, or print the values of + those data for debugging, and the other not. + + * A conditional whose condition is always false is one way to + exclude code from the program but keep it as a sort of comment for + future reference. + + Simple programs that do not need system-specific logic or complex +debugging hooks generally will not need to use preprocessing +conditionals. + + +File: cpp.info, Node: Conditional Syntax, Next: Deleted Code, Prev: Conditional Uses, Up: Conditionals + +4.2 Conditional Syntax +====================== + +A conditional in the C preprocessor begins with a "conditional +directive": `#if', `#ifdef' or `#ifndef'. + +* Menu: + +* Ifdef:: +* If:: +* Defined:: +* Else:: +* Elif:: + + +File: cpp.info, Node: Ifdef, Next: If, Up: Conditional Syntax + +4.2.1 Ifdef +----------- + +The simplest sort of conditional is + + #ifdef MACRO + + CONTROLLED TEXT + + #endif /* MACRO */ + + This block is called a "conditional group". CONTROLLED TEXT will be +included in the output of the preprocessor if and only if MACRO is +defined. We say that the conditional "succeeds" if MACRO is defined, +"fails" if it is not. + + The CONTROLLED TEXT inside of a conditional can include +preprocessing directives. They are executed only if the conditional +succeeds. You can nest conditional groups inside other conditional +groups, but they must be completely nested. In other words, `#endif' +always matches the nearest `#ifdef' (or `#ifndef', or `#if'). Also, +you cannot start a conditional group in one file and end it in another. + + Even if a conditional fails, the CONTROLLED TEXT inside it is still +run through initial transformations and tokenization. Therefore, it +must all be lexically valid C. Normally the only way this matters is +that all comments and string literals inside a failing conditional group +must still be properly ended. + + The comment following the `#endif' is not required, but it is a good +practice if there is a lot of CONTROLLED TEXT, because it helps people +match the `#endif' to the corresponding `#ifdef'. Older programs +sometimes put MACRO directly after the `#endif' without enclosing it in +a comment. This is invalid code according to the C standard. CPP +accepts it with a warning. It never affects which `#ifndef' the +`#endif' matches. + + Sometimes you wish to use some code if a macro is _not_ defined. +You can do this by writing `#ifndef' instead of `#ifdef'. One common +use of `#ifndef' is to include code only the first time a header file +is included. *Note Once-Only Headers::. + + Macro definitions can vary between compilations for several reasons. +Here are some samples. + + * Some macros are predefined on each kind of machine (*note + System-specific Predefined Macros::). This allows you to provide + code specially tuned for a particular machine. + + * System header files define more macros, associated with the + features they implement. You can test these macros with + conditionals to avoid using a system feature on a machine where it + is not implemented. + + * Macros can be defined or undefined with the `-D' and `-U' command + line options when you compile the program. You can arrange to + compile the same source file into two different programs by + choosing a macro name to specify which program you want, writing + conditionals to test whether or how this macro is defined, and + then controlling the state of the macro with command line options, + perhaps set in the Makefile. *Note Invocation::. + + * Your program might have a special header file (often called + `config.h') that is adjusted when the program is compiled. It can + define or not define macros depending on the features of the + system and the desired capabilities of the program. The + adjustment can be automated by a tool such as `autoconf', or done + by hand. + + +File: cpp.info, Node: If, Next: Defined, Prev: Ifdef, Up: Conditional Syntax + +4.2.2 If +-------- + +The `#if' directive allows you to test the value of an arithmetic +expression, rather than the mere existence of one macro. Its syntax is + + #if EXPRESSION + + CONTROLLED TEXT + + #endif /* EXPRESSION */ + + EXPRESSION is a C expression of integer type, subject to stringent +restrictions. It may contain + + * Integer constants. + + * Character constants, which are interpreted as they would be in + normal code. + + * Arithmetic operators for addition, subtraction, multiplication, + division, bitwise operations, shifts, comparisons, and logical + operations (`&&' and `||'). The latter two obey the usual + short-circuiting rules of standard C. + + * Macros. All macros in the expression are expanded before actual + computation of the expression's value begins. + + * Uses of the `defined' operator, which lets you check whether macros + are defined in the middle of an `#if'. + + * Identifiers that are not macros, which are all considered to be the + number zero. This allows you to write `#if MACRO' instead of + `#ifdef MACRO', if you know that MACRO, when defined, will always + have a nonzero value. Function-like macros used without their + function call parentheses are also treated as zero. + + In some contexts this shortcut is undesirable. The `-Wundef' + option causes GCC to warn whenever it encounters an identifier + which is not a macro in an `#if'. + + The preprocessor does not know anything about types in the language. +Therefore, `sizeof' operators are not recognized in `#if', and neither +are `enum' constants. They will be taken as identifiers which are not +macros, and replaced by zero. In the case of `sizeof', this is likely +to cause the expression to be invalid. + + The preprocessor calculates the value of EXPRESSION. It carries out +all calculations in the widest integer type known to the compiler; on +most machines supported by GCC this is 64 bits. This is not the same +rule as the compiler uses to calculate the value of a constant +expression, and may give different results in some cases. If the value +comes out to be nonzero, the `#if' succeeds and the CONTROLLED TEXT is +included; otherwise it is skipped. + + +File: cpp.info, Node: Defined, Next: Else, Prev: If, Up: Conditional Syntax + +4.2.3 Defined +------------- + +The special operator `defined' is used in `#if' and `#elif' expressions +to test whether a certain name is defined as a macro. `defined NAME' +and `defined (NAME)' are both expressions whose value is 1 if NAME is +defined as a macro at the current point in the program, and 0 +otherwise. Thus, `#if defined MACRO' is precisely equivalent to +`#ifdef MACRO'. + + `defined' is useful when you wish to test more than one macro for +existence at once. For example, + + #if defined (__vax__) || defined (__ns16000__) + +would succeed if either of the names `__vax__' or `__ns16000__' is +defined as a macro. + + Conditionals written like this: + + #if defined BUFSIZE && BUFSIZE >= 1024 + +can generally be simplified to just `#if BUFSIZE >= 1024', since if +`BUFSIZE' is not defined, it will be interpreted as having the value +zero. + + If the `defined' operator appears as a result of a macro expansion, +the C standard says the behavior is undefined. GNU cpp treats it as a +genuine `defined' operator and evaluates it normally. It will warn +wherever your code uses this feature if you use the command-line option +`-pedantic', since other compilers may handle it differently. + + +File: cpp.info, Node: Else, Next: Elif, Prev: Defined, Up: Conditional Syntax + +4.2.4 Else +---------- + +The `#else' directive can be added to a conditional to provide +alternative text to be used if the condition fails. This is what it +looks like: + + #if EXPRESSION + TEXT-IF-TRUE + #else /* Not EXPRESSION */ + TEXT-IF-FALSE + #endif /* Not EXPRESSION */ + +If EXPRESSION is nonzero, the TEXT-IF-TRUE is included and the +TEXT-IF-FALSE is skipped. If EXPRESSION is zero, the opposite happens. + + You can use `#else' with `#ifdef' and `#ifndef', too. + + +File: cpp.info, Node: Elif, Prev: Else, Up: Conditional Syntax + +4.2.5 Elif +---------- + +One common case of nested conditionals is used to check for more than +two possible alternatives. For example, you might have + + #if X == 1 + ... + #else /* X != 1 */ + #if X == 2 + ... + #else /* X != 2 */ + ... + #endif /* X != 2 */ + #endif /* X != 1 */ + + Another conditional directive, `#elif', allows this to be +abbreviated as follows: + + #if X == 1 + ... + #elif X == 2 + ... + #else /* X != 2 and X != 1*/ + ... + #endif /* X != 2 and X != 1*/ + + `#elif' stands for "else if". Like `#else', it goes in the middle +of a conditional group and subdivides it; it does not require a +matching `#endif' of its own. Like `#if', the `#elif' directive +includes an expression to be tested. The text following the `#elif' is +processed only if the original `#if'-condition failed and the `#elif' +condition succeeds. + + More than one `#elif' can go in the same conditional group. Then +the text after each `#elif' is processed only if the `#elif' condition +succeeds after the original `#if' and all previous `#elif' directives +within it have failed. + + `#else' is allowed after any number of `#elif' directives, but +`#elif' may not follow `#else'. + + +File: cpp.info, Node: Deleted Code, Prev: Conditional Syntax, Up: Conditionals + +4.3 Deleted Code +================ + +If you replace or delete a part of the program but want to keep the old +code around for future reference, you often cannot simply comment it +out. Block comments do not nest, so the first comment inside the old +code will end the commenting-out. The probable result is a flood of +syntax errors. + + One way to avoid this problem is to use an always-false conditional +instead. For instance, put `#if 0' before the deleted code and +`#endif' after it. This works even if the code being turned off +contains conditionals, but they must be entire conditionals (balanced +`#if' and `#endif'). + + Some people use `#ifdef notdef' instead. This is risky, because +`notdef' might be accidentally defined as a macro, and then the +conditional would succeed. `#if 0' can be counted on to fail. + + Do not use `#if 0' for comments which are not C code. Use a real +comment, instead. The interior of `#if 0' must consist of complete +tokens; in particular, single-quote characters must balance. Comments +often contain unbalanced single-quote characters (known in English as +apostrophes). These confuse `#if 0'. They don't confuse `/*'. + + +File: cpp.info, Node: Diagnostics, Next: Line Control, Prev: Conditionals, Up: Top + +5 Diagnostics +************* + +The directive `#error' causes the preprocessor to report a fatal error. +The tokens forming the rest of the line following `#error' are used as +the error message. + + You would use `#error' inside of a conditional that detects a +combination of parameters which you know the program does not properly +support. For example, if you know that the program will not run +properly on a VAX, you might write + + #ifdef __vax__ + #error "Won't work on VAXen. See comments at get_last_object." + #endif + + If you have several configuration parameters that must be set up by +the installation in a consistent way, you can use conditionals to detect +an inconsistency and report it with `#error'. For example, + + #if !defined(UNALIGNED_INT_ASM_OP) && defined(DWARF2_DEBUGGING_INFO) + #error "DWARF2_DEBUGGING_INFO requires UNALIGNED_INT_ASM_OP." + #endif + + The directive `#warning' is like `#error', but causes the +preprocessor to issue a warning and continue preprocessing. The tokens +following `#warning' are used as the warning message. + + You might use `#warning' in obsolete header files, with a message +directing the user to the header file which should be used instead. + + Neither `#error' nor `#warning' macro-expands its argument. +Internal whitespace sequences are each replaced with a single space. +The line must consist of complete tokens. It is wisest to make the +argument of these directives be a single string constant; this avoids +problems with apostrophes and the like. + + +File: cpp.info, Node: Line Control, Next: Pragmas, Prev: Diagnostics, Up: Top + +6 Line Control +************** + +The C preprocessor informs the C compiler of the location in your source +code where each token came from. Presently, this is just the file name +and line number. All the tokens resulting from macro expansion are +reported as having appeared on the line of the source file where the +outermost macro was used. We intend to be more accurate in the future. + + If you write a program which generates source code, such as the +`bison' parser generator, you may want to adjust the preprocessor's +notion of the current file name and line number by hand. Parts of the +output from `bison' are generated from scratch, other parts come from a +standard parser file. The rest are copied verbatim from `bison''s +input. You would like compiler error messages and symbolic debuggers +to be able to refer to `bison''s input file. + + `bison' or any such program can arrange this by writing `#line' +directives into the output file. `#line' is a directive that specifies +the original line number and source file name for subsequent input in +the current preprocessor input file. `#line' has three variants: + +`#line LINENUM' + LINENUM is a non-negative decimal integer constant. It specifies + the line number which should be reported for the following line of + input. Subsequent lines are counted from LINENUM. + +`#line LINENUM FILENAME' + LINENUM is the same as for the first form, and has the same + effect. In addition, FILENAME is a string constant. The + following line and all subsequent lines are reported to come from + the file it specifies, until something else happens to change that. + FILENAME is interpreted according to the normal rules for a string + constant: backslash escapes are interpreted. This is different + from `#include'. + + Previous versions of CPP did not interpret escapes in `#line'; we + have changed it because the standard requires they be interpreted, + and most other compilers do. + +`#line ANYTHING ELSE' + ANYTHING ELSE is checked for macro calls, which are expanded. The + result should match one of the above two forms. + + `#line' directives alter the results of the `__FILE__' and +`__LINE__' predefined macros from that point on. *Note Standard +Predefined Macros::. They do not have any effect on `#include''s idea +of the directory containing the current file. This is a change from +GCC 2.95. Previously, a file reading + + #line 1 "../src/gram.y" + #include "gram.h" + + would search for `gram.h' in `../src', then the `-I' chain; the +directory containing the physical source file would not be searched. +In GCC 3.0 and later, the `#include' is not affected by the presence of +a `#line' referring to a different directory. + + We made this change because the old behavior caused problems when +generated source files were transported between machines. For instance, +it is common practice to ship generated parsers with a source release, +so that people building the distribution do not need to have yacc or +Bison installed. These files frequently have `#line' directives +referring to the directory tree of the system where the distribution was +created. If GCC tries to search for headers in those directories, the +build is likely to fail. + + The new behavior can cause failures too, if the generated file is not +in the same directory as its source and it attempts to include a header +which would be visible searching from the directory containing the +source file. However, this problem is easily solved with an additional +`-I' switch on the command line. The failures caused by the old +semantics could sometimes be corrected only by editing the generated +files, which is difficult and error-prone. + + +File: cpp.info, Node: Pragmas, Next: Other Directives, Prev: Line Control, Up: Top + +7 Pragmas +********* + +The `#pragma' directive is the method specified by the C standard for +providing additional information to the compiler, beyond what is +conveyed in the language itself. Three forms of this directive +(commonly known as "pragmas") are specified by the 1999 C standard. A +C compiler is free to attach any meaning it likes to other pragmas. + + GCC has historically preferred to use extensions to the syntax of the +language, such as `__attribute__', for this purpose. However, GCC does +define a few pragmas of its own. These mostly have effects on the +entire translation unit or source file. + + In GCC version 3, all GNU-defined, supported pragmas have been given +a `GCC' prefix. This is in line with the `STDC' prefix on all pragmas +defined by C99. For backward compatibility, pragmas which were +recognized by previous versions are still recognized without the `GCC' +prefix, but that usage is deprecated. Some older pragmas are +deprecated in their entirety. They are not recognized with the `GCC' +prefix. *Note Obsolete Features::. + + C99 introduces the `_Pragma' operator. This feature addresses a +major problem with `#pragma': being a directive, it cannot be produced +as the result of macro expansion. `_Pragma' is an operator, much like +`sizeof' or `defined', and can be embedded in a macro. + + Its syntax is `_Pragma (STRING-LITERAL)', where STRING-LITERAL can +be either a normal or wide-character string literal. It is +destringized, by replacing all `\\' with a single `\' and all `\"' with +a `"'. The result is then processed as if it had appeared as the right +hand side of a `#pragma' directive. For example, + + _Pragma ("GCC dependency \"parse.y\"") + +has the same effect as `#pragma GCC dependency "parse.y"'. The same +effect could be achieved using macros, for example + + #define DO_PRAGMA(x) _Pragma (#x) + DO_PRAGMA (GCC dependency "parse.y") + + The standard is unclear on where a `_Pragma' operator can appear. +The preprocessor does not accept it within a preprocessing conditional +directive like `#if'. To be safe, you are probably best keeping it out +of directives other than `#define', and putting it on a line of its own. + + This manual documents the pragmas which are meaningful to the +preprocessor itself. Other pragmas are meaningful to the C or C++ +compilers. They are documented in the GCC manual. + +`#pragma GCC dependency' + `#pragma GCC dependency' allows you to check the relative dates of + the current file and another file. If the other file is more + recent than the current file, a warning is issued. This is useful + if the current file is derived from the other file, and should be + regenerated. The other file is searched for using the normal + include search path. Optional trailing text can be used to give + more information in the warning message. + + #pragma GCC dependency "parse.y" + #pragma GCC dependency "/usr/include/time.h" rerun fixincludes + +`#pragma GCC poison' + Sometimes, there is an identifier that you want to remove + completely from your program, and make sure that it never creeps + back in. To enforce this, you can "poison" the identifier with + this pragma. `#pragma GCC poison' is followed by a list of + identifiers to poison. If any of those identifiers appears + anywhere in the source after the directive, it is a hard error. + For example, + + #pragma GCC poison printf sprintf fprintf + sprintf(some_string, "hello"); + + will produce an error. + + If a poisoned identifier appears as part of the expansion of a + macro which was defined before the identifier was poisoned, it + will _not_ cause an error. This lets you poison an identifier + without worrying about system headers defining macros that use it. + + For example, + + #define strrchr rindex + #pragma GCC poison rindex + strrchr(some_string, 'h'); + + will not produce an error. + +`#pragma GCC system_header' + This pragma takes no arguments. It causes the rest of the code in + the current file to be treated as if it came from a system header. + *Note System Headers::. + + + +File: cpp.info, Node: Other Directives, Next: Preprocessor Output, Prev: Pragmas, Up: Top + +8 Other Directives +****************** + +The `#ident' directive takes one argument, a string constant. On some +systems, that string constant is copied into a special segment of the +object file. On other systems, the directive is ignored. + + This directive is not part of the C standard, but it is not an +official GNU extension either. We believe it came from System V. + + The `#sccs' directive is recognized, because it appears in the +header files of some systems. It is a very old, obscure, extension +which we did not invent, and we have been unable to find any +documentation of what it should do, so GCC simply ignores it. + + The "null directive" consists of a `#' followed by a newline, with +only whitespace (including comments) in between. A null directive is +understood as a preprocessing directive but has no effect on the +preprocessor output. The primary significance of the existence of the +null directive is that an input line consisting of just a `#' will +produce no output, rather than a line of output containing just a `#'. +Supposedly some old C programs contain such lines. + + +File: cpp.info, Node: Preprocessor Output, Next: Traditional Mode, Prev: Other Directives, Up: Top + +9 Preprocessor Output +********************* + +When the C preprocessor is used with the C, C++, or Objective-C +compilers, it is integrated into the compiler and communicates a stream +of binary tokens directly to the compiler's parser. However, it can +also be used in the more conventional standalone mode, where it produces +textual output. + + The output from the C preprocessor looks much like the input, except +that all preprocessing directive lines have been replaced with blank +lines and all comments with spaces. Long runs of blank lines are +discarded. + + The ISO standard specifies that it is implementation defined whether +a preprocessor preserves whitespace between tokens, or replaces it with +e.g. a single space. In GNU CPP, whitespace between tokens is collapsed +to become a single space, with the exception that the first token on a +non-directive line is preceded with sufficient spaces that it appears in +the same column in the preprocessed output that it appeared in the +original source file. This is so the output is easy to read. *Note +Differences from previous versions::. CPP does not insert any +whitespace where there was none in the original source, except where +necessary to prevent an accidental token paste. + + Source file name and line number information is conveyed by lines of +the form + + # LINENUM FILENAME FLAGS + +These are called "linemarkers". They are inserted as needed into the +output (but never within a string or character constant). They mean +that the following line originated in file FILENAME at line LINENUM. +FILENAME will never contain any non-printing characters; they are +replaced with octal escape sequences. + + After the file name comes zero or more flags, which are `1', `2', +`3', or `4'. If there are multiple flags, spaces separate them. Here +is what the flags mean: + +`1' + This indicates the start of a new file. + +`2' + This indicates returning to a file (after having included another + file). + +`3' + This indicates that the following text comes from a system header + file, so certain warnings should be suppressed. + +`4' + This indicates that the following text should be treated as being + wrapped in an implicit `extern "C"' block. + + As an extension, the preprocessor accepts linemarkers in +non-assembler input files. They are treated like the corresponding +`#line' directive, (*note Line Control::), except that trailing flags +are permitted, and are interpreted with the meanings described above. +If multiple flags are given, they must be in ascending order. + + Some directives may be duplicated in the output of the preprocessor. +These are `#ident' (always), `#pragma' (only if the preprocessor does +not handle the pragma itself), and `#define' and `#undef' (with certain +debugging options). If this happens, the `#' of the directive will +always be in the first column, and there will be no space between the +`#' and the directive name. If macro expansion happens to generate +tokens which might be mistaken for a duplicated directive, a space will +be inserted between the `#' and the directive name. + + +File: cpp.info, Node: Traditional Mode, Next: Implementation Details, Prev: Preprocessor Output, Up: Top + +10 Traditional Mode +******************* + +Traditional (pre-standard) C preprocessing is rather different from the +preprocessing specified by the standard. When GCC is given the +`-traditional-cpp' option, it attempts to emulate a traditional +preprocessor. + + GCC versions 3.2 and later only support traditional mode semantics in +the preprocessor, and not in the compiler front ends. This chapter +outlines the traditional preprocessor semantics we implemented. + + The implementation does not correspond precisely to the behavior of +earlier versions of GCC, nor to any true traditional preprocessor. +After all, inconsistencies among traditional implementations were a +major motivation for C standardization. However, we intend that it +should be compatible with true traditional preprocessors in all ways +that actually matter. + +* Menu: + +* Traditional lexical analysis:: +* Traditional macros:: +* Traditional miscellany:: +* Traditional warnings:: + + +File: cpp.info, Node: Traditional lexical analysis, Next: Traditional macros, Up: Traditional Mode + +10.1 Traditional lexical analysis +================================= + +The traditional preprocessor does not decompose its input into tokens +the same way a standards-conforming preprocessor does. The input is +simply treated as a stream of text with minimal internal form. + + This implementation does not treat trigraphs (*note trigraphs::) +specially since they were an invention of the standards committee. It +handles arbitrarily-positioned escaped newlines properly and splices +the lines as you would expect; many traditional preprocessors did not +do this. + + The form of horizontal whitespace in the input file is preserved in +the output. In particular, hard tabs remain hard tabs. This can be +useful if, for example, you are preprocessing a Makefile. + + Traditional CPP only recognizes C-style block comments, and treats +the `/*' sequence as introducing a comment only if it lies outside +quoted text. Quoted text is introduced by the usual single and double +quotes, and also by an initial `<' in a `#include' directive. + + Traditionally, comments are completely removed and are not replaced +with a space. Since a traditional compiler does its own tokenization +of the output of the preprocessor, this means that comments can +effectively be used as token paste operators. However, comments behave +like separators for text handled by the preprocessor itself, since it +doesn't re-lex its input. For example, in + + #if foo/**/bar + +`foo' and `bar' are distinct identifiers and expanded separately if +they happen to be macros. In other words, this directive is equivalent +to + + #if foo bar + +rather than + + #if foobar + + Generally speaking, in traditional mode an opening quote need not +have a matching closing quote. In particular, a macro may be defined +with replacement text that contains an unmatched quote. Of course, if +you attempt to compile preprocessed output containing an unmatched quote +you will get a syntax error. + + However, all preprocessing directives other than `#define' require +matching quotes. For example: + + #define m This macro's fine and has an unmatched quote + "/* This is not a comment. */ + /* This is a comment. The following #include directive + is ill-formed. */ + #include ++foo; + + Function-like macros are similar in form but quite different in +behavior to their ISO counterparts. Their arguments are contained +within parentheses, are comma-separated, and can cross physical lines. +Commas within nested parentheses are not treated as argument +separators. Similarly, a quote in an argument cannot be left unclosed; +a following comma or parenthesis that comes before the closing quote is +treated like any other character. There is no facility for handling +variadic macros. + + This implementation removes all comments from macro arguments, unless +the `-C' option is given. The form of all other horizontal whitespace +in arguments is preserved, including leading and trailing whitespace. +In particular + + f( ) + +is treated as an invocation of the macro `f' with a single argument +consisting of a single space. If you want to invoke a function-like +macro that takes no arguments, you must not leave any whitespace +between the parentheses. + + If a macro argument crosses a new line, the new line is replaced with +a space when forming the argument. If the previous line contained an +unterminated quote, the following line inherits the quoted state. + + Traditional preprocessors replace parameters in the replacement text +with their arguments regardless of whether the parameters are within +quotes or not. This provides a way to stringize arguments. For example + + #define str(x) "x" + str(/* A comment */some text ) + ==> "some text " + +Note that the comment is removed, but that the trailing space is +preserved. Here is an example of using a comment to effect token +pasting. + + #define suffix(x) foo_/**/x + suffix(bar) + ==> foo_bar + + +File: cpp.info, Node: Traditional miscellany, Next: Traditional warnings, Prev: Traditional macros, Up: Traditional Mode + +10.3 Traditional miscellany +=========================== + +Here are some things to be aware of when using the traditional +preprocessor. + + * Preprocessing directives are recognized only when their leading + `#' appears in the first column. There can be no whitespace + between the beginning of the line and the `#', but whitespace can + follow the `#'. + + * A true traditional C preprocessor does not recognize `#error' or + `#pragma', and may not recognize `#elif'. CPP supports all the + directives in traditional mode that it supports in ISO mode, + including extensions, with the exception that the effects of + `#pragma GCC poison' are undefined. + + * __STDC__ is not defined. + + * If you use digraphs the behavior is undefined. + + * If a line that looks like a directive appears within macro + arguments, the behavior is undefined. + + + +File: cpp.info, Node: Traditional warnings, Prev: Traditional miscellany, Up: Traditional Mode + +10.4 Traditional warnings +========================= + +You can request warnings about features that did not exist, or worked +differently, in traditional C with the `-Wtraditional' option. GCC +does not warn about features of ISO C which you must use when you are +using a conforming compiler, such as the `#' and `##' operators. + + Presently `-Wtraditional' warns about: + + * Macro parameters that appear within string literals in the macro + body. In traditional C macro replacement takes place within + string literals, but does not in ISO C. + + * In traditional C, some preprocessor directives did not exist. + Traditional preprocessors would only consider a line to be a + directive if the `#' appeared in column 1 on the line. Therefore + `-Wtraditional' warns about directives that traditional C + understands but would ignore because the `#' does not appear as the + first character on the line. It also suggests you hide directives + like `#pragma' not understood by traditional C by indenting them. + Some traditional implementations would not recognize `#elif', so it + suggests avoiding it altogether. + + * A function-like macro that appears without an argument list. In + some traditional preprocessors this was an error. In ISO C it + merely means that the macro is not expanded. + + * The unary plus operator. This did not exist in traditional C. + + * The `U' and `LL' integer constant suffixes, which were not + available in traditional C. (Traditional C does support the `L' + suffix for simple long integer constants.) You are not warned + about uses of these suffixes in macros defined in system headers. + For instance, `UINT_MAX' may well be defined as `4294967295U', but + you will not be warned if you use `UINT_MAX'. + + You can usually avoid the warning, and the related warning about + constants which are so large that they are unsigned, by writing the + integer constant in question in hexadecimal, with no U suffix. + Take care, though, because this gives the wrong result in exotic + cases. + + +File: cpp.info, Node: Implementation Details, Next: Invocation, Prev: Traditional Mode, Up: Top + +11 Implementation Details +************************* + +Here we document details of how the preprocessor's implementation +affects its user-visible behavior. You should try to avoid undue +reliance on behavior described here, as it is possible that it will +change subtly in future implementations. + + Also documented here are obsolete features and changes from previous +versions of CPP. + +* Menu: + +* Implementation-defined behavior:: +* Implementation limits:: +* Obsolete Features:: +* Differences from previous versions:: + + +File: cpp.info, Node: Implementation-defined behavior, Next: Implementation limits, Up: Implementation Details + +11.1 Implementation-defined behavior +==================================== + +This is how CPP behaves in all the cases which the C standard describes +as "implementation-defined". This term means that the implementation +is free to do what it likes, but must document its choice and stick to +it. + + * The mapping of physical source file multi-byte characters to the + execution character set. + + Currently, CPP requires its input to be ASCII or UTF-8. The + execution character set may be controlled by the user, with the + `-ftarget-charset' and `-ftarget-wide-charset' options. + + * Identifier characters. + + The C and C++ standards allow identifiers to be composed of `_' + and the alphanumeric characters. C++ and C99 also allow universal + character names (not implemented in GCC), and C99 further permits + implementation-defined characters. + + GCC allows the `$' character in identifiers as an extension for + most targets. This is true regardless of the `std=' switch, since + this extension cannot conflict with standards-conforming programs. + When preprocessing assembler, however, dollars are not identifier + characters by default. + + Currently the targets that by default do not permit `$' are AVR, + IP2K, MMIX, MIPS Irix 3, ARM aout, and PowerPC targets for the AIX + and BeOS operating systems. + + You can override the default with `-fdollars-in-identifiers' or + `fno-dollars-in-identifiers'. *Note fdollars-in-identifiers::. + + * Non-empty sequences of whitespace characters. + + In textual output, each whitespace sequence is collapsed to a + single space. For aesthetic reasons, the first token on each + non-directive line of output is preceded with sufficient spaces + that it appears in the same column as it did in the original + source file. + + * The numeric value of character constants in preprocessor + expressions. + + The preprocessor and compiler interpret character constants in the + same way; i.e. escape sequences such as `\a' are given the values + they would have on the target machine. + + The compiler values a multi-character character constant a + character at a time, shifting the previous value left by the + number of bits per target character, and then or-ing in the + bit-pattern of the new character truncated to the width of a + target character. The final bit-pattern is given type `int', and + is therefore signed, regardless of whether single characters are + signed or not (a slight change from versions 3.1 and earlier of + GCC). If there are more characters in the constant than would fit + in the target `int' the compiler issues a warning, and the excess + leading characters are ignored. + + For example, 'ab' for a target with an 8-bit `char' would be + interpreted as + (int) ((unsigned char) 'a' * 256 + (unsigned char) 'b'), and + '\234a' as + (int) ((unsigned char) '\234' * 256 + (unsigned char) 'a'). + + * Source file inclusion. + + For a discussion on how the preprocessor locates header files, + *Note Include Operation::. + + * Interpretation of the filename resulting from a macro-expanded + `#include' directive. + + *Note Computed Includes::. + + * Treatment of a `#pragma' directive that after macro-expansion + results in a standard pragma. + + No macro expansion occurs on any `#pragma' directive line, so the + question does not arise. + + Note that GCC does not yet implement any of the standard pragmas. + + + +File: cpp.info, Node: Implementation limits, Next: Obsolete Features, Prev: Implementation-defined behavior, Up: Implementation Details + +11.2 Implementation limits +========================== + +CPP has a small number of internal limits. This section lists the +limits which the C standard requires to be no lower than some minimum, +and all the others known. It is intended that there should be as few +limits as possible. If you encounter an undocumented or inconvenient +limit, please report that as a bug. *Note Reporting Bugs: (gcc)Bugs. + + Where we say something is limited "only by available memory", that +means that internal data structures impose no intrinsic limit, and space +is allocated with `malloc' or equivalent. The actual limit will +therefore depend on many things, such as the size of other things +allocated by the compiler at the same time, the amount of memory +consumed by other processes on the same computer, etc. + + * Nesting levels of `#include' files. + + We impose an arbitrary limit of 200 levels, to avoid runaway + recursion. The standard requires at least 15 levels. + + * Nesting levels of conditional inclusion. + + The C standard mandates this be at least 63. CPP is limited only + by available memory. + + * Levels of parenthesized expressions within a full expression. + + The C standard requires this to be at least 63. In preprocessor + conditional expressions, it is limited only by available memory. + + * Significant initial characters in an identifier or macro name. + + The preprocessor treats all characters as significant. The C + standard requires only that the first 63 be significant. + + * Number of macros simultaneously defined in a single translation + unit. + + The standard requires at least 4095 be possible. CPP is limited + only by available memory. + + * Number of parameters in a macro definition and arguments in a + macro call. + + We allow `USHRT_MAX', which is no smaller than 65,535. The minimum + required by the standard is 127. + + * Number of characters on a logical source line. + + The C standard requires a minimum of 4096 be permitted. CPP places + no limits on this, but you may get incorrect column numbers + reported in diagnostics for lines longer than 65,535 characters. + + * Maximum size of a source file. + + The standard does not specify any lower limit on the maximum size + of a source file. GNU cpp maps files into memory, so it is + limited by the available address space. This is generally at + least two gigabytes. Depending on the operating system, the size + of physical memory may or may not be a limitation. + + + +File: cpp.info, Node: Obsolete Features, Next: Differences from previous versions, Prev: Implementation limits, Up: Implementation Details + +11.3 Obsolete Features +====================== + +CPP has a number of features which are present mainly for compatibility +with older programs. We discourage their use in new code. In some +cases, we plan to remove the feature in a future version of GCC. + +* Menu: + +* Assertions:: +* Obsolete once-only headers:: + + +File: cpp.info, Node: Assertions, Next: Obsolete once-only headers, Up: Obsolete Features + +11.3.1 Assertions +----------------- + +"Assertions" are a deprecated alternative to macros in writing +conditionals to test what sort of computer or system the compiled +program will run on. Assertions are usually predefined, but you can +define them with preprocessing directives or command-line options. + + Assertions were intended to provide a more systematic way to describe +the compiler's target system. However, in practice they are just as +unpredictable as the system-specific predefined macros. In addition, +they are not part of any standard, and only a few compilers support +them. Therefore, the use of assertions is *less* portable than the use +of system-specific predefined macros. We recommend you do not use them +at all. + + An assertion looks like this: + + #PREDICATE (ANSWER) + +PREDICATE must be a single identifier. ANSWER can be any sequence of +tokens; all characters are significant except for leading and trailing +whitespace, and differences in internal whitespace sequences are +ignored. (This is similar to the rules governing macro redefinition.) +Thus, `(x + y)' is different from `(x+y)' but equivalent to +`( x + y )'. Parentheses do not nest inside an answer. + + To test an assertion, you write it in an `#if'. For example, this +conditional succeeds if either `vax' or `ns16000' has been asserted as +an answer for `machine'. + + #if #machine (vax) || #machine (ns16000) + +You can test whether _any_ answer is asserted for a predicate by +omitting the answer in the conditional: + + #if #machine + + Assertions are made with the `#assert' directive. Its sole argument +is the assertion to make, without the leading `#' that identifies +assertions in conditionals. + + #assert PREDICATE (ANSWER) + +You may make several assertions with the same predicate and different +answers. Subsequent assertions do not override previous ones for the +same predicate. All the answers for any given predicate are +simultaneously true. + + Assertions can be canceled with the `#unassert' directive. It has +the same syntax as `#assert'. In that form it cancels only the answer +which was specified on the `#unassert' line; other answers for that +predicate remain true. You can cancel an entire predicate by leaving +out the answer: + + #unassert PREDICATE + +In either form, if no such assertion has been made, `#unassert' has no +effect. + + You can also make or cancel assertions using command line options. +*Note Invocation::. + + +File: cpp.info, Node: Obsolete once-only headers, Prev: Assertions, Up: Obsolete Features + +11.3.2 Obsolete once-only headers +--------------------------------- + +CPP supports two more ways of indicating that a header file should be +read only once. Neither one is as portable as a wrapper `#ifndef', and +we recommend you do not use them in new programs. + + In the Objective-C language, there is a variant of `#include' called +`#import' which includes a file, but does so at most once. If you use +`#import' instead of `#include', then you don't need the conditionals +inside the header file to prevent multiple inclusion of the contents. +GCC permits the use of `#import' in C and C++ as well as Objective-C. +However, it is not in standard C or C++ and should therefore not be +used by portable programs. + + `#import' is not a well designed feature. It requires the users of +a header file to know that it should only be included once. It is much +better for the header file's implementor to write the file so that users +don't need to know this. Using a wrapper `#ifndef' accomplishes this +goal. + + In the present implementation, a single use of `#import' will +prevent the file from ever being read again, by either `#import' or +`#include'. You should not rely on this; do not use both `#import' and +`#include' to refer to the same header file. + + Another way to prevent a header file from being included more than +once is with the `#pragma once' directive. If `#pragma once' is seen +when scanning a header file, that file will never be read again, no +matter what. + + `#pragma once' does not have the problems that `#import' does, but +it is not recognized by all preprocessors, so you cannot rely on it in +a portable program. + + +File: cpp.info, Node: Differences from previous versions, Prev: Obsolete Features, Up: Implementation Details + +11.4 Differences from previous versions +======================================= + +This section details behavior which has changed from previous versions +of CPP. We do not plan to change it again in the near future, but we +do not promise not to, either. + + The "previous versions" discussed here are 2.95 and before. The +behavior of GCC 3.0 is mostly the same as the behavior of the widely +used 2.96 and 2.97 development snapshots. Where there are differences, +they generally represent bugs in the snapshots. + + * Order of evaluation of `#' and `##' operators + + The standard does not specify the order of evaluation of a chain of + `##' operators, nor whether `#' is evaluated before, after, or at + the same time as `##'. You should therefore not write any code + which depends on any specific ordering. It is possible to + guarantee an ordering, if you need one, by suitable use of nested + macros. + + An example of where this might matter is pasting the arguments `1', + `e' and `-2'. This would be fine for left-to-right pasting, but + right-to-left pasting would produce an invalid token `e-2'. + + GCC 3.0 evaluates `#' and `##' at the same time and strictly left + to right. Older versions evaluated all `#' operators first, then + all `##' operators, in an unreliable order. + + * The form of whitespace between tokens in preprocessor output + + *Note Preprocessor Output::, for the current textual format. This + is also the format used by stringification. Normally, the + preprocessor communicates tokens directly to the compiler's + parser, and whitespace does not come up at all. + + Older versions of GCC preserved all whitespace provided by the + user and inserted lots more whitespace of their own, because they + could not accurately predict when extra spaces were needed to + prevent accidental token pasting. + + * Optional argument when invoking rest argument macros + + As an extension, GCC permits you to omit the variable arguments + entirely when you use a variable argument macro. This is + forbidden by the 1999 C standard, and will provoke a pedantic + warning with GCC 3.0. Previous versions accepted it silently. + + * `##' swallowing preceding text in rest argument macros + + Formerly, in a macro expansion, if `##' appeared before a variable + arguments parameter, and the set of tokens specified for that + argument in the macro invocation was empty, previous versions of + CPP would back up and remove the preceding sequence of + non-whitespace characters (*not* the preceding token). This + extension is in direct conflict with the 1999 C standard and has + been drastically pared back. + + In the current version of the preprocessor, if `##' appears between + a comma and a variable arguments parameter, and the variable + argument is omitted entirely, the comma will be removed from the + expansion. If the variable argument is empty, or the token before + `##' is not a comma, then `##' behaves as a normal token paste. + + * `#line' and `#include' + + The `#line' directive used to change GCC's notion of the + "directory containing the current file," used by `#include' with a + double-quoted header file name. In 3.0 and later, it does not. + *Note Line Control::, for further explanation. + + * Syntax of `#line' + + In GCC 2.95 and previous, the string constant argument to `#line' + was treated the same way as the argument to `#include': backslash + escapes were not honored, and the string ended at the second `"'. + This is not compliant with the C standard. In GCC 3.0, an attempt + was made to correct the behavior, so that the string was treated + as a real string constant, but it turned out to be buggy. In 3.1, + the bugs have been fixed. (We are not fixing the bugs in 3.0 + because they affect relatively few people and the fix is quite + invasive.) + + + +File: cpp.info, Node: Invocation, Next: Environment Variables, Prev: Implementation Details, Up: Top + +12 Invocation +************* + +Most often when you use the C preprocessor you will not have to invoke +it explicitly: the C compiler will do so automatically. However, the +preprocessor is sometimes useful on its own. All the options listed +here are also acceptable to the C compiler and have the same meaning, +except that the C compiler has different rules for specifying the output +file. + + *Note_* Whether you use the preprocessor by way of `gcc' or `cpp', +the "compiler driver" is run first. This program's purpose is to +translate your command into invocations of the programs that do the +actual work. Their command line interfaces are similar but not +identical to the documented interface, and may change without notice. + + The C preprocessor expects two file names as arguments, INFILE and +OUTFILE. The preprocessor reads INFILE together with any other files +it specifies with `#include'. All the output generated by the combined +input files is written in OUTFILE. + + Either INFILE or OUTFILE may be `-', which as INFILE means to read +from standard input and as OUTFILE means to write to standard output. +Also, if either file is omitted, it means the same as if `-' had been +specified for that file. + + Unless otherwise noted, or the option ends in `=', all options which +take an argument may have that argument appear either immediately after +the option, or with a space between option and argument: `-Ifoo' and +`-I foo' have the same effect. + + Many options have multi-letter names; therefore multiple +single-letter options may _not_ be grouped: `-dM' is very different from +`-d -M'. + +`-D NAME' + Predefine NAME as a macro, with definition `1'. + +`-D NAME=DEFINITION' + Predefine NAME as a macro, with definition DEFINITION. The + contents of DEFINITION are tokenized and processed as if they + appeared during translation phase three in a `#define' directive. + In particular, the definition will be truncated by embedded + newline characters. + + If you are invoking the preprocessor from a shell or shell-like + program you may need to use the shell's quoting syntax to protect + characters such as spaces that have a meaning in the shell syntax. + + If you wish to define a function-like macro on the command line, + write its argument list with surrounding parentheses before the + equals sign (if any). Parentheses are meaningful to most shells, + so you will need to quote the option. With `sh' and `csh', + `-D'NAME(ARGS...)=DEFINITION'' works. + + `-D' and `-U' options are processed in the order they are given on + the command line. All `-imacros FILE' and `-include FILE' options + are processed after all `-D' and `-U' options. + +`-U NAME' + Cancel any previous definition of NAME, either built in or + provided with a `-D' option. + +`-undef' + Do not predefine any system-specific or GCC-specific macros. The + standard predefined macros remain defined. *Note Standard + Predefined Macros::. + +`-I DIR' + Add the directory DIR to the list of directories to be searched + for header files. *Note Search Path::. Directories named by `-I' + are searched before the standard system include directories. If + the directory DIR is a standard system include directory, the + option is ignored to ensure that the default search order for + system directories and the special treatment of system headers are + not defeated (*note System Headers::) . + +`-o FILE' + Write output to FILE. This is the same as specifying FILE as the + second non-option argument to `cpp'. `gcc' has a different + interpretation of a second non-option argument, so you must use + `-o' to specify the output file. + +`-Wall' + Turns on all optional warnings which are desirable for normal code. + At present this is `-Wcomment', `-Wtrigraphs', `-Wmultichar' and a + warning about integer promotion causing a change of sign in `#if' + expressions. Note that many of the preprocessor's warnings are on + by default and have no options to control them. + +`-Wcomment' +`-Wcomments' + Warn whenever a comment-start sequence `/*' appears in a `/*' + comment, or whenever a backslash-newline appears in a `//' comment. + (Both forms have the same effect.) + +`-Wtrigraphs' + Most trigraphs in comments cannot affect the meaning of the + program. However, a trigraph that would form an escaped newline + (`??/' at the end of a line) can, by changing where the comment + begins or ends. Therefore, only trigraphs that would form escaped + newlines produce warnings inside a comment. + + This option is implied by `-Wall'. If `-Wall' is not given, this + option is still enabled unless trigraphs are enabled. To get + trigraph conversion without warnings, but get the other `-Wall' + warnings, use `-trigraphs -Wall -Wno-trigraphs'. + +`-Wtraditional' + Warn about certain constructs that behave differently in + traditional and ISO C. Also warn about ISO C constructs that have + no traditional C equivalent, and problematic constructs which + should be avoided. *Note Traditional Mode::. + +`-Wimport' + Warn the first time `#import' is used. + +`-Wundef' + Warn whenever an identifier which is not a macro is encountered in + an `#if' directive, outside of `defined'. Such identifiers are + replaced with zero. + +`-Wunused-macros' + Warn about macros defined in the main file that are unused. A + macro is "used" if it is expanded or tested for existence at least + once. The preprocessor will also warn if the macro has not been + used at the time it is redefined or undefined. + + Built-in macros, macros defined on the command line, and macros + defined in include files are not warned about. + + *Note_* If a macro is actually used, but only used in skipped + conditional blocks, then CPP will report it as unused. To avoid + the warning in such a case, you might improve the scope of the + macro's definition by, for example, moving it into the first + skipped block. Alternatively, you could provide a dummy use with + something like: + + #if defined the_macro_causing_the_warning + #endif + +`-Wendif-labels' + Warn whenever an `#else' or an `#endif' are followed by text. + This usually happens in code of the form + + #if FOO + ... + #else FOO + ... + #endif FOO + + The second and third `FOO' should be in comments, but often are not + in older programs. This warning is on by default. + +`-Werror' + Make all warnings into hard errors. Source code which triggers + warnings will be rejected. + +`-Wsystem-headers' + Issue warnings for code in system headers. These are normally + unhelpful in finding bugs in your own code, therefore suppressed. + If you are responsible for the system library, you may want to see + them. + +`-w' + Suppress all warnings, including those which GNU CPP issues by + default. + +`-pedantic' + Issue all the mandatory diagnostics listed in the C standard. + Some of them are left out by default, since they trigger + frequently on harmless code. + +`-pedantic-errors' + Issue all the mandatory diagnostics, and make all mandatory + diagnostics into errors. This includes mandatory diagnostics that + GCC issues without `-pedantic' but treats as warnings. + +`-M' + Instead of outputting the result of preprocessing, output a rule + suitable for `make' describing the dependencies of the main source + file. The preprocessor outputs one `make' rule containing the + object file name for that source file, a colon, and the names of + all the included files, including those coming from `-include' or + `-imacros' command line options. + + Unless specified explicitly (with `-MT' or `-MQ'), the object file + name consists of the basename of the source file with any suffix + replaced with object file suffix. If there are many included + files then the rule is split into several lines using `\'-newline. + The rule has no commands. + + This option does not suppress the preprocessor's debug output, + such as `-dM'. To avoid mixing such debug output with the + dependency rules you should explicitly specify the dependency + output file with `-MF', or use an environment variable like + `DEPENDENCIES_OUTPUT' (*note Environment Variables::). Debug + output will still be sent to the regular output stream as normal. + + Passing `-M' to the driver implies `-E', and suppresses warnings + with an implicit `-w'. + +`-MM' + Like `-M' but do not mention header files that are found in system + header directories, nor header files that are included, directly + or indirectly, from such a header. + + This implies that the choice of angle brackets or double quotes in + an `#include' directive does not in itself determine whether that + header will appear in `-MM' dependency output. This is a slight + change in semantics from GCC versions 3.0 and earlier. + +`-MF FILE' + When used with `-M' or `-MM', specifies a file to write the + dependencies to. If no `-MF' switch is given the preprocessor + sends the rules to the same place it would have sent preprocessed + output. + + When used with the driver options `-MD' or `-MMD', `-MF' overrides + the default dependency output file. + +`-MG' + In conjunction with an option such as `-M' requesting dependency + generation, `-MG' assumes missing header files are generated files + and adds them to the dependency list without raising an error. + The dependency filename is taken directly from the `#include' + directive without prepending any path. `-MG' also suppresses + preprocessed output, as a missing header file renders this useless. + + This feature is used in automatic updating of makefiles. + +`-MP' + This option instructs CPP to add a phony target for each dependency + other than the main file, causing each to depend on nothing. These + dummy rules work around errors `make' gives if you remove header + files without updating the `Makefile' to match. + + This is typical output: + + test.o: test.c test.h + + test.h: + +`-MT TARGET' + Change the target of the rule emitted by dependency generation. By + default CPP takes the name of the main input file, including any + path, deletes any file suffix such as `.c', and appends the + platform's usual object suffix. The result is the target. + + An `-MT' option will set the target to be exactly the string you + specify. If you want multiple targets, you can specify them as a + single argument to `-MT', or use multiple `-MT' options. + + For example, `-MT '$(objpfx)foo.o'' might give + + $(objpfx)foo.o: foo.c + +`-MQ TARGET' + Same as `-MT', but it quotes any characters which are special to + Make. `-MQ '$(objpfx)foo.o'' gives + + $$(objpfx)foo.o: foo.c + + The default target is automatically quoted, as if it were given + with `-MQ'. + +`-MD' + `-MD' is equivalent to `-M -MF FILE', except that `-E' is not + implied. The driver determines FILE based on whether an `-o' + option is given. If it is, the driver uses its argument but with + a suffix of `.d', otherwise it take the basename of the input file + and applies a `.d' suffix. + + If `-MD' is used in conjunction with `-E', any `-o' switch is + understood to specify the dependency output file (but *note -MF: + dashMF.), but if used without `-E', each `-o' is understood to + specify a target object file. + + Since `-E' is not implied, `-MD' can be used to generate a + dependency output file as a side-effect of the compilation process. + +`-MMD' + Like `-MD' except mention only user header files, not system + -header files. + +`-x c' +`-x c++' +`-x objective-c' +`-x assembler-with-cpp' + Specify the source language: C, C++, Objective-C, or assembly. + This has nothing to do with standards conformance or extensions; + it merely selects which base syntax to expect. If you give none + of these options, cpp will deduce the language from the extension + of the source file: `.c', `.cc', `.m', or `.S'. Some other common + extensions for C++ and assembly are also recognized. If cpp does + not recognize the extension, it will treat the file as C; this is + the most generic mode. + + *Note_* Previous versions of cpp accepted a `-lang' option which + selected both the language and the standards conformance level. + This option has been removed, because it conflicts with the `-l' + option. + +`-std=STANDARD' +`-ansi' + Specify the standard to which the code should conform. Currently + CPP knows about C and C++ standards; others may be added in the + future. + + STANDARD may be one of: + `iso9899:1990' + `c89' + The ISO C standard from 1990. `c89' is the customary + shorthand for this version of the standard. + + The `-ansi' option is equivalent to `-std=c89'. + + `iso9899:199409' + The 1990 C standard, as amended in 1994. + + `iso9899:1999' + `c99' + `iso9899:199x' + `c9x' + The revised ISO C standard, published in December 1999. + Before publication, this was known as C9X. + + `gnu89' + The 1990 C standard plus GNU extensions. This is the default. + + `gnu99' + `gnu9x' + The 1999 C standard plus GNU extensions. + + `c++98' + The 1998 ISO C++ standard plus amendments. + + `gnu++98' + The same as `-std=c++98' plus GNU extensions. This is the + default for C++ code. + +`-I-' + Split the include path. Any directories specified with `-I' + options before `-I-' are searched only for headers requested with + `#include "FILE"'; they are not searched for `#include '. + If additional directories are specified with `-I' options after + the `-I-', those directories are searched for all `#include' + directives. + + In addition, `-I-' inhibits the use of the directory of the current + file directory as the first search directory for `#include "FILE"'. + *Note Search Path::. + +`-nostdinc' + Do not search the standard system directories for header files. + Only the directories you have specified with `-I' options (and the + directory of the current file, if appropriate) are searched. + +`-nostdinc++' + Do not search for header files in the C++-specific standard + directories, but do still search the other standard directories. + (This option is used when building the C++ library.) + +`-include FILE' + Process FILE as if `#include "file"' appeared as the first line of + the primary source file. However, the first directory searched + for FILE is the preprocessor's working directory _instead of_ the + directory containing the main source file. If not found there, it + is searched for in the remainder of the `#include "..."' search + chain as normal. + + If multiple `-include' options are given, the files are included + in the order they appear on the command line. + +`-imacros FILE' + Exactly like `-include', except that any output produced by + scanning FILE is thrown away. Macros it defines remain defined. + This allows you to acquire all the macros from a header without + also processing its declarations. + + All files specified by `-imacros' are processed before all files + specified by `-include'. + +`-idirafter DIR' + Search DIR for header files, but do it _after_ all directories + specified with `-I' and the standard system directories have been + exhausted. DIR is treated as a system include directory. + +`-iprefix PREFIX' + Specify PREFIX as the prefix for subsequent `-iwithprefix' + options. If the prefix represents a directory, you should include + the final `/'. + +`-iwithprefix DIR' +`-iwithprefixbefore DIR' + Append DIR to the prefix specified previously with `-iprefix', and + add the resulting directory to the include search path. + `-iwithprefixbefore' puts it in the same place `-I' would; + `-iwithprefix' puts it where `-idirafter' would. + +`-isystem DIR' + Search DIR for header files, after all directories specified by + `-I' but before the standard system directories. Mark it as a + system directory, so that it gets the same special treatment as is + applied to the standard system directories. *Note System + Headers::. + +`-fdollars-in-identifiers' + Accept `$' in identifiers. *Note Identifier characters::. + +`-fpreprocessed' + Indicate to the preprocessor that the input file has already been + preprocessed. This suppresses things like macro expansion, + trigraph conversion, escaped newline splicing, and processing of + most directives. The preprocessor still recognizes and removes + comments, so that you can pass a file preprocessed with `-C' to + the compiler without problems. In this mode the integrated + preprocessor is little more than a tokenizer for the front ends. + + `-fpreprocessed' is implicit if the input file has one of the + extensions `.i', `.ii' or `.mi'. These are the extensions that + GCC uses for preprocessed files created by `-save-temps'. + +`-ftabstop=WIDTH' + Set the distance between tab stops. This helps the preprocessor + report correct column numbers in warnings or errors, even if tabs + appear on the line. If the value is less than 1 or greater than + 100, the option is ignored. The default is 8. + +`-fexec-charset=CHARSET' + Set the execution character set, used for string and character + constants. The default is UTF-8. CHARSET can be any encoding + supported by the system's `iconv' library routine. + +`-fwide-exec-charset=CHARSET' + Set the wide execution character set, used for wide string and + character constants. The default is UTF-32 or UTF-16, whichever + corresponds to the width of `wchar_t'. As with + `-ftarget-charset', CHARSET can be any encoding supported by the + system's `iconv' library routine; however, you will have problems + with encodings that do not fit exactly in `wchar_t'. + +`-finput-charset=CHARSET' + Set the input character set, used for translation from the + character set of the input file to the source character set used + by GCC. If the locale does not specify, or GCC cannot get this + information from the locale, the default is UTF-8. This can be + overridden by either the locale or this command line option. + Currently the command line option takes precedence if there's a + conflict. CHARSET can be any encoding supported by the system's + `iconv' library routine. + +`-fworking-directory' + Enable generation of linemarkers in the preprocessor output that + will let the compiler know the current working directory at the + time of preprocessing. When this option is enabled, the + preprocessor will emit, after the initial linemarker, a second + linemarker with the current working directory followed by two + slashes. GCC will use this directory, when it's present in the + preprocessed input, as the directory emitted as the current + working directory in some debugging information formats. This + option is implicitly enabled if debugging information is enabled, + but this can be inhibited with the negated form + `-fno-working-directory'. If the `-P' flag is present in the + command line, this option has no effect, since no `#line' + directives are emitted whatsoever. + +`-fno-show-column' + Do not print column numbers in diagnostics. This may be necessary + if diagnostics are being scanned by a program that does not + understand the column numbers, such as `dejagnu'. + +`-A PREDICATE=ANSWER' + Make an assertion with the predicate PREDICATE and answer ANSWER. + This form is preferred to the older form `-A PREDICATE(ANSWER)', + which is still supported, because it does not use shell special + characters. *Note Assertions::. + +`-A -PREDICATE=ANSWER' + Cancel an assertion with the predicate PREDICATE and answer ANSWER. + +`-dCHARS' + CHARS is a sequence of one or more of the following characters, + and must not be preceded by a space. Other characters are + interpreted by the compiler proper, or reserved for future + versions of GCC, and so are silently ignored. If you specify + characters whose behavior conflicts, the result is undefined. + + `M' + Instead of the normal output, generate a list of `#define' + directives for all the macros defined during the execution of + the preprocessor, including predefined macros. This gives + you a way of finding out what is predefined in your version + of the preprocessor. Assuming you have no file `foo.h', the + command + + touch foo.h; cpp -dM foo.h + + will show all the predefined macros. + + `D' + Like `M' except in two respects: it does _not_ include the + predefined macros, and it outputs _both_ the `#define' + directives and the result of preprocessing. Both kinds of + output go to the standard output file. + + `N' + Like `D', but emit only the macro names, not their expansions. + + `I' + Output `#include' directives in addition to the result of + preprocessing. + +`-P' + Inhibit generation of linemarkers in the output from the + preprocessor. This might be useful when running the preprocessor + on something that is not C code, and will be sent to a program + which might be confused by the linemarkers. *Note Preprocessor + Output::. + +`-C' + Do not discard comments. All comments are passed through to the + output file, except for comments in processed directives, which + are deleted along with the directive. + + You should be prepared for side effects when using `-C'; it causes + the preprocessor to treat comments as tokens in their own right. + For example, comments appearing at the start of what would be a + directive line have the effect of turning that line into an + ordinary source line, since the first token on the line is no + longer a `#'. + +`-CC' + Do not discard comments, including during macro expansion. This is + like `-C', except that comments contained within macros are also + passed through to the output file where the macro is expanded. + + In addition to the side-effects of the `-C' option, the `-CC' + option causes all C++-style comments inside a macro to be + converted to C-style comments. This is to prevent later use of + that macro from inadvertently commenting out the remainder of the + source line. + + The `-CC' option is generally used to support lint comments. + +`-traditional-cpp' + Try to imitate the behavior of old-fashioned C preprocessors, as + opposed to ISO C preprocessors. *Note Traditional Mode::. + +`-trigraphs' + Process trigraph sequences. *Note Initial processing::. + +`-remap' + Enable special code to work around file systems which only permit + very short file names, such as MS-DOS. + +`--help' +`--target-help' + Print text describing all the command line options instead of + preprocessing anything. + +`-v' + Verbose mode. Print out GNU CPP's version number at the beginning + of execution, and report the final form of the include path. + +`-H' + Print the name of each header file used, in addition to other + normal activities. Each name is indented to show how deep in the + `#include' stack it is. Precompiled header files are also + printed, even if they are found to be invalid; an invalid + precompiled header file is printed with `...x' and a valid one + with `...!' . + +`-version' +`--version' + Print out GNU CPP's version number. With one dash, proceed to + preprocess as normal. With two dashes, exit immediately. + + +File: cpp.info, Node: Environment Variables, Next: GNU Free Documentation License, Prev: Invocation, Up: Top + +13 Environment Variables +************************ + +This section describes the environment variables that affect how CPP +operates. You can use them to specify directories or prefixes to use +when searching for include files, or to control dependency output. + + Note that you can also specify places to search using options such as +`-I', and control dependency output with options like `-M' (*note +Invocation::). These take precedence over environment variables, which +in turn take precedence over the configuration of GCC. + +`CPATH' +`C_INCLUDE_PATH' +`CPLUS_INCLUDE_PATH' +`OBJC_INCLUDE_PATH' + Each variable's value is a list of directories separated by a + special character, much like `PATH', in which to look for header + files. The special character, `PATH_SEPARATOR', is + target-dependent and determined at GCC build time. For Microsoft + Windows-based targets it is a semicolon, and for almost all other + targets it is a colon. + + `CPATH' specifies a list of directories to be searched as if + specified with `-I', but after any paths given with `-I' options + on the command line. This environment variable is used regardless + of which language is being preprocessed. + + The remaining environment variables apply only when preprocessing + the particular language indicated. Each specifies a list of + directories to be searched as if specified with `-isystem', but + after any paths given with `-isystem' options on the command line. + + In all these variables, an empty element instructs the compiler to + search its current working directory. Empty elements can appear + at the beginning or end of a path. For instance, if the value of + `CPATH' is `:/special/include', that has the same effect as + `-I. -I/special/include'. + + See also *Note Search Path::. + +`DEPENDENCIES_OUTPUT' + If this variable is set, its value specifies how to output + dependencies for Make based on the non-system header files + processed by the compiler. System header files are ignored in the + dependency output. + + The value of `DEPENDENCIES_OUTPUT' can be just a file name, in + which case the Make rules are written to that file, guessing the + target name from the source file name. Or the value can have the + form `FILE TARGET', in which case the rules are written to file + FILE using TARGET as the target name. + + In other words, this environment variable is equivalent to + combining the options `-MM' and `-MF' (*note Invocation::), with + an optional `-MT' switch too. + +`SUNPRO_DEPENDENCIES' + This variable is the same as `DEPENDENCIES_OUTPUT' (see above), + except that system header files are not ignored, so it implies + `-M' rather than `-MM'. However, the dependence on the main input + file is omitted. *Note Invocation::. + + +File: cpp.info, Node: GNU Free Documentation License, Next: Index of Directives, Prev: Environment Variables, Up: Top + +GNU Free Documentation License +****************************** + + Version 1.2, November 2002 + + Copyright (C) 2000,2001,2002 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. + + 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 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 Warrany 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. + + +File: cpp.info, Node: Index of Directives, Next: Option Index, Prev: GNU Free Documentation License, Up: Top + +Index of Directives +******************* + +[index] +* Menu: + +* #assert: Assertions. (line 41) +* #define: Object-like Macros. (line 11) +* #elif: Elif. (line 6) +* #else: Else. (line 6) +* #endif: Ifdef. (line 6) +* #error: Diagnostics. (line 6) +* #ident: Other Directives. (line 6) +* #if: Conditional Syntax. (line 6) +* #ifdef: Ifdef. (line 6) +* #ifndef: Ifdef. (line 40) +* #import: Obsolete once-only headers. + (line 10) +* #include: Include Syntax. (line 6) +* #include_next: Wrapper Headers. (line 6) +* #line: Line Control. (line 20) +* #pragma GCC dependency: Pragmas. (line 53) +* #pragma GCC poison: Pragmas. (line 65) +* #pragma GCC system_header <1>: Pragmas. (line 92) +* #pragma GCC system_header: System Headers. (line 31) +* #sccs: Other Directives. (line 13) +* #unassert: Assertions. (line 52) +* #undef: Undefining and Redefining Macros. + (line 6) +* #warning: Diagnostics. (line 27) + + +File: cpp.info, Node: Option Index, Next: Concept Index, Prev: Index of Directives, Up: Top + +Option Index +************ + +CPP's command line options and environment variables are indexed here +without any initial `-' or `--'. + +[index] +* Menu: + +* A: Invocation. (line 476) +* ansi: Invocation. (line 308) +* C: Invocation. (line 524) +* C_INCLUDE_PATH: Environment Variables. + (line 16) +* CPATH: Environment Variables. + (line 15) +* CPLUS_INCLUDE_PATH: Environment Variables. + (line 17) +* D: Invocation. (line 39) +* dD: Invocation. (line 504) +* DEPENDENCIES_OUTPUT: Environment Variables. + (line 44) +* dI: Invocation. (line 513) +* dM: Invocation. (line 492) +* dN: Invocation. (line 510) +* fdollars-in-identifiers: Invocation. (line 411) +* fexec-charset: Invocation. (line 433) +* finput-charset: Invocation. (line 446) +* fno-show-column: Invocation. (line 471) +* fno-working-directory: Invocation. (line 456) +* fpreprocessed: Invocation. (line 414) +* ftabstop: Invocation. (line 427) +* fwide-exec-charset: Invocation. (line 438) +* fworking-directory: Invocation. (line 456) +* H: Invocation. (line 569) +* help: Invocation. (line 561) +* I: Invocation. (line 72) +* I-: Invocation. (line 345) +* idirafter: Invocation. (line 387) +* imacros: Invocation. (line 378) +* include: Invocation. (line 367) +* iprefix: Invocation. (line 392) +* isystem: Invocation. (line 404) +* iwithprefix: Invocation. (line 398) +* iwithprefixbefore: Invocation. (line 398) +* M: Invocation. (line 182) +* MD: Invocation. (line 270) +* MF: Invocation. (line 216) +* MG: Invocation. (line 225) +* MM: Invocation. (line 206) +* MMD: Invocation. (line 285) +* MP: Invocation. (line 235) +* MQ: Invocation. (line 261) +* MT: Invocation. (line 247) +* nostdinc: Invocation. (line 357) +* nostdinc++: Invocation. (line 362) +* o: Invocation. (line 81) +* OBJC_INCLUDE_PATH: Environment Variables. + (line 18) +* P: Invocation. (line 517) +* pedantic: Invocation. (line 172) +* pedantic-errors: Invocation. (line 177) +* remap: Invocation. (line 556) +* std=: Invocation. (line 308) +* SUNPRO_DEPENDENCIES: Environment Variables. + (line 60) +* target-help: Invocation. (line 561) +* traditional-cpp: Invocation. (line 549) +* trigraphs: Invocation. (line 553) +* U: Invocation. (line 63) +* undef: Invocation. (line 67) +* v: Invocation. (line 565) +* version: Invocation. (line 578) +* w: Invocation. (line 168) +* Wall: Invocation. (line 87) +* Wcomment: Invocation. (line 95) +* Wcomments: Invocation. (line 95) +* Wendif-labels: Invocation. (line 145) +* Werror: Invocation. (line 158) +* Wimport: Invocation. (line 118) +* Wsystem-headers: Invocation. (line 162) +* Wtraditional: Invocation. (line 112) +* Wtrigraphs: Invocation. (line 100) +* Wundef: Invocation. (line 121) +* Wunused-macros: Invocation. (line 126) +* x: Invocation. (line 292) + + +File: cpp.info, Node: Concept Index, Prev: Option Index, Up: Top + +Concept Index +************* + +[index] +* Menu: + +* # operator: Stringification. (line 6) +* ## operator: Concatenation. (line 6) +* _Pragma: Pragmas. (line 25) +* alternative tokens: Tokenization. (line 105) +* arguments: Macro Arguments. (line 6) +* arguments in macro definitions: Macro Arguments. (line 6) +* assertions: Assertions. (line 6) +* assertions, canceling: Assertions. (line 52) +* backslash-newline: Initial processing. (line 61) +* block comments: Initial processing. (line 77) +* C++ named operators: C++ Named Operators. (line 6) +* character constants: Tokenization. (line 84) +* command line: Invocation. (line 6) +* commenting out code: Deleted Code. (line 6) +* comments: Initial processing. (line 77) +* common predefined macros: Common Predefined Macros. + (line 6) +* computed includes: Computed Includes. (line 6) +* concatenation: Concatenation. (line 6) +* conditional group: Ifdef. (line 14) +* conditionals: Conditionals. (line 6) +* continued lines: Initial processing. (line 61) +* controlling macro: Once-Only Headers. (line 35) +* defined: Defined. (line 6) +* dependencies for make as output: Environment Variables. + (line 45) +* dependencies, make: Invocation. (line 182) +* diagnostic: Diagnostics. (line 6) +* differences from previous versions: Differences from previous versions. + (line 6) +* digraphs: Tokenization. (line 105) +* directive line: The preprocessing language. + (line 6) +* directive name: The preprocessing language. + (line 6) +* directives: The preprocessing language. + (line 6) +* empty macro arguments: Macro Arguments. (line 66) +* environment variables: Environment Variables. + (line 6) +* expansion of arguments: Argument Prescan. (line 6) +* FDL, GNU Free Documentation License: GNU Free Documentation License. + (line 6) +* function-like macros: Function-like Macros. + (line 6) +* grouping options: Invocation. (line 34) +* guard macro: Once-Only Headers. (line 35) +* header file: Header Files. (line 6) +* header file names: Tokenization. (line 84) +* identifiers: Tokenization. (line 34) +* implementation limits: Implementation limits. + (line 6) +* implementation-defined behavior: Implementation-defined behavior. + (line 6) +* including just once: Once-Only Headers. (line 6) +* invocation: Invocation. (line 6) +* iso646.h: C++ Named Operators. (line 6) +* line comments: Initial processing. (line 77) +* line control: Line Control. (line 6) +* line endings: Initial processing. (line 14) +* linemarkers: Preprocessor Output. (line 28) +* macro argument expansion: Argument Prescan. (line 6) +* macro arguments and directives: Directives Within Macro Arguments. + (line 6) +* macros in include: Computed Includes. (line 6) +* macros with arguments: Macro Arguments. (line 6) +* macros with variable arguments: Variadic Macros. (line 6) +* make: Invocation. (line 182) +* manifest constants: Object-like Macros. (line 6) +* named operators: C++ Named Operators. (line 6) +* newlines in macro arguments: Newlines in Arguments. + (line 6) +* null directive: Other Directives. (line 18) +* numbers: Tokenization. (line 60) +* object-like macro: Object-like Macros. (line 6) +* options: Invocation. (line 38) +* options, grouping: Invocation. (line 34) +* other tokens: Tokenization. (line 119) +* output format: Preprocessor Output. (line 12) +* overriding a header file: Wrapper Headers. (line 6) +* parentheses in macro bodies: Operator Precedence Problems. + (line 6) +* pitfalls of macros: Macro Pitfalls. (line 6) +* predefined macros: Predefined Macros. (line 6) +* predefined macros, system-specific: System-specific Predefined Macros. + (line 6) +* predicates: Assertions. (line 19) +* preprocessing directives: The preprocessing language. + (line 6) +* preprocessing numbers: Tokenization. (line 60) +* preprocessing tokens: Tokenization. (line 6) +* prescan of macro arguments: Argument Prescan. (line 6) +* problems with macros: Macro Pitfalls. (line 6) +* punctuators: Tokenization. (line 105) +* redefining macros: Undefining and Redefining Macros. + (line 6) +* repeated inclusion: Once-Only Headers. (line 6) +* reporting errors: Diagnostics. (line 6) +* reporting warnings: Diagnostics. (line 6) +* reserved namespace: System-specific Predefined Macros. + (line 6) +* self-reference: Self-Referential Macros. + (line 6) +* semicolons (after macro calls): Swallowing the Semicolon. + (line 6) +* side effects (in macro arguments): Duplication of Side Effects. + (line 6) +* standard predefined macros.: Standard Predefined Macros. + (line 6) +* string constants: Tokenization. (line 84) +* string literals: Tokenization. (line 84) +* stringification: Stringification. (line 6) +* symbolic constants: Object-like Macros. (line 6) +* system header files <1>: System Headers. (line 6) +* system header files: Header Files. (line 13) +* system-specific predefined macros: System-specific Predefined Macros. + (line 6) +* testing predicates: Assertions. (line 30) +* token concatenation: Concatenation. (line 6) +* token pasting: Concatenation. (line 6) +* tokens: Tokenization. (line 6) +* trigraphs: Initial processing. (line 32) +* undefining macros: Undefining and Redefining Macros. + (line 6) +* unsafe macros: Duplication of Side Effects. + (line 6) +* variable number of arguments: Variadic Macros. (line 6) +* variadic macros: Variadic Macros. (line 6) +* wrapper #ifndef: Once-Only Headers. (line 6) +* wrapper headers: Wrapper Headers. (line 6) + + + +Tag Table: +Node: Top1064 +Node: Overview3742 +Node: Character sets6563 +Ref: Character sets-Footnote-19022 +Node: Initial processing9203 +Ref: trigraphs10762 +Node: Tokenization14964 +Ref: Tokenization-Footnote-122018 +Node: The preprocessing language22129 +Node: Header Files25007 +Node: Include Syntax26887 +Node: Include Operation28394 +Node: Search Path30242 +Node: Once-Only Headers33318 +Node: Computed Includes34963 +Node: Wrapper Headers38107 +Node: System Headers40533 +Node: Macros42583 +Node: Object-like Macros43724 +Node: Function-like Macros47314 +Node: Macro Arguments48930 +Node: Stringification53075 +Node: Concatenation56281 +Node: Variadic Macros59389 +Node: Predefined Macros64176 +Node: Standard Predefined Macros64764 +Node: Common Predefined Macros70700 +Node: System-specific Predefined Macros78544 +Node: C++ Named Operators80565 +Node: Undefining and Redefining Macros81529 +Node: Directives Within Macro Arguments83633 +Node: Macro Pitfalls85181 +Node: Misnesting85714 +Node: Operator Precedence Problems86826 +Node: Swallowing the Semicolon88692 +Node: Duplication of Side Effects90715 +Node: Self-Referential Macros92898 +Node: Argument Prescan95307 +Node: Newlines in Arguments99061 +Node: Conditionals100012 +Node: Conditional Uses101842 +Node: Conditional Syntax103200 +Node: Ifdef103520 +Node: If106681 +Node: Defined108985 +Node: Else110268 +Node: Elif110838 +Node: Deleted Code112127 +Node: Diagnostics113374 +Node: Line Control114991 +Node: Pragmas118795 +Node: Other Directives123065 +Node: Preprocessor Output124258 +Node: Traditional Mode127459 +Node: Traditional lexical analysis128517 +Node: Traditional macros131020 +Node: Traditional miscellany134821 +Node: Traditional warnings135818 +Node: Implementation Details138015 +Node: Implementation-defined behavior138636 +Ref: Identifier characters139373 +Node: Implementation limits142286 +Node: Obsolete Features144960 +Node: Assertions145415 +Node: Obsolete once-only headers147956 +Node: Differences from previous versions149691 +Node: Invocation153770 +Ref: Wtrigraphs158162 +Ref: dashMF162946 +Ref: fdollars-in-identifiers170419 +Node: Environment Variables177876 +Node: GNU Free Documentation License180842 +Node: Index of Directives203265 +Node: Option Index205194 +Node: Concept Index211013 + +End Tag Table diff --git a/mingw/info/cppinternals.info b/mingw/info/cppinternals.info new file mode 100644 index 00000000..5b9bda77 --- /dev/null +++ b/mingw/info/cppinternals.info @@ -0,0 +1,1035 @@ +This is doc/cppinternals.info, produced by makeinfo version 4.8 from +/home/gdr/build/gcc-3.4.5/gcc-3.4.5/gcc/doc/cppinternals.texi. + +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* Cpplib: (cppinternals). Cpplib internals. +END-INFO-DIR-ENTRY + + This file documents the internals of the GNU C Preprocessor. + + Copyright 2000, 2001, 2002, 2004 Free Software Foundation, Inc. + + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + + Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided also +that the entire resulting derived work is distributed under the terms +of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions. + + +File: cppinternals.info, Node: Top, Next: Conventions, Up: (dir) + +The GNU C Preprocessor Internals +******************************** + +1 Cpplib--the GNU C Preprocessor +******************************** + +The GNU C preprocessor in GCC 3.x has been completely rewritten. It is +now implemented as a library, "cpplib", so it can be easily shared +between a stand-alone preprocessor, and a preprocessor integrated with +the C, C++ and Objective-C front ends. It is also available for use by +other programs, though this is not recommended as its exposed interface +has not yet reached a point of reasonable stability. + + The library has been written to be re-entrant, so that it can be used +to preprocess many files simultaneously if necessary. It has also been +written with the preprocessing token as the fundamental unit; the +preprocessor in previous versions of GCC would operate on text strings +as the fundamental unit. + + This brief manual documents the internals of cpplib, and explains +some of the tricky issues. It is intended that, along with the +comments in the source code, a reasonably competent C programmer should +be able to figure out what the code is doing, and why things have been +implemented the way they have. + +* Menu: + +* Conventions:: Conventions used in the code. +* Lexer:: The combined C, C++ and Objective-C Lexer. +* Hash Nodes:: All identifiers are entered into a hash table. +* Macro Expansion:: Macro expansion algorithm. +* Token Spacing:: Spacing and paste avoidance issues. +* Line Numbering:: Tracking location within files. +* Guard Macros:: Optimizing header files with guard macros. +* Files:: File handling. +* Index:: Index. + + +File: cppinternals.info, Node: Conventions, Next: Lexer, Prev: Top, Up: Top + +Conventions +*********** + +cpplib has two interfaces--one is exposed internally only, and the +other is for both internal and external use. + + The convention is that functions and types that are exposed to +multiple files internally are prefixed with `_cpp_', and are to be +found in the file `cpphash.h'. Functions and types exposed to external +clients are in `cpplib.h', and prefixed with `cpp_'. For historical +reasons this is no longer quite true, but we should strive to stick to +it. + + We are striving to reduce the information exposed in `cpplib.h' to +the bare minimum necessary, and then to keep it there. This makes clear +exactly what external clients are entitled to assume, and allows us to +change internals in the future without worrying whether library clients +are perhaps relying on some kind of undocumented implementation-specific +behavior. + + +File: cppinternals.info, Node: Lexer, Next: Hash Nodes, Prev: Conventions, Up: Top + +The Lexer +********* + +Overview +======== + +The lexer is contained in the file `cpplex.c'. It is a hand-coded +lexer, and not implemented as a state machine. It can understand C, C++ +and Objective-C source code, and has been extended to allow reasonably +successful preprocessing of assembly language. The lexer does not make +an initial pass to strip out trigraphs and escaped newlines, but handles +them as they are encountered in a single pass of the input file. It +returns preprocessing tokens individually, not a line at a time. + + It is mostly transparent to users of the library, since the library's +interface for obtaining the next token, `cpp_get_token', takes care of +lexing new tokens, handling directives, and expanding macros as +necessary. However, the lexer does expose some functionality so that +clients of the library can easily spell a given token, such as +`cpp_spell_token' and `cpp_token_len'. These functions are useful when +generating diagnostics, and for emitting the preprocessed output. + +Lexing a token +============== + +Lexing of an individual token is handled by `_cpp_lex_direct' and its +subroutines. In its current form the code is quite complicated, with +read ahead characters and such-like, since it strives to not step back +in the character stream in preparation for handling non-ASCII file +encodings. The current plan is to convert any such files to UTF-8 +before processing them. This complexity is therefore unnecessary and +will be removed, so I'll not discuss it further here. + + The job of `_cpp_lex_direct' is simply to lex a token. It is not +responsible for issues like directive handling, returning lookahead +tokens directly, multiple-include optimization, or conditional block +skipping. It necessarily has a minor ro^le to play in memory +management of lexed lines. I discuss these issues in a separate section +(*note Lexing a line::). + + The lexer places the token it lexes into storage pointed to by the +variable `cur_token', and then increments it. This variable is +important for correct diagnostic positioning. Unless a specific line +and column are passed to the diagnostic routines, they will examine the +`line' and `col' values of the token just before the location that +`cur_token' points to, and use that location to report the diagnostic. + + The lexer does not consider whitespace to be a token in its own +right. If whitespace (other than a new line) precedes a token, it sets +the `PREV_WHITE' bit in the token's flags. Each token has its `line' +and `col' variables set to the line and column of the first character +of the token. This line number is the line number in the translation +unit, and can be converted to a source (file, line) pair using the line +map code. + + The first token on a logical, i.e. unescaped, line has the flag +`BOL' set for beginning-of-line. This flag is intended for internal +use, both to distinguish a `#' that begins a directive from one that +doesn't, and to generate a call-back to clients that want to be +notified about the start of every non-directive line with tokens on it. +Clients cannot reliably determine this for themselves: the first token +might be a macro, and the tokens of a macro expansion do not have the +`BOL' flag set. The macro expansion may even be empty, and the next +token on the line certainly won't have the `BOL' flag set. + + New lines are treated specially; exactly how the lexer handles them +is context-dependent. The C standard mandates that directives are +terminated by the first unescaped newline character, even if it appears +in the middle of a macro expansion. Therefore, if the state variable +`in_directive' is set, the lexer returns a `CPP_EOF' token, which is +normally used to indicate end-of-file, to indicate end-of-directive. +In a directive a `CPP_EOF' token never means end-of-file. +Conveniently, if the caller was `collect_args', it already handles +`CPP_EOF' as if it were end-of-file, and reports an error about an +unterminated macro argument list. + + The C standard also specifies that a new line in the middle of the +arguments to a macro is treated as whitespace. This white space is +important in case the macro argument is stringified. The state variable +`parsing_args' is nonzero when the preprocessor is collecting the +arguments to a macro call. It is set to 1 when looking for the opening +parenthesis to a function-like macro, and 2 when collecting the actual +arguments up to the closing parenthesis, since these two cases need to +be distinguished sometimes. One such time is here: the lexer sets the +`PREV_WHITE' flag of a token if it meets a new line when `parsing_args' +is set to 2. It doesn't set it if it meets a new line when +`parsing_args' is 1, since then code like + + #define foo() bar + foo + baz + +would be output with an erroneous space before `baz': + + foo + baz + + This is a good example of the subtlety of getting token spacing +correct in the preprocessor; there are plenty of tests in the testsuite +for corner cases like this. + + The lexer is written to treat each of `\r', `\n', `\r\n' and `\n\r' +as a single new line indicator. This allows it to transparently +preprocess MS-DOS, Macintosh and Unix files without their needing to +pass through a special filter beforehand. + + We also decided to treat a backslash, either `\' or the trigraph +`??/', separated from one of the above newline indicators by +non-comment whitespace only, as intending to escape the newline. It +tends to be a typing mistake, and cannot reasonably be mistaken for +anything else in any of the C-family grammars. Since handling it this +way is not strictly conforming to the ISO standard, the library issues a +warning wherever it encounters it. + + Handling newlines like this is made simpler by doing it in one place +only. The function `handle_newline' takes care of all newline +characters, and `skip_escaped_newlines' takes care of arbitrarily long +sequences of escaped newlines, deferring to `handle_newline' to handle +the newlines themselves. + + The most painful aspect of lexing ISO-standard C and C++ is handling +trigraphs and backlash-escaped newlines. Trigraphs are processed before +any interpretation of the meaning of a character is made, and +unfortunately there is a trigraph representation for a backslash, so it +is possible for the trigraph `??/' to introduce an escaped newline. + + Escaped newlines are tedious because theoretically they can occur +anywhere--between the `+' and `=' of the `+=' token, within the +characters of an identifier, and even between the `*' and `/' that +terminates a comment. Moreover, you cannot be sure there is just +one--there might be an arbitrarily long sequence of them. + + So, for example, the routine that lexes a number, `parse_number', +cannot assume that it can scan forwards until the first non-number +character and be done with it, because this could be the `\' +introducing an escaped newline, or the `?' introducing the trigraph +sequence that represents the `\' of an escaped newline. If it +encounters a `?' or `\', it calls `skip_escaped_newlines' to skip over +any potential escaped newlines before checking whether the number has +been finished. + + Similarly code in the main body of `_cpp_lex_direct' cannot simply +check for a `=' after a `+' character to determine whether it has a +`+=' token; it needs to be prepared for an escaped newline of some +sort. Such cases use the function `get_effective_char', which returns +the first character after any intervening escaped newlines. + + The lexer needs to keep track of the correct column position, +including counting tabs as specified by the `-ftabstop=' option. This +should be done even within C-style comments; they can appear in the +middle of a line, and we want to report diagnostics in the correct +position for text appearing after the end of the comment. + + Some identifiers, such as `__VA_ARGS__' and poisoned identifiers, +may be invalid and require a diagnostic. However, if they appear in a +macro expansion we don't want to complain with each use of the macro. +It is therefore best to catch them during the lexing stage, in +`parse_identifier'. In both cases, whether a diagnostic is needed or +not is dependent upon the lexer's state. For example, we don't want to +issue a diagnostic for re-poisoning a poisoned identifier, or for using +`__VA_ARGS__' in the expansion of a variable-argument macro. Therefore +`parse_identifier' makes use of state flags to determine whether a +diagnostic is appropriate. Since we change state on a per-token basis, +and don't lex whole lines at a time, this is not a problem. + + Another place where state flags are used to change behavior is whilst +lexing header names. Normally, a `<' would be lexed as a single token. +After a `#include' directive, though, it should be lexed as a single +token as far as the nearest `>' character. Note that we don't allow +the terminators of header names to be escaped; the first `"' or `>' +terminates the header name. + + Interpretation of some character sequences depends upon whether we +are lexing C, C++ or Objective-C, and on the revision of the standard in +force. For example, `::' is a single token in C++, but in C it is two +separate `:' tokens and almost certainly a syntax error. Such cases +are handled by `_cpp_lex_direct' based upon command-line flags stored +in the `cpp_options' structure. + + Once a token has been lexed, it leads an independent existence. The +spelling of numbers, identifiers and strings is copied to permanent +storage from the original input buffer, so a token remains valid and +correct even if its source buffer is freed with `_cpp_pop_buffer'. The +storage holding the spellings of such tokens remains until the client +program calls cpp_destroy, probably at the end of the translation unit. + +Lexing a line +============= + +When the preprocessor was changed to return pointers to tokens, one +feature I wanted was some sort of guarantee regarding how long a +returned pointer remains valid. This is important to the stand-alone +preprocessor, the future direction of the C family front ends, and even +to cpplib itself internally. + + Occasionally the preprocessor wants to be able to peek ahead in the +token stream. For example, after the name of a function-like macro, it +wants to check the next token to see if it is an opening parenthesis. +Another example is that, after reading the first few tokens of a +`#pragma' directive and not recognizing it as a registered pragma, it +wants to backtrack and allow the user-defined handler for unknown +pragmas to access the full `#pragma' token stream. The stand-alone +preprocessor wants to be able to test the current token with the +previous one to see if a space needs to be inserted to preserve their +separate tokenization upon re-lexing (paste avoidance), so it needs to +be sure the pointer to the previous token is still valid. The +recursive-descent C++ parser wants to be able to perform tentative +parsing arbitrarily far ahead in the token stream, and then to be able +to jump back to a prior position in that stream if necessary. + + The rule I chose, which is fairly natural, is to arrange that the +preprocessor lex all tokens on a line consecutively into a token buffer, +which I call a "token run", and when meeting an unescaped new line +(newlines within comments do not count either), to start lexing back at +the beginning of the run. Note that we do _not_ lex a line of tokens +at once; if we did that `parse_identifier' would not have state flags +available to warn about invalid identifiers (*note Invalid +identifiers::). + + In other words, accessing tokens that appeared earlier in the current +line is valid, but since each logical line overwrites the tokens of the +previous line, tokens from prior lines are unavailable. In particular, +since a directive only occupies a single logical line, this means that +the directive handlers like the `#pragma' handler can jump around in +the directive's tokens if necessary. + + Two issues remain: what about tokens that arise from macro +expansions, and what happens when we have a long line that overflows +the token run? + + Since we promise clients that we preserve the validity of pointers +that we have already returned for tokens that appeared earlier in the +line, we cannot reallocate the run. Instead, on overflow it is +expanded by chaining a new token run on to the end of the existing one. + + The tokens forming a macro's replacement list are collected by the +`#define' handler, and placed in storage that is only freed by +`cpp_destroy'. So if a macro is expanded in the line of tokens, the +pointers to the tokens of its expansion that are returned will always +remain valid. However, macros are a little trickier than that, since +they give rise to three sources of fresh tokens. They are the built-in +macros like `__LINE__', and the `#' and `##' operators for +stringification and token pasting. I handled this by allocating space +for these tokens from the lexer's token run chain. This means they +automatically receive the same lifetime guarantees as lexed tokens, and +we don't need to concern ourselves with freeing them. + + Lexing into a line of tokens solves some of the token memory +management issues, but not all. The opening parenthesis after a +function-like macro name might lie on a different line, and the front +ends definitely want the ability to look ahead past the end of the +current line. So cpplib only moves back to the start of the token run +at the end of a line if the variable `keep_tokens' is zero. +Line-buffering is quite natural for the preprocessor, and as a result +the only time cpplib needs to increment this variable is whilst looking +for the opening parenthesis to, and reading the arguments of, a +function-like macro. In the near future cpplib will export an +interface to increment and decrement this variable, so that clients can +share full control over the lifetime of token pointers too. + + The routine `_cpp_lex_token' handles moving to new token runs, +calling `_cpp_lex_direct' to lex new tokens, or returning +previously-lexed tokens if we stepped back in the token stream. It also +checks each token for the `BOL' flag, which might indicate a directive +that needs to be handled, or require a start-of-line call-back to be +made. `_cpp_lex_token' also handles skipping over tokens in failed +conditional blocks, and invalidates the control macro of the +multiple-include optimization if a token was successfully lexed outside +a directive. In other words, its callers do not need to concern +themselves with such issues. + + +File: cppinternals.info, Node: Hash Nodes, Next: Macro Expansion, Prev: Lexer, Up: Top + +Hash Nodes +********** + +When cpplib encounters an "identifier", it generates a hash code for it +and stores it in the hash table. By "identifier" we mean tokens with +type `CPP_NAME'; this includes identifiers in the usual C sense, as +well as keywords, directive names, macro names and so on. For example, +all of `pragma', `int', `foo' and `__GNUC__' are identifiers and hashed +when lexed. + + Each node in the hash table contain various information about the +identifier it represents. For example, its length and type. At any one +time, each identifier falls into exactly one of three categories: + + * Macros + + These have been declared to be macros, either on the command line + or with `#define'. A few, such as `__TIME__' are built-ins + entered in the hash table during initialization. The hash node + for a normal macro points to a structure with more information + about the macro, such as whether it is function-like, how many + arguments it takes, and its expansion. Built-in macros are + flagged as special, and instead contain an enum indicating which + of the various built-in macros it is. + + * Assertions + + Assertions are in a separate namespace to macros. To enforce + this, cpp actually prepends a `#' character before hashing and + entering it in the hash table. An assertion's node points to a + chain of answers to that assertion. + + * Void + + Everything else falls into this category--an identifier that is not + currently a macro, or a macro that has since been undefined with + `#undef'. + + When preprocessing C++, this category also includes the named + operators, such as `xor'. In expressions these behave like the + operators they represent, but in contexts where the spelling of a + token matters they are spelt differently. This spelling + distinction is relevant when they are operands of the stringizing + and pasting macro operators `#' and `##'. Named operator hash + nodes are flagged, both to catch the spelling distinction and to + prevent them from being defined as macros. + + The same identifiers share the same hash node. Since each identifier +token, after lexing, contains a pointer to its hash node, this is used +to provide rapid lookup of various information. For example, when +parsing a `#define' statement, CPP flags each argument's identifier +hash node with the index of that argument. This makes duplicated +argument checking an O(1) operation for each argument. Similarly, for +each identifier in the macro's expansion, lookup to see if it is an +argument, and which argument it is, is also an O(1) operation. Further, +each directive name, such as `endif', has an associated directive enum +stored in its hash node, so that directive lookup is also O(1). + + +File: cppinternals.info, Node: Macro Expansion, Next: Token Spacing, Prev: Hash Nodes, Up: Top + +Macro Expansion Algorithm +************************* + +Macro expansion is a tricky operation, fraught with nasty corner cases +and situations that render what you thought was a nifty way to optimize +the preprocessor's expansion algorithm wrong in quite subtle ways. + + I strongly recommend you have a good grasp of how the C and C++ +standards require macros to be expanded before diving into this +section, let alone the code!. If you don't have a clear mental picture +of how things like nested macro expansion, stringification and token +pasting are supposed to work, damage to your sanity can quickly result. + +Internal representation of macros +================================= + +The preprocessor stores macro expansions in tokenized form. This saves +repeated lexing passes during expansion, at the cost of a small +increase in memory consumption on average. The tokens are stored +contiguously in memory, so a pointer to the first one and a token count +is all you need to get the replacement list of a macro. + + If the macro is a function-like macro the preprocessor also stores +its parameters, in the form of an ordered list of pointers to the hash +table entry of each parameter's identifier. Further, in the macro's +stored expansion each occurrence of a parameter is replaced with a +special token of type `CPP_MACRO_ARG'. Each such token holds the index +of the parameter it represents in the parameter list, which allows +rapid replacement of parameters with their arguments during expansion. +Despite this optimization it is still necessary to store the original +parameters to the macro, both for dumping with e.g., `-dD', and to warn +about non-trivial macro redefinitions when the parameter names have +changed. + +Macro expansion overview +======================== + +The preprocessor maintains a "context stack", implemented as a linked +list of `cpp_context' structures, which together represent the macro +expansion state at any one time. The `struct cpp_reader' member +variable `context' points to the current top of this stack. The top +normally holds the unexpanded replacement list of the innermost macro +under expansion, except when cpplib is about to pre-expand an argument, +in which case it holds that argument's unexpanded tokens. + + When there are no macros under expansion, cpplib is in "base +context". All contexts other than the base context contain a +contiguous list of tokens delimited by a starting and ending token. +When not in base context, cpplib obtains the next token from the list +of the top context. If there are no tokens left in the list, it pops +that context off the stack, and subsequent ones if necessary, until an +unexhausted context is found or it returns to base context. In base +context, cpplib reads tokens directly from the lexer. + + If it encounters an identifier that is both a macro and enabled for +expansion, cpplib prepares to push a new context for that macro on the +stack by calling the routine `enter_macro_context'. When this routine +returns, the new context will contain the unexpanded tokens of the +replacement list of that macro. In the case of function-like macros, +`enter_macro_context' also replaces any parameters in the replacement +list, stored as `CPP_MACRO_ARG' tokens, with the appropriate macro +argument. If the standard requires that the parameter be replaced with +its expanded argument, the argument will have been fully macro expanded +first. + + `enter_macro_context' also handles special macros like `__LINE__'. +Although these macros expand to a single token which cannot contain any +further macros, for reasons of token spacing (*note Token Spacing::) +and simplicity of implementation, cpplib handles these special macros +by pushing a context containing just that one token. + + The final thing that `enter_macro_context' does before returning is +to mark the macro disabled for expansion (except for special macros +like `__TIME__'). The macro is re-enabled when its context is later +popped from the context stack, as described above. This strict +ordering ensures that a macro is disabled whilst its expansion is being +scanned, but that it is _not_ disabled whilst any arguments to it are +being expanded. + +Scanning the replacement list for macros to expand +================================================== + +The C standard states that, after any parameters have been replaced +with their possibly-expanded arguments, the replacement list is scanned +for nested macros. Further, any identifiers in the replacement list +that are not expanded during this scan are never again eligible for +expansion in the future, if the reason they were not expanded is that +the macro in question was disabled. + + Clearly this latter condition can only apply to tokens resulting from +argument pre-expansion. Other tokens never have an opportunity to be +re-tested for expansion. It is possible for identifiers that are +function-like macros to not expand initially but to expand during a +later scan. This occurs when the identifier is the last token of an +argument (and therefore originally followed by a comma or a closing +parenthesis in its macro's argument list), and when it replaces its +parameter in the macro's replacement list, the subsequent token happens +to be an opening parenthesis (itself possibly the first token of an +argument). + + It is important to note that when cpplib reads the last token of a +given context, that context still remains on the stack. Only when +looking for the _next_ token do we pop it off the stack and drop to a +lower context. This makes backing up by one token easy, but more +importantly ensures that the macro corresponding to the current context +is still disabled when we are considering the last token of its +replacement list for expansion (or indeed expanding it). As an +example, which illustrates many of the points above, consider + + #define foo(x) bar x + foo(foo) (2) + +which fully expands to `bar foo (2)'. During pre-expansion of the +argument, `foo' does not expand even though the macro is enabled, since +it has no following parenthesis [pre-expansion of an argument only uses +tokens from that argument; it cannot take tokens from whatever follows +the macro invocation]. This still leaves the argument token `foo' +eligible for future expansion. Then, when re-scanning after argument +replacement, the token `foo' is rejected for expansion, and marked +ineligible for future expansion, since the macro is now disabled. It +is disabled because the replacement list `bar foo' of the macro is +still on the context stack. + + If instead the algorithm looked for an opening parenthesis first and +then tested whether the macro were disabled it would be subtly wrong. +In the example above, the replacement list of `foo' would be popped in +the process of finding the parenthesis, re-enabling `foo' and expanding +it a second time. + +Looking for a function-like macro's opening parenthesis +======================================================= + +Function-like macros only expand when immediately followed by a +parenthesis. To do this cpplib needs to temporarily disable macros and +read the next token. Unfortunately, because of spacing issues (*note +Token Spacing::), there can be fake padding tokens in-between, and if +the next real token is not a parenthesis cpplib needs to be able to +back up that one token as well as retain the information in any +intervening padding tokens. + + Backing up more than one token when macros are involved is not +permitted by cpplib, because in general it might involve issues like +restoring popped contexts onto the context stack, which are too hard. +Instead, searching for the parenthesis is handled by a special +function, `funlike_invocation_p', which remembers padding information +as it reads tokens. If the next real token is not an opening +parenthesis, it backs up that one token, and then pushes an extra +context just containing the padding information if necessary. + +Marking tokens ineligible for future expansion +============================================== + +As discussed above, cpplib needs a way of marking tokens as +unexpandable. Since the tokens cpplib handles are read-only once they +have been lexed, it instead makes a copy of the token and adds the flag +`NO_EXPAND' to the copy. + + For efficiency and to simplify memory management by avoiding having +to remember to free these tokens, they are allocated as temporary tokens +from the lexer's current token run (*note Lexing a line::) using the +function `_cpp_temp_token'. The tokens are then re-used once the +current line of tokens has been read in. + + This might sound unsafe. However, tokens runs are not re-used at the +end of a line if it happens to be in the middle of a macro argument +list, and cpplib only wants to back-up more than one lexer token in +situations where no macro expansion is involved, so the optimization is +safe. + + +File: cppinternals.info, Node: Token Spacing, Next: Line Numbering, Prev: Macro Expansion, Up: Top + +Token Spacing +************* + +First, consider an issue that only concerns the stand-alone +preprocessor: there needs to be a guarantee that re-reading its +preprocessed output results in an identical token stream. Without +taking special measures, this might not be the case because of macro +substitution. For example: + + #define PLUS + + #define EMPTY + #define f(x) =x= + +PLUS -EMPTY- PLUS+ f(=) + ==> + + - - + + = = = + _not_ + ==> ++ -- ++ === + + One solution would be to simply insert a space between all adjacent +tokens. However, we would like to keep space insertion to a minimum, +both for aesthetic reasons and because it causes problems for people who +still try to abuse the preprocessor for things like Fortran source and +Makefiles. + + For now, just notice that when tokens are added (or removed, as +shown by the `EMPTY' example) from the original lexed token stream, we +need to check for accidental token pasting. We call this "paste +avoidance". Token addition and removal can only occur because of macro +expansion, but accidental pasting can occur in many places: both before +and after each macro replacement, each argument replacement, and +additionally each token created by the `#' and `##' operators. + + Look at how the preprocessor gets whitespace output correct +normally. The `cpp_token' structure contains a flags byte, and one of +those flags is `PREV_WHITE'. This is flagged by the lexer, and +indicates that the token was preceded by whitespace of some form other +than a new line. The stand-alone preprocessor can use this flag to +decide whether to insert a space between tokens in the output. + + Now consider the result of the following macro expansion: + + #define add(x, y, z) x + y +z; + sum = add (1,2, 3); + ==> sum = 1 + 2 +3; + + The interesting thing here is that the tokens `1' and `2' are output +with a preceding space, and `3' is output without a preceding space, +but when lexed none of these tokens had that property. Careful +consideration reveals that `1' gets its preceding whitespace from the +space preceding `add' in the macro invocation, _not_ replacement list. +`2' gets its whitespace from the space preceding the parameter `y' in +the macro replacement list, and `3' has no preceding space because +parameter `z' has none in the replacement list. + + Once lexed, tokens are effectively fixed and cannot be altered, since +pointers to them might be held in many places, in particular by +in-progress macro expansions. So instead of modifying the two tokens +above, the preprocessor inserts a special token, which I call a +"padding token", into the token stream to indicate that spacing of the +subsequent token is special. The preprocessor inserts padding tokens +in front of every macro expansion and expanded macro argument. These +point to a "source token" from which the subsequent real token should +inherit its spacing. In the above example, the source tokens are `add' +in the macro invocation, and `y' and `z' in the macro replacement list, +respectively. + + It is quite easy to get multiple padding tokens in a row, for +example if a macro's first replacement token expands straight into +another macro. + + #define foo bar + #define bar baz + [foo] + ==> [baz] + + Here, two padding tokens are generated with sources the `foo' token +between the brackets, and the `bar' token from foo's replacement list, +respectively. Clearly the first padding token is the one to use, so +the output code should contain a rule that the first padding token in a +sequence is the one that matters. + + But what if a macro expansion is left? Adjusting the above example +slightly: + + #define foo bar + #define bar EMPTY baz + #define EMPTY + [foo] EMPTY; + ==> [ baz] ; + + As shown, now there should be a space before `baz' and the semicolon +in the output. + + The rules we decided above fail for `baz': we generate three padding +tokens, one per macro invocation, before the token `baz'. We would +then have it take its spacing from the first of these, which carries +source token `foo' with no leading space. + + It is vital that cpplib get spacing correct in these examples since +any of these macro expansions could be stringified, where spacing +matters. + + So, this demonstrates that not just entering macro and argument +expansions, but leaving them requires special handling too. I made +cpplib insert a padding token with a `NULL' source token when leaving +macro expansions, as well as after each replaced argument in a macro's +replacement list. It also inserts appropriate padding tokens on either +side of tokens created by the `#' and `##' operators. I expanded the +rule so that, if we see a padding token with a `NULL' source token, +_and_ that source token has no leading space, then we behave as if we +have seen no padding tokens at all. A quick check shows this rule will +then get the above example correct as well. + + Now a relationship with paste avoidance is apparent: we have to be +careful about paste avoidance in exactly the same locations we have +padding tokens in order to get white space correct. This makes +implementation of paste avoidance easy: wherever the stand-alone +preprocessor is fixing up spacing because of padding tokens, and it +turns out that no space is needed, it has to take the extra step to +check that a space is not needed after all to avoid an accidental paste. +The function `cpp_avoid_paste' advises whether a space is required +between two consecutive tokens. To avoid excessive spacing, it tries +hard to only require a space if one is likely to be necessary, but for +reasons of efficiency it is slightly conservative and might recommend a +space where one is not strictly needed. + + +File: cppinternals.info, Node: Line Numbering, Next: Guard Macros, Prev: Token Spacing, Up: Top + +Line numbering +************** + +Just which line number anyway? +============================== + +There are three reasonable requirements a cpplib client might have for +the line number of a token passed to it: + + * The source line it was lexed on. + + * The line it is output on. This can be different to the line it was + lexed on if, for example, there are intervening escaped newlines or + C-style comments. For example: + + foo /* A long + comment */ bar \ + baz + => + foo bar baz + + * If the token results from a macro expansion, the line of the macro + name, or possibly the line of the closing parenthesis in the case + of function-like macro expansion. + + The `cpp_token' structure contains `line' and `col' members. The +lexer fills these in with the line and column of the first character of +the token. Consequently, but maybe unexpectedly, a token from the +replacement list of a macro expansion carries the location of the token +within the `#define' directive, because cpplib expands a macro by +returning pointers to the tokens in its replacement list. The current +implementation of cpplib assigns tokens created from built-in macros +and the `#' and `##' operators the location of the most recently lexed +token. This is a because they are allocated from the lexer's token +runs, and because of the way the diagnostic routines infer the +appropriate location to report. + + The diagnostic routines in cpplib display the location of the most +recently _lexed_ token, unless they are passed a specific line and +column to report. For diagnostics regarding tokens that arise from +macro expansions, it might also be helpful for the user to see the +original location in the macro definition that the token came from. +Since that is exactly the information each token carries, such an +enhancement could be made relatively easily in future. + + The stand-alone preprocessor faces a similar problem when determining +the correct line to output the token on: the position attached to a +token is fairly useless if the token came from a macro expansion. All +tokens on a logical line should be output on its first physical line, so +the token's reported location is also wrong if it is part of a physical +line other than the first. + + To solve these issues, cpplib provides a callback that is generated +whenever it lexes a preprocessing token that starts a new logical line +other than a directive. It passes this token (which may be a `CPP_EOF' +token indicating the end of the translation unit) to the callback +routine, which can then use the line and column of this token to +produce correct output. + +Representation of line numbers +============================== + +As mentioned above, cpplib stores with each token the line number that +it was lexed on. In fact, this number is not the number of the line in +the source file, but instead bears more resemblance to the number of the +line in the translation unit. + + The preprocessor maintains a monotonic increasing line count, which +is incremented at every new line character (and also at the end of any +buffer that does not end in a new line). Since a line number of zero is +useful to indicate certain special states and conditions, this variable +starts counting from one. + + This variable therefore uniquely enumerates each line in the +translation unit. With some simple infrastructure, it is straight +forward to map from this to the original source file and line number +pair, saving space whenever line number information needs to be saved. +The code the implements this mapping lies in the files `line-map.c' and +`line-map.h'. + + Command-line macros and assertions are implemented by pushing a +buffer containing the right hand side of an equivalent `#define' or +`#assert' directive. Some built-in macros are handled similarly. +Since these are all processed before the first line of the main input +file, it will typically have an assigned line closer to twenty than to +one. + + +File: cppinternals.info, Node: Guard Macros, Next: Files, Prev: Line Numbering, Up: Top + +The Multiple-Include Optimization +********************************* + +Header files are often of the form + + #ifndef FOO + #define FOO + ... + #endif + +to prevent the compiler from processing them more than once. The +preprocessor notices such header files, so that if the header file +appears in a subsequent `#include' directive and `FOO' is defined, then +it is ignored and it doesn't preprocess or even re-open the file a +second time. This is referred to as the "multiple include +optimization". + + Under what circumstances is such an optimization valid? If the file +were included a second time, it can only be optimized away if that +inclusion would result in no tokens to return, and no relevant +directives to process. Therefore the current implementation imposes +requirements and makes some allowances as follows: + + 1. There must be no tokens outside the controlling `#if'-`#endif' + pair, but whitespace and comments are permitted. + + 2. There must be no directives outside the controlling directive + pair, but the "null directive" (a line containing nothing other + than a single `#' and possibly whitespace) is permitted. + + 3. The opening directive must be of the form + + #ifndef FOO + + or + + #if !defined FOO [equivalently, #if !defined(FOO)] + + 4. In the second form above, the tokens forming the `#if' expression + must have come directly from the source file--no macro expansion + must have been involved. This is because macro definitions can + change, and tracking whether or not a relevant change has been + made is not worth the implementation cost. + + 5. There can be no `#else' or `#elif' directives at the outer + conditional block level, because they would probably contain + something of interest to a subsequent pass. + + First, when pushing a new file on the buffer stack, +`_stack_include_file' sets the controlling macro `mi_cmacro' to `NULL', +and sets `mi_valid' to `true'. This indicates that the preprocessor +has not yet encountered anything that would invalidate the +multiple-include optimization. As described in the next few +paragraphs, these two variables having these values effectively +indicates top-of-file. + + When about to return a token that is not part of a directive, +`_cpp_lex_token' sets `mi_valid' to `false'. This enforces the +constraint that tokens outside the controlling conditional block +invalidate the optimization. + + The `do_if', when appropriate, and `do_ifndef' directive handlers +pass the controlling macro to the function `push_conditional'. cpplib +maintains a stack of nested conditional blocks, and after processing +every opening conditional this function pushes an `if_stack' structure +onto the stack. In this structure it records the controlling macro for +the block, provided there is one and we're at top-of-file (as described +above). If an `#elif' or `#else' directive is encountered, the +controlling macro for that block is cleared to `NULL'. Otherwise, it +survives until the `#endif' closing the block, upon which `do_endif' +sets `mi_valid' to true and stores the controlling macro in `mi_cmacro'. + + `_cpp_handle_directive' clears `mi_valid' when processing any +directive other than an opening conditional and the null directive. +With this, and requiring top-of-file to record a controlling macro, and +no `#else' or `#elif' for it to survive and be copied to `mi_cmacro' by +`do_endif', we have enforced the absence of directives outside the main +conditional block for the optimization to be on. + + Note that whilst we are inside the conditional block, `mi_valid' is +likely to be reset to `false', but this does not matter since the the +closing `#endif' restores it to `true' if appropriate. + + Finally, since `_cpp_lex_direct' pops the file off the buffer stack +at `EOF' without returning a token, if the `#endif' directive was not +followed by any tokens, `mi_valid' is `true' and `_cpp_pop_file_buffer' +remembers the controlling macro associated with the file. Subsequent +calls to `stack_include_file' result in no buffer being pushed if the +controlling macro is defined, effecting the optimization. + + A quick word on how we handle the + + #if !defined FOO + +case. `_cpp_parse_expr' and `parse_defined' take steps to see whether +the three stages `!', `defined-expression' and `end-of-directive' occur +in order in a `#if' expression. If so, they return the guard macro to +`do_if' in the variable `mi_ind_cmacro', and otherwise set it to `NULL'. +`enter_macro_context' sets `mi_valid' to false, so if a macro was +expanded whilst parsing any part of the expression, then the +top-of-file test in `push_conditional' fails and the optimization is +turned off. + + +File: cppinternals.info, Node: Files, Next: Index, Prev: Guard Macros, Up: Top + +File Handling +************* + +Fairly obviously, the file handling code of cpplib resides in the file +`cppfiles.c'. It takes care of the details of file searching, opening, +reading and caching, for both the main source file and all the headers +it recursively includes. + + The basic strategy is to minimize the number of system calls. On +many systems, the basic `open ()' and `fstat ()' system calls can be +quite expensive. For every `#include'-d file, we need to try all the +directories in the search path until we find a match. Some projects, +such as glibc, pass twenty or thirty include paths on the command line, +so this can rapidly become time consuming. + + For a header file we have not encountered before we have little +choice but to do this. However, it is often the case that the same +headers are repeatedly included, and in these cases we try to avoid +repeating the filesystem queries whilst searching for the correct file. + + For each file we try to open, we store the constructed path in a +splay tree. This path first undergoes simplification by the function +`_cpp_simplify_pathname'. For example, `/usr/include/bits/../foo.h' is +simplified to `/usr/include/foo.h' before we enter it in the splay tree +and try to `open ()' the file. CPP will then find subsequent uses of +`foo.h', even as `/usr/include/foo.h', in the splay tree and save +system calls. + + Further, it is likely the file contents have also been cached, +saving a `read ()' system call. We don't bother caching the contents of +header files that are re-inclusion protected, and whose re-inclusion +macro is defined when we leave the header file for the first time. If +the host supports it, we try to map suitably large files into memory, +rather than reading them in directly. + + The include paths are internally stored on a null-terminated +singly-linked list, starting with the `"header.h"' directory search +chain, which then links into the `' directory chain. + + Files included with the `' syntax start the lookup directly +in the second half of this chain. However, files included with the +`"foo.h"' syntax start at the beginning of the chain, but with one +extra directory prepended. This is the directory of the current file; +the one containing the `#include' directive. Prepending this directory +on a per-file basis is handled by the function `search_from'. + + Note that a header included with a directory component, such as +`#include "mydir/foo.h"' and opened as +`/usr/local/include/mydir/foo.h', will have the complete path minus the +basename `foo.h' as the current directory. + + Enough information is stored in the splay tree that CPP can +immediately tell whether it can skip the header file because of the +multiple include optimization, whether the file didn't exist or +couldn't be opened for some reason, or whether the header was flagged +not to be re-used, as it is with the obsolete `#import' directive. + + For the benefit of MS-DOS filesystems with an 8.3 filename +limitation, CPP offers the ability to treat various include file names +as aliases for the real header files with shorter names. The map from +one to the other is found in a special file called `header.gcc', stored +in the command line (or system) include directories to which the mapping +applies. This may be higher up the directory tree than the full path to +the file minus the base name. + + +File: cppinternals.info, Node: Index, Prev: Files, Up: Top + +Index +***** + +[index] +* Menu: + +* assertions: Hash Nodes. (line 6) +* controlling macros: Guard Macros. (line 6) +* escaped newlines: Lexer. (line 6) +* files: Files. (line 6) +* guard macros: Guard Macros. (line 6) +* hash table: Hash Nodes. (line 6) +* header files: Conventions. (line 6) +* identifiers: Hash Nodes. (line 6) +* interface: Conventions. (line 6) +* lexer: Lexer. (line 6) +* line numbers: Line Numbering. (line 6) +* macro expansion: Macro Expansion. (line 6) +* macro representation (internal): Macro Expansion. (line 19) +* macros: Hash Nodes. (line 6) +* multiple-include optimization: Guard Macros. (line 6) +* named operators: Hash Nodes. (line 6) +* newlines: Lexer. (line 6) +* paste avoidance: Token Spacing. (line 6) +* spacing: Token Spacing. (line 6) +* token run: Lexer. (line 192) +* token spacing: Token Spacing. (line 6) + + + +Tag Table: +Node: Top956 +Node: Conventions2691 +Node: Lexer3632 +Ref: Invalid identifiers11548 +Ref: Lexing a line13497 +Node: Hash Nodes18270 +Node: Macro Expansion21149 +Node: Token Spacing30096 +Node: Line Numbering35956 +Node: Guard Macros40041 +Node: Files44836 +Node: Index48297 + +End Tag Table diff --git a/mingw/info/gcc.info b/mingw/info/gcc.info new file mode 100644 index 00000000..e09a3d25 --- /dev/null +++ b/mingw/info/gcc.info @@ -0,0 +1,27178 @@ +This is doc/gcc.info, produced by makeinfo version 4.2 from +../../gcc-3.4.5/gcc/doc/gcc.texi. + +Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999, 2000, 2001, 2002, 2003, 2004 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 the +Invariant Sections being "GNU General Public License" and "Funding Free +Software", the Front-Cover texts being (a) (see below), and with the +Back-Cover Texts being (b) (see below). A copy of the license is +included in the section entitled "GNU Free Documentation License". + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU +software. Copies published by the Free Software Foundation raise +funds for GNU development. +INFO-DIR-SECTION Programming +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +END-INFO-DIR-ENTRY + This file documents the use of the GNU compilers. + +Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, +1999, 2000, 2001, 2002, 2003, 2004 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 the +Invariant Sections being "GNU General Public License" and "Funding Free +Software", the Front-Cover texts being (a) (see below), and with the +Back-Cover Texts being (b) (see below). A copy of the license is +included in the section entitled "GNU Free Documentation License". + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU +software. Copies published by the Free Software Foundation raise +funds for GNU development. + + +File: gcc.info, Node: Top, Next: G++ and GCC, Up: (DIR) + +Introduction +************ + + This manual documents how to use the GNU compilers, as well as their +features and incompatibilities, and how to report bugs. It corresponds +to GCC version 3.4.4. The internals of the GNU compilers, including +how to port them to new targets and some information about how to write +front ends for new languages, are documented in a separate manual. +*Note Introduction: (gccint)Top. + +* Menu: + +* G++ and GCC:: You can compile C or C++ programs. +* Standards:: Language standards supported by GCC. +* Invoking GCC:: Command options supported by `gcc'. +* C Implementation:: How GCC implements the ISO C specification. +* C Extensions:: GNU extensions to the C language family. +* C++ Extensions:: GNU extensions to the C++ language. +* Objective-C:: GNU Objective-C runtime features. +* Compatibility:: Binary Compatibility +* Gcov:: `gcov'---a test coverage program. +* Trouble:: If you have trouble using GCC. +* Bugs:: How, why and where to report bugs. +* Service:: How to find suppliers of support for GCC. +* Contributing:: How to contribute to testing and developing GCC. + +* Funding:: How to help assure funding for free software. +* GNU Project:: The GNU Project and GNU/Linux. + +* Copying:: GNU General Public License says + how you can copy and share GCC. +* GNU Free Documentation License:: How you can copy and share this manual. +* Contributors:: People who have contributed to GCC. + +* Option Index:: Index to command line options. +* Keyword Index:: Index of concepts and symbol names. + + +File: gcc.info, Node: G++ and GCC, Next: Standards, Prev: Top, Up: Top + +Programming Languages Supported by GCC +************************************** + + GCC stands for "GNU Compiler Collection". GCC is an integrated +distribution of compilers for several major programming languages. +These languages currently include C, C++, Objective-C, Java, Fortran, +and Ada. + + The abbreviation "GCC" has multiple meanings in common use. The +current official meaning is "GNU Compiler Collection", which refers +generically to the complete suite of tools. The name historically stood +for "GNU C Compiler", and this usage is still common when the emphasis +is on compiling C programs. Finally, the name is also used when +speaking of the "language-independent" component of GCC: code shared +among the compilers for all supported languages. + + The language-independent component of GCC includes the majority of the +optimizers, as well as the "back ends" that generate machine code for +various processors. + + The part of a compiler that is specific to a particular language is +called the "front end". In addition to the front ends that are +integrated components of GCC, there are several other front ends that +are maintained separately. These support languages such as Pascal, +Mercury, and COBOL. To use these, they must be built together with GCC +proper. + + Most of the compilers for languages other than C have their own names. +The C++ compiler is G++, the Ada compiler is GNAT, and so on. When we +talk about compiling one of those languages, we might refer to that +compiler by its own name, or as GCC. Either is correct. + + Historically, compilers for many languages, including C++ and Fortran, +have been implemented as "preprocessors" which emit another high level +language such as C. None of the compilers included in GCC are +implemented this way; they all generate machine code directly. This +sort of preprocessor should not be confused with the "C preprocessor", +which is an integral feature of the C, C++, and Objective-C languages. + + +File: gcc.info, Node: Standards, Next: Invoking GCC, Prev: G++ and GCC, Up: Top + +Language Standards Supported by GCC +*********************************** + + For each language compiled by GCC for which there is a standard, GCC +attempts to follow one or more versions of that standard, possibly with +some exceptions, and possibly with some extensions. + + GCC supports three versions of the C standard, although support for +the most recent version is not yet complete. + + The original ANSI C standard (X3.159-1989) was ratified in 1989 and +published in 1990. This standard was ratified as an ISO standard +(ISO/IEC 9899:1990) later in 1990. There were no technical differences +between these publications, although the sections of the ANSI standard +were renumbered and became clauses in the ISO standard. This standard, +in both its forms, is commonly known as "C89", or occasionally as +"C90", from the dates of ratification. The ANSI standard, but not the +ISO standard, also came with a Rationale document. To select this +standard in GCC, use one of the options `-ansi', `-std=c89' or +`-std=iso9899:1990'; to obtain all the diagnostics required by the +standard, you should also specify `-pedantic' (or `-pedantic-errors' if +you want them to be errors rather than warnings). *Note Options +Controlling C Dialect: C Dialect Options. + + Errors in the 1990 ISO C standard were corrected in two Technical +Corrigenda published in 1994 and 1996. GCC does not support the +uncorrected version. + + An amendment to the 1990 standard was published in 1995. This +amendment added digraphs and `__STDC_VERSION__' to the language, but +otherwise concerned the library. This amendment is commonly known as +"AMD1"; the amended standard is sometimes known as "C94" or "C95". To +select this standard in GCC, use the option `-std=iso9899:199409' +(with, as for other standard versions, `-pedantic' to receive all +required diagnostics). + + A new edition of the ISO C standard was published in 1999 as ISO/IEC +9899:1999, and is commonly known as "C99". GCC has incomplete support +for this standard version; see +`http://gcc.gnu.org/gcc-3.4/c99status.html' for details. To select this +standard, use `-std=c99' or `-std=iso9899:1999'. (While in +development, drafts of this standard version were referred to as "C9X".) + + Errors in the 1999 ISO C standard were corrected in a Technical +Corrigendum published in 2001. GCC does not support the uncorrected +version. + + By default, GCC provides some extensions to the C language that on +rare occasions conflict with the C standard. *Note Extensions to the C +Language Family: C Extensions. Use of the `-std' options listed above +will disable these extensions where they conflict with the C standard +version selected. You may also select an extended version of the C +language explicitly with `-std=gnu89' (for C89 with GNU extensions) or +`-std=gnu99' (for C99 with GNU extensions). The default, if no C +language dialect options are given, is `-std=gnu89'; this will change to +`-std=gnu99' in some future release when the C99 support is complete. +Some features that are part of the C99 standard are accepted as +extensions in C89 mode. + + The ISO C standard defines (in clause 4) two classes of conforming +implementation. A "conforming hosted implementation" supports the +whole standard including all the library facilities; a "conforming +freestanding implementation" is only required to provide certain +library facilities: those in `', `', `', +and `'; since AMD1, also those in `'; and in C99, +also those in `' and `'. In addition, complex +types, added in C99, are not required for freestanding implementations. +The standard also defines two environments for programs, a +"freestanding environment", required of all implementations and which +may not have library facilities beyond those required of freestanding +implementations, where the handling of program startup and termination +are implementation-defined, and a "hosted environment", which is not +required, in which all the library facilities are provided and startup +is through a function `int main (void)' or `int main (int, char *[])'. +An OS kernel would be a freestanding environment; a program using the +facilities of an operating system would normally be in a hosted +implementation. + + GCC aims towards being usable as a conforming freestanding +implementation, or as the compiler for a conforming hosted +implementation. By default, it will act as the compiler for a hosted +implementation, defining `__STDC_HOSTED__' as `1' and presuming that +when the names of ISO C functions are used, they have the semantics +defined in the standard. To make it act as a conforming freestanding +implementation for a freestanding environment, use the option +`-ffreestanding'; it will then define `__STDC_HOSTED__' to `0' and not +make assumptions about the meanings of function names from the standard +library, with exceptions noted below. To build an OS kernel, you may +well still need to make your own arrangements for linking and startup. +*Note Options Controlling C Dialect: C Dialect Options. + + GCC does not provide the library facilities required only of hosted +implementations, nor yet all the facilities required by C99 of +freestanding implementations; to use the facilities of a hosted +environment, you will need to find them elsewhere (for example, in the +GNU C library). *Note Standard Libraries: Standard Libraries. + + Most of the compiler support routines used by GCC are present in +`libgcc', but there are a few exceptions. GCC requires the +freestanding environment provide `memcpy', `memmove', `memset' and +`memcmp'. Some older ports of GCC are configured to use the BSD +`bcopy', `bzero' and `bcmp' functions instead, but this is deprecated +for new ports. Finally, if `__builtin_trap' is used, and the target +does not implement the `trap' pattern, then GCC will emit a call to +`abort'. + + For references to Technical Corrigenda, Rationale documents and +information concerning the history of C that is available online, see +`http://gcc.gnu.org/readings.html' + + There is no formal written standard for Objective-C. The most +authoritative manual is "Object-Oriented Programming and the +Objective-C Language", available at a number of web sites + + * `http://developer.apple.com/techpubs/macosx/Cocoa/ObjectiveC/' is + a recent version + + * `http://www.toodarkpark.org/computers/objc/' is an older example + + * `http://www.gnustep.org' has additional useful information + + There is no standard for treelang, which is a sample language front end +for GCC. Its only purpose is as a sample for people wishing to write a +new language for GCC. The language is documented in +`gcc/treelang/treelang.texi' which can be turned into info or HTML +format. + + *Note GNAT Reference Manual: (gnat_rm)Top, for information on standard +conformance and compatibility of the Ada compiler. + + *Note The GNU Fortran Language: (g77)Language, for details of the +Fortran language supported by GCC. + + *Note Compatibility with the Java Platform: (gcj)Compatibility, for +details of compatibility between `gcj' and the Java Platform. + + +File: gcc.info, Node: Invoking GCC, Next: C Implementation, Prev: Standards, Up: Top + +GCC Command Options +******************* + + When you invoke GCC, it normally does preprocessing, compilation, +assembly and linking. The "overall options" allow you to stop this +process at an intermediate stage. For example, the `-c' option says +not to run the linker. Then the output consists of object files output +by the assembler. + + Other options are passed on to one stage of processing. Some options +control the preprocessor and others the compiler itself. Yet other +options control the assembler and linker; most of these are not +documented here, since you rarely need to use any of them. + + Most of the command line options that you can use with GCC are useful +for C programs; when an option is only useful with another language +(usually C++), the explanation says so explicitly. If the description +for a particular option does not mention a source language, you can use +that option with all supported languages. + + *Note Compiling C++ Programs: Invoking G++, for a summary of special +options for compiling C++ programs. + + The `gcc' program accepts options and file names as operands. Many +options have multi-letter names; therefore multiple single-letter +options may _not_ be grouped: `-dr' is very different from `-d -r'. + + You can mix options and other arguments. For the most part, the order +you use doesn't matter. Order does matter when you use several options +of the same kind; for example, if you specify `-L' more than once, the +directories are searched in the order specified. + + Many options have long names starting with `-f' or with `-W'--for +example, `-fforce-mem', `-fstrength-reduce', `-Wformat' and so on. +Most of these have both positive and negative forms; the negative form +of `-ffoo' would be `-fno-foo'. This manual documents only one of +these two forms, whichever one is not the default. + + *Note Option Index::, for an index to GCC's options. + +* Menu: + +* Option Summary:: Brief list of all options, without explanations. +* Overall Options:: Controlling the kind of output: + an executable, object files, assembler files, + or preprocessed source. +* Invoking G++:: Compiling C++ programs. +* C Dialect Options:: Controlling the variant of C language compiled. +* C++ Dialect Options:: Variations on C++. +* Objective-C Dialect Options:: Variations on Objective-C. +* Language Independent Options:: Controlling how diagnostics should be + formatted. +* Warning Options:: How picky should the compiler be? +* Debugging Options:: Symbol tables, measurements, and debugging dumps. +* Optimize Options:: How much optimization? +* Preprocessor Options:: Controlling header files and macro definitions. + Also, getting dependency information for Make. +* Assembler Options:: Passing options to the assembler. +* Link Options:: Specifying libraries and so on. +* Directory Options:: Where to find header files and libraries. + Where to find the compiler executable files. +* Spec Files:: How to pass switches to sub-processes. +* Target Options:: Running a cross-compiler, or an old version of GCC. +* Submodel Options:: Specifying minor hardware or convention variations, + such as 68010 vs 68020. +* Code Gen Options:: Specifying conventions for function calls, data layout + and register usage. +* Environment Variables:: Env vars that affect GCC. +* Precompiled Headers:: Compiling a header once, and using it many times. +* Running Protoize:: Automatically adding or removing function prototypes. + + +File: gcc.info, Node: Option Summary, Next: Overall Options, Up: Invoking GCC + +Option Summary +============== + + Here is a summary of all the options, grouped by type. Explanations +are in the following sections. + +_Overall Options_ + *Note Options Controlling the Kind of Output: Overall Options. + -c -S -E -o FILE -pipe -pass-exit-codes + -x LANGUAGE -v -### --help --target-help --version + +_C Language Options_ + *Note Options Controlling C Dialect: C Dialect Options. + -ansi -std=STANDARD -aux-info FILENAME + -fno-asm -fno-builtin -fno-builtin-FUNCTION + -fhosted -ffreestanding -fms-extensions + -trigraphs -no-integrated-cpp -traditional -traditional-cpp + -fallow-single-precision -fcond-mismatch + -fsigned-bitfields -fsigned-char + -funsigned-bitfields -funsigned-char + -fwritable-strings + +_C++ Language Options_ + *Note Options Controlling C++ Dialect: C++ Dialect Options. + -fabi-version=N -fno-access-control -fcheck-new + -fconserve-space -fno-const-strings + -fno-elide-constructors + -fno-enforce-eh-specs + -ffor-scope -fno-for-scope -fno-gnu-keywords + -fno-implicit-templates + -fno-implicit-inline-templates + -fno-implement-inlines -fms-extensions + -fno-nonansi-builtins -fno-operator-names + -fno-optional-diags -fpermissive + -frepo -fno-rtti -fstats -ftemplate-depth-N + -fuse-cxa-atexit -fno-weak -nostdinc++ + -fno-default-inline -Wabi -Wctor-dtor-privacy + -Wnon-virtual-dtor -Wreorder + -Weffc++ -Wno-deprecated + -Wno-non-template-friend -Wold-style-cast + -Woverloaded-virtual -Wno-pmf-conversions + -Wsign-promo + +_Objective-C Language Options_ + *Note Options Controlling Objective-C Dialect: Objective-C Dialect + Options. + -fconstant-string-class=CLASS-NAME + -fgnu-runtime -fnext-runtime + -fno-nil-receivers + -fobjc-exceptions + -freplace-objc-classes + -fzero-link + -gen-decls + -Wno-protocol -Wselector -Wundeclared-selector + +_Language Independent Options_ + *Note Options to Control Diagnostic Messages Formatting: Language + Independent Options. + -fmessage-length=N + -fdiagnostics-show-location=[once|every-line] + +_Warning Options_ + *Note Options to Request or Suppress Warnings: Warning Options. + -fsyntax-only -pedantic -pedantic-errors + -w -Wextra -Wall -Waggregate-return + -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment + -Wconversion -Wno-deprecated-declarations + -Wdisabled-optimization -Wno-div-by-zero -Wendif-labels + -Werror -Werror-implicit-function-declaration + -Wfloat-equal -Wformat -Wformat=2 + -Wno-format-extra-args -Wformat-nonliteral + -Wformat-security -Wformat-y2k + -Wimplicit -Wimplicit-function-declaration -Wimplicit-int + -Wimport -Wno-import -Winit-self -Winline + -Wno-invalid-offsetof -Winvalid-pch + -Wlarger-than-LEN -Wlong-long + -Wmain -Wmissing-braces + -Wmissing-format-attribute -Wmissing-noreturn + -Wno-multichar -Wnonnull -Wpacked -Wpadded + -Wparentheses -Wpointer-arith -Wredundant-decls + -Wreturn-type -Wsequence-point -Wshadow + -Wsign-compare -Wstrict-aliasing + -Wswitch -Wswitch-default -Wswitch-enum + -Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized + -Wunknown-pragmas -Wunreachable-code + -Wunused -Wunused-function -Wunused-label -Wunused-parameter + -Wunused-value -Wunused-variable -Wwrite-strings + +_C-only Warning Options_ + -Wbad-function-cast -Wmissing-declarations + -Wmissing-prototypes -Wnested-externs -Wold-style-definition + -Wstrict-prototypes -Wtraditional + -Wdeclaration-after-statement + +_Debugging Options_ + *Note Options for Debugging Your Program or GCC: Debugging Options. + -dLETTERS -dumpspecs -dumpmachine -dumpversion + -fdump-unnumbered -fdump-translation-unit[-N] + -fdump-class-hierarchy[-N] + -fdump-tree-original[-N] + -fdump-tree-optimized[-N] + -fdump-tree-inlined[-N] + -feliminate-dwarf2-dups -feliminate-unused-debug-types + -feliminate-unused-debug-symbols -fmem-report -fprofile-arcs + -frandom-seed=STRING -fsched-verbose=N + -ftest-coverage -ftime-report + -g -gLEVEL -gcoff -gdwarf-2 + -ggdb -gstabs -gstabs+ -gvms -gxcoff -gxcoff+ + -p -pg -print-file-name=LIBRARY -print-libgcc-file-name + -print-multi-directory -print-multi-lib + -print-prog-name=PROGRAM -print-search-dirs -Q + -save-temps -time + +_Optimization Options_ + *Note Options that Control Optimization: Optimize Options. + -falign-functions=N -falign-jumps=N + -falign-labels=N -falign-loops=N + -fbranch-probabilities -fprofile-values -fvpt -fbranch-target-load-optimize + -fbranch-target-load-optimize2 -fcaller-saves -fcprop-registers + -fcse-follow-jumps -fcse-skip-blocks -fdata-sections + -fdelayed-branch -fdelete-null-pointer-checks + -fexpensive-optimizations -ffast-math -ffloat-store + -fforce-addr -fforce-mem -ffunction-sections + -fgcse -fgcse-lm -fgcse-sm -fgcse-las -floop-optimize + -fcrossjumping -fif-conversion -fif-conversion2 + -finline-functions -finline-limit=N -fkeep-inline-functions + -fkeep-static-consts -fmerge-constants -fmerge-all-constants + -fmove-all-movables -fnew-ra -fno-branch-count-reg + -fno-default-inline -fno-defer-pop + -fno-function-cse -fno-guess-branch-probability + -fno-inline -fno-math-errno -fno-peephole -fno-peephole2 + -funsafe-math-optimizations -ffinite-math-only + -fno-trapping-math -fno-zero-initialized-in-bss + -fomit-frame-pointer -foptimize-register-move + -foptimize-sibling-calls -fprefetch-loop-arrays + -fprofile-generate -fprofile-use + -freduce-all-givs -fregmove -frename-registers + -freorder-blocks -freorder-functions + -frerun-cse-after-loop -frerun-loop-opt + -frounding-math -fschedule-insns -fschedule-insns2 + -fno-sched-interblock -fno-sched-spec -fsched-spec-load + -fsched-spec-load-dangerous + -fsched-stalled-insns=N -sched-stalled-insns-dep=N + -fsched2-use-superblocks + -fsched2-use-traces -fsignaling-nans + -fsingle-precision-constant + -fstrength-reduce -fstrict-aliasing -ftracer -fthread-jumps + -funroll-all-loops -funroll-loops -fpeel-loops + -funswitch-loops -fold-unroll-loops -fold-unroll-all-loops + --param NAME=VALUE + -O -O0 -O1 -O2 -O3 -Os + +_Preprocessor Options_ + *Note Options Controlling the Preprocessor: Preprocessor Options. + -AQUESTION=ANSWER + -A-QUESTION[=ANSWER] + -C -dD -dI -dM -dN + -DMACRO[=DEFN] -E -H + -idirafter DIR + -include FILE -imacros FILE + -iprefix FILE -iwithprefix DIR + -iwithprefixbefore DIR -isystem DIR + -M -MM -MF -MG -MP -MQ -MT -nostdinc + -P -fworking-directory -remap + -trigraphs -undef -UMACRO -Wp,OPTION + -Xpreprocessor OPTION + +_Assembler Option_ + *Note Passing Options to the Assembler: Assembler Options. + -Wa,OPTION -Xassembler OPTION + +_Linker Options_ + *Note Options for Linking: Link Options. + OBJECT-FILE-NAME -lLIBRARY + -nostartfiles -nodefaultlibs -nostdlib -pie + -s -static -static-libgcc -shared -shared-libgcc -symbolic + -Wl,OPTION -Xlinker OPTION + -u SYMBOL + +_Directory Options_ + *Note Options for Directory Search: Directory Options. + -BPREFIX -IDIR -I- -LDIR -specs=FILE + +_Target Options_ + *Note Target Options::. + -V VERSION -b MACHINE + +_Machine Dependent Options_ + *Note Hardware Models and Configurations: Submodel Options. + + _M680x0 Options_ + -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 + -m68060 -mcpu32 -m5200 -m68881 -mbitfield -mc68000 -mc68020 + -mnobitfield -mrtd -mshort -msoft-float -mpcrel + -malign-int -mstrict-align -msep-data -mno-sep-data + -mshared-library-id=n -mid-shared-library -mno-id-shared-library + + _M68hc1x Options_ + -m6811 -m6812 -m68hc11 -m68hc12 -m68hcs12 + -mauto-incdec -minmax -mlong-calls -mshort + -msoft-reg-count=COUNT + + _VAX Options_ + -mg -mgnu -munix + + _SPARC Options_ + -mcpu=CPU-TYPE + -mtune=CPU-TYPE + -mcmodel=CODE-MODEL + -m32 -m64 -mapp-regs -mno-app-regs + -mfaster-structs -mno-faster-structs + -mflat -mno-flat -mfpu -mno-fpu + -mhard-float -msoft-float + -mhard-quad-float -msoft-quad-float + -mimpure-text -mno-impure-text -mlittle-endian + -mstack-bias -mno-stack-bias + -munaligned-doubles -mno-unaligned-doubles + -mv8plus -mno-v8plus -mvis -mno-vis + -mcypress -mf930 -mf934 + -msparclite -msupersparc -mv8 + -threads -pthreads + + _ARM Options_ + -mapcs-frame -mno-apcs-frame + -mapcs-26 -mapcs-32 + -mapcs-stack-check -mno-apcs-stack-check + -mapcs-float -mno-apcs-float + -mapcs-reentrant -mno-apcs-reentrant + -msched-prolog -mno-sched-prolog + -mlittle-endian -mbig-endian -mwords-little-endian + -malignment-traps -mno-alignment-traps + -msoft-float -mhard-float -mfpe + -mthumb-interwork -mno-thumb-interwork + -mcpu=NAME -march=NAME -mfpe=NAME + -mstructure-size-boundary=N + -mabort-on-noreturn + -mlong-calls -mno-long-calls + -msingle-pic-base -mno-single-pic-base + -mpic-register=REG + -mnop-fun-dllimport + -mcirrus-fix-invalid-insns -mno-cirrus-fix-invalid-insns + -mpoke-function-name + -mthumb -marm + -mtpcs-frame -mtpcs-leaf-frame + -mcaller-super-interworking -mcallee-super-interworking + + _MN10300 Options_ + -mmult-bug -mno-mult-bug + -mam33 -mno-am33 + -mam33-2 -mno-am33-2 + -mno-crt0 -mrelax + + _M32R/D Options_ + -m32r2 -m32rx -m32r + -mdebug + -malign-loops -mno-align-loops + -missue-rate=NUMBER + -mbranch-cost=NUMBER + -mmodel=CODE-SIZE-MODEL-TYPE + -msdata=SDATA-TYPE + -mno-flush-func -mflush-func=NAME + -mno-flush-trap -mflush-trap=NUMBER + -G NUM + + _RS/6000 and PowerPC Options_ + -mcpu=CPU-TYPE + -mtune=CPU-TYPE + -mpower -mno-power -mpower2 -mno-power2 + -mpowerpc -mpowerpc64 -mno-powerpc + -maltivec -mno-altivec + -mpowerpc-gpopt -mno-powerpc-gpopt + -mpowerpc-gfxopt -mno-powerpc-gfxopt + -mnew-mnemonics -mold-mnemonics + -mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc + -m64 -m32 -mxl-compat -mno-xl-compat -mpe + -malign-power -malign-natural + -msoft-float -mhard-float -mmultiple -mno-multiple + -mstring -mno-string -mupdate -mno-update + -mfused-madd -mno-fused-madd -mbit-align -mno-bit-align + -mstrict-align -mno-strict-align -mrelocatable + -mno-relocatable -mrelocatable-lib -mno-relocatable-lib + -mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian + -mdynamic-no-pic + -mprioritize-restricted-insns=PRIORITY + -msched-costly-dep=DEPENDENCE_TYPE + -minsert-sched-nops=SCHEME + -mcall-sysv -mcall-netbsd + -maix-struct-return -msvr4-struct-return + -mabi=altivec -mabi=no-altivec + -mabi=spe -mabi=no-spe + -misel=yes -misel=no + -mspe=yes -mspe=no + -mfloat-gprs=yes -mfloat-gprs=no + -mprototype -mno-prototype + -msim -mmvme -mads -myellowknife -memb -msdata + -msdata=OPT -mvxworks -mwindiss -G NUM -pthread + + _Darwin Options_ + -all_load -allowable_client -arch -arch_errors_fatal + -arch_only -bind_at_load -bundle -bundle_loader + -client_name -compatibility_version -current_version + -dependency-file -dylib_file -dylinker_install_name + -dynamic -dynamiclib -exported_symbols_list + -filelist -flat_namespace -force_cpusubtype_ALL + -force_flat_namespace -headerpad_max_install_names + -image_base -init -install_name -keep_private_externs + -multi_module -multiply_defined -multiply_defined_unused + -noall_load -nofixprebinding -nomultidefs -noprebind -noseglinkedit + -pagezero_size -prebind -prebind_all_twolevel_modules + -private_bundle -read_only_relocs -sectalign + -sectobjectsymbols -whyload -seg1addr + -sectcreate -sectobjectsymbols -sectorder + -seg_addr_table -seg_addr_table_filename -seglinkedit + -segprot -segs_read_only_addr -segs_read_write_addr + -single_module -static -sub_library -sub_umbrella + -twolevel_namespace -umbrella -undefined + -unexported_symbols_list -weak_reference_mismatches + -whatsloaded + + _MIPS Options_ + -EL -EB -march=ARCH -mtune=ARCH + -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips64 + -mips16 -mno-mips16 -mabi=ABI -mabicalls -mno-abicalls + -mxgot -mno-xgot -membedded-pic -mno-embedded-pic + -mgp32 -mgp64 -mfp32 -mfp64 -mhard-float -msoft-float + -msingle-float -mdouble-float -mint64 -mlong64 -mlong32 + -GNUM -membedded-data -mno-embedded-data + -muninit-const-in-rodata -mno-uninit-const-in-rodata + -msplit-addresses -mno-split-addresses + -mexplicit-relocs -mno-explicit-relocs + -mrnames -mno-rnames + -mcheck-zero-division -mno-check-zero-division + -mmemcpy -mno-memcpy -mlong-calls -mno-long-calls + -mmad -mno-mad -mfused-madd -mno-fused-madd -nocpp + -mfix-sb1 -mno-fix-sb1 -mflush-func=FUNC + -mno-flush-func -mbranch-likely -mno-branch-likely + + _i386 and x86-64 Options_ + -mtune=CPU-TYPE -march=CPU-TYPE + -mfpmath=UNIT + -masm=DIALECT -mno-fancy-math-387 + -mno-fp-ret-in-387 -msoft-float -msvr3-shlib + -mno-wide-multiply -mrtd -malign-double + -mpreferred-stack-boundary=NUM + -mmmx -msse -msse2 -msse3 -m3dnow + -mthreads -mno-align-stringops -minline-all-stringops + -mpush-args -maccumulate-outgoing-args -m128bit-long-double + -m96bit-long-double -mregparm=NUM -momit-leaf-frame-pointer + -mno-red-zone -mno-tls-direct-seg-refs + -mcmodel=CODE-MODEL + -m32 -m64 -mstack-arg-probe + + _HPPA Options_ + -march=ARCHITECTURE-TYPE + -mbig-switch -mdisable-fpregs -mdisable-indexing + -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld + -mjump-in-delay -mlinker-opt -mlong-calls + -mlong-load-store -mno-big-switch -mno-disable-fpregs + -mno-disable-indexing -mno-fast-indirect-calls -mno-gas + -mno-jump-in-delay -mno-long-load-store + -mno-portable-runtime -mno-soft-float + -mno-space-regs -msoft-float -mpa-risc-1-0 + -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime + -mschedule=CPU-TYPE -mspace-regs -msio -mwsio + -nolibdld -static -threads + + _Intel 960 Options_ + -mCPU-TYPE -masm-compat -mclean-linkage + -mcode-align -mcomplex-addr -mleaf-procedures + -mic-compat -mic2.0-compat -mic3.0-compat + -mintel-asm -mno-clean-linkage -mno-code-align + -mno-complex-addr -mno-leaf-procedures + -mno-old-align -mno-strict-align -mno-tail-call + -mnumerics -mold-align -msoft-float -mstrict-align + -mtail-call + + _DEC Alpha Options_ + -mno-fp-regs -msoft-float -malpha-as -mgas + -mieee -mieee-with-inexact -mieee-conformant + -mfp-trap-mode=MODE -mfp-rounding-mode=MODE + -mtrap-precision=MODE -mbuild-constants + -mcpu=CPU-TYPE -mtune=CPU-TYPE + -mbwx -mmax -mfix -mcix + -mfloat-vax -mfloat-ieee + -mexplicit-relocs -msmall-data -mlarge-data + -msmall-text -mlarge-text + -mmemory-latency=TIME + + _DEC Alpha/VMS Options_ + -mvms-return-codes + + _H8/300 Options_ + -mrelax -mh -ms -mn -mint32 -malign-300 + + _SH Options_ + -m1 -m2 -m2e -m3 -m3e + -m4-nofpu -m4-single-only -m4-single -m4 + -m5-64media -m5-64media-nofpu + -m5-32media -m5-32media-nofpu + -m5-compact -m5-compact-nofpu + -mb -ml -mdalign -mrelax + -mbigtable -mfmovd -mhitachi -mnomacsave + -mieee -misize -mpadstruct -mspace + -mprefergot -musermode + + _System V Options_ + -Qy -Qn -YP,PATHS -Ym,DIR + + _ARC Options_ + -EB -EL + -mmangle-cpu -mcpu=CPU -mtext=TEXT-SECTION + -mdata=DATA-SECTION -mrodata=READONLY-DATA-SECTION + + _TMS320C3x/C4x Options_ + -mcpu=CPU -mbig -msmall -mregparm -mmemparm + -mfast-fix -mmpyi -mbk -mti -mdp-isr-reload + -mrpts=COUNT -mrptb -mdb -mloop-unsigned + -mparallel-insns -mparallel-mpy -mpreserve-float + + _V850 Options_ + -mlong-calls -mno-long-calls -mep -mno-ep + -mprolog-function -mno-prolog-function -mspace + -mtda=N -msda=N -mzda=N + -mapp-regs -mno-app-regs + -mdisable-callt -mno-disable-callt + -mv850e1 + -mv850e + -mv850 -mbig-switch + + _NS32K Options_ + -m32032 -m32332 -m32532 -m32081 -m32381 + -mmult-add -mnomult-add -msoft-float -mrtd -mnortd + -mregparam -mnoregparam -msb -mnosb + -mbitfield -mnobitfield -mhimem -mnohimem + + _AVR Options_ + -mmcu=MCU -msize -minit-stack=N -mno-interrupts + -mcall-prologues -mno-tablejump -mtiny-stack + + _MCore Options_ + -mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates + -mno-relax-immediates -mwide-bitfields -mno-wide-bitfields + -m4byte-functions -mno-4byte-functions -mcallgraph-data + -mno-callgraph-data -mslow-bytes -mno-slow-bytes -mno-lsim + -mlittle-endian -mbig-endian -m210 -m340 -mstack-increment + + _MMIX Options_ + -mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu + -mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols + -melf -mbranch-predict -mno-branch-predict -mbase-addresses + -mno-base-addresses -msingle-exit -mno-single-exit + + _IA-64 Options_ + -mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic + -mvolatile-asm-stop -mb-step -mregister-names -mno-sdata + -mconstant-gp -mauto-pic -minline-float-divide-min-latency + -minline-float-divide-max-throughput + -minline-int-divide-min-latency + -minline-int-divide-max-throughput + -minline-sqrt-min-latency -minline-sqrt-max-throughput + -mno-dwarf2-asm -mearly-stop-bits + -mfixed-range=REGISTER-RANGE -mtls-size=TLS-SIZE + -mtune=CPU-TYPE -mt -pthread -milp32 -mlp64 + + _D30V Options_ + -mextmem -mextmemory -monchip -mno-asm-optimize + -masm-optimize -mbranch-cost=N -mcond-exec=N + + _S/390 and zSeries Options_ + -mtune=CPU-TYPE -march=CPU-TYPE + -mhard-float -msoft-float -mbackchain -mno-backchain + -msmall-exec -mno-small-exec -mmvcle -mno-mvcle + -m64 -m31 -mdebug -mno-debug -mesa -mzarch -mfused-madd -mno-fused-madd + + _CRIS Options_ + -mcpu=CPU -march=CPU -mtune=CPU + -mmax-stack-frame=N -melinux-stacksize=N + -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects + -mstack-align -mdata-align -mconst-align + -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -mno-gotplt + -melf -maout -melinux -mlinux -sim -sim2 + -mmul-bug-workaround -mno-mul-bug-workaround + + _PDP-11 Options_ + -mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 + -mbcopy -mbcopy-builtin -mint32 -mno-int16 + -mint16 -mno-int32 -mfloat32 -mno-float64 + -mfloat64 -mno-float32 -mabshi -mno-abshi + -mbranch-expensive -mbranch-cheap + -msplit -mno-split -munix-asm -mdec-asm + + _Xstormy16 Options_ + -msim + + _Xtensa Options_ + -mconst16 -mno-const16 + -mfused-madd -mno-fused-madd + -mtext-section-literals -mno-text-section-literals + -mtarget-align -mno-target-align + -mlongcalls -mno-longcalls + + _FRV Options_ + -mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 + -mhard-float -msoft-float + -malloc-cc -mfixed-cc -mdword -mno-dword + -mdouble -mno-double + -mmedia -mno-media -mmuladd -mno-muladd + -mlibrary-pic -macc-4 -macc-8 + -mpack -mno-pack -mno-eflags -mcond-move -mno-cond-move + -mscc -mno-scc -mcond-exec -mno-cond-exec + -mvliw-branch -mno-vliw-branch + -mmulti-cond-exec -mno-multi-cond-exec -mnested-cond-exec + -mno-nested-cond-exec -mtomcat-stats + -mcpu=CPU + +_Code Generation Options_ + *Note Options for Code Generation Conventions: Code Gen Options. + -fcall-saved-REG -fcall-used-REG + -ffixed-REG -fexceptions + -fnon-call-exceptions -funwind-tables + -fasynchronous-unwind-tables + -finhibit-size-directive -finstrument-functions + -fno-common -fno-ident + -fpcc-struct-return -fpic -fPIC -fpie -fPIE + -freg-struct-return -fshared-data -fshort-enums + -fshort-double -fshort-wchar + -fverbose-asm -fpack-struct -fstack-check + -fstack-limit-register=REG -fstack-limit-symbol=SYM + -fargument-alias -fargument-noalias + -fargument-noalias-global -fleading-underscore + -ftls-model=MODEL + -ftrapv -fwrapv -fbounds-check + +* Menu: + +* Overall Options:: Controlling the kind of output: + an executable, object files, assembler files, + or preprocessed source. +* C Dialect Options:: Controlling the variant of C language compiled. +* C++ Dialect Options:: Variations on C++. +* Objective-C Dialect Options:: Variations on Objective-C. +* Language Independent Options:: Controlling how diagnostics should be + formatted. +* Warning Options:: How picky should the compiler be? +* Debugging Options:: Symbol tables, measurements, and debugging dumps. +* Optimize Options:: How much optimization? +* Preprocessor Options:: Controlling header files and macro definitions. + Also, getting dependency information for Make. +* Assembler Options:: Passing options to the assembler. +* Link Options:: Specifying libraries and so on. +* Directory Options:: Where to find header files and libraries. + Where to find the compiler executable files. +* Spec Files:: How to pass switches to sub-processes. +* Target Options:: Running a cross-compiler, or an old version of GCC. + + +File: gcc.info, Node: Overall Options, Next: Invoking G++, Prev: Option Summary, Up: Invoking GCC + +Options Controlling the Kind of Output +====================================== + + Compilation can involve up to four stages: preprocessing, compilation +proper, assembly and linking, always in that order. GCC is capable of +preprocessing and compiling several files either into several assembler +input files, or into one assembler input file; then each assembler +input file produces an object file, and linking combines all the object +files (those newly compiled, and those specified as input) into an +executable file. + + For any given input file, the file name suffix determines what kind of +compilation is done: + +`FILE.c' + C source code which must be preprocessed. + +`FILE.i' + C source code which should not be preprocessed. + +`FILE.ii' + C++ source code which should not be preprocessed. + +`FILE.m' + Objective-C source code. Note that you must link with the library + `libobjc.a' to make an Objective-C program work. + +`FILE.mi' + Objective-C source code which should not be preprocessed. + +`FILE.h' + C or C++ header file to be turned into a precompiled header. + +`FILE.cc' +`FILE.cp' +`FILE.cxx' +`FILE.cpp' +`FILE.CPP' +`FILE.c++' +`FILE.C' + C++ source code which must be preprocessed. Note that in `.cxx', + the last two letters must both be literally `x'. Likewise, `.C' + refers to a literal capital C. + +`FILE.hh' +`FILE.H' + C++ header file to be turned into a precompiled header. + +`FILE.f' +`FILE.for' +`FILE.FOR' + Fortran source code which should not be preprocessed. + +`FILE.F' +`FILE.fpp' +`FILE.FPP' + Fortran source code which must be preprocessed (with the + traditional preprocessor). + +`FILE.r' + Fortran source code which must be preprocessed with a RATFOR + preprocessor (not included with GCC). + + *Note Options Controlling the Kind of Output: (g77)Overall + Options, for more details of the handling of Fortran input files. + +`FILE.ads' + Ada source code file which contains a library unit declaration (a + declaration of a package, subprogram, or generic, or a generic + instantiation), or a library unit renaming declaration (a package, + generic, or subprogram renaming declaration). Such files are also + called "specs". + +`FILE.adb' + Ada source code file containing a library unit body (a subprogram + or package body). Such files are also called "bodies". + +`FILE.s' + Assembler code. + +`FILE.S' + Assembler code which must be preprocessed. + +`OTHER' + An object file to be fed straight into linking. Any file name + with no recognized suffix is treated this way. + + You can specify the input language explicitly with the `-x' option: + +`-x LANGUAGE' + Specify explicitly the LANGUAGE for the following input files + (rather than letting the compiler choose a default based on the + file name suffix). This option applies to all following input + files until the next `-x' option. Possible values for LANGUAGE + are: + c c-header cpp-output + c++ c++-header c++-cpp-output + objective-c objective-c-header objc-cpp-output + assembler assembler-with-cpp + ada + f77 f77-cpp-input ratfor + java + treelang + +`-x none' + Turn off any specification of a language, so that subsequent files + are handled according to their file name suffixes (as they are if + `-x' has not been used at all). + +`-pass-exit-codes' + Normally the `gcc' program will exit with the code of 1 if any + phase of the compiler returns a non-success return code. If you + specify `-pass-exit-codes', the `gcc' program will instead return + with numerically highest error produced by any phase that returned + an error indication. + + If you only want some of the stages of compilation, you can use `-x' +(or filename suffixes) to tell `gcc' where to start, and one of the +options `-c', `-S', or `-E' to say where `gcc' is to stop. Note that +some combinations (for example, `-x cpp-output -E') instruct `gcc' to +do nothing at all. + +`-c' + Compile or assemble the source files, but do not link. The linking + stage simply is not done. The ultimate output is in the form of an + object file for each source file. + + By default, the object file name for a source file is made by + replacing the suffix `.c', `.i', `.s', etc., with `.o'. + + Unrecognized input files, not requiring compilation or assembly, + are ignored. + +`-S' + Stop after the stage of compilation proper; do not assemble. The + output is in the form of an assembler code file for each + non-assembler input file specified. + + By default, the assembler file name for a source file is made by + replacing the suffix `.c', `.i', etc., with `.s'. + + Input files that don't require compilation are ignored. + +`-E' + Stop after the preprocessing stage; do not run the compiler + proper. The output is in the form of preprocessed source code, + which is sent to the standard output. + + Input files which don't require preprocessing are ignored. + +`-o FILE' + Place output in file FILE. This applies regardless to whatever + sort of output is being produced, whether it be an executable file, + an object file, an assembler file or preprocessed C code. + + If you specify `-o' when compiling more than one input file, or + you are producing an executable file as output, all the source + files on the command line will be compiled at once. + + If `-o' is not specified, the default is to put an executable file + in `a.out', the object file for `SOURCE.SUFFIX' in `SOURCE.o', its + assembler file in `SOURCE.s', and all preprocessed C source on + standard output. + +`-v' + Print (on standard error output) the commands executed to run the + stages of compilation. Also print the version number of the + compiler driver program and of the preprocessor and the compiler + proper. + +`-###' + Like `-v' except the commands are not executed and all command + arguments are quoted. This is useful for shell scripts to capture + the driver-generated command lines. + +`-pipe' + Use pipes rather than temporary files for communication between the + various stages of compilation. This fails to work on some systems + where the assembler is unable to read from a pipe; but the GNU + assembler has no trouble. + +`--help' + Print (on the standard output) a description of the command line + options understood by `gcc'. If the `-v' option is also specified + then `--help' will also be passed on to the various processes + invoked by `gcc', so that they can display the command line options + they accept. If the `-Wextra' option is also specified then + command line options which have no documentation associated with + them will also be displayed. + +`--target-help' + Print (on the standard output) a description of target specific + command line options for each tool. + +`--version' + Display the version number and copyrights of the invoked GCC. + + +File: gcc.info, Node: Invoking G++, Next: C Dialect Options, Prev: Overall Options, Up: Invoking GCC + +Compiling C++ Programs +====================== + + C++ source files conventionally use one of the suffixes `.C', `.cc', +`.cpp', `.CPP', `.c++', `.cp', or `.cxx'; C++ header files often use +`.hh' or `.H'; and preprocessed C++ files use the suffix `.ii'. GCC +recognizes files with these names and compiles them as C++ programs +even if you call the compiler the same way as for compiling C programs +(usually with the name `gcc'). + + However, C++ programs often require class libraries as well as a +compiler that understands the C++ language--and under some +circumstances, you might want to compile programs or header files from +standard input, or otherwise without a suffix that flags them as C++ +programs. You might also like to precompile a C header file with a +`.h' extension to be used in C++ compilations. `g++' is a program that +calls GCC with the default language set to C++, and automatically +specifies linking against the C++ library. On many systems, `g++' is +also installed with the name `c++'. + + When you compile C++ programs, you may specify many of the same +command-line options that you use for compiling programs in any +language; or command-line options meaningful for C and related +languages; or options that are meaningful only for C++ programs. *Note +Options Controlling C Dialect: C Dialect Options, for explanations of +options for languages related to C. *Note Options Controlling C++ +Dialect: C++ Dialect Options, for explanations of options that are +meaningful only for C++ programs. + + +File: gcc.info, Node: C Dialect Options, Next: C++ Dialect Options, Prev: Invoking G++, Up: Invoking GCC + +Options Controlling C Dialect +============================= + + The following options control the dialect of C (or languages derived +from C, such as C++ and Objective-C) that the compiler accepts: + +`-ansi' + In C mode, support all ISO C90 programs. In C++ mode, remove GNU + extensions that conflict with ISO C++. + + This turns off certain features of GCC that are incompatible with + ISO C90 (when compiling C code), or of standard C++ (when + compiling C++ code), such as the `asm' and `typeof' keywords, and + predefined macros such as `unix' and `vax' that identify the type + of system you are using. It also enables the undesirable and + rarely used ISO trigraph feature. For the C compiler, it disables + recognition of C++ style `//' comments as well as the `inline' + keyword. + + The alternate keywords `__asm__', `__extension__', `__inline__' + and `__typeof__' continue to work despite `-ansi'. You would not + want to use them in an ISO C program, of course, but it is useful + to put them in header files that might be included in compilations + done with `-ansi'. Alternate predefined macros such as `__unix__' + and `__vax__' are also available, with or without `-ansi'. + + The `-ansi' option does not cause non-ISO programs to be rejected + gratuitously. For that, `-pedantic' is required in addition to + `-ansi'. *Note Warning Options::. + + The macro `__STRICT_ANSI__' is predefined when the `-ansi' option + is used. Some header files may notice this macro and refrain from + declaring certain functions or defining certain macros that the + ISO standard doesn't call for; this is to avoid interfering with + any programs that might use these names for other things. + + Functions which would normally be built in but do not have + semantics defined by ISO C (such as `alloca' and `ffs') are not + built-in functions with `-ansi' is used. *Note Other built-in + functions provided by GCC: Other Builtins, for details of the + functions affected. + +`-std=' + Determine the language standard. This option is currently only + supported when compiling C or C++. A value for this option must be + provided; possible values are + + `c89' + `iso9899:1990' + ISO C90 (same as `-ansi'). + + `iso9899:199409' + ISO C90 as modified in amendment 1. + + `c99' + `c9x' + `iso9899:1999' + `iso9899:199x' + ISO C99. Note that this standard is not yet fully supported; + see `http://gcc.gnu.org/gcc-3.4/c99status.html' for more + information. The names `c9x' and `iso9899:199x' are + deprecated. + + `gnu89' + Default, ISO C90 plus GNU extensions (including some C99 + features). + + `gnu99' + `gnu9x' + ISO C99 plus GNU extensions. When ISO C99 is fully + implemented in GCC, this will become the default. The name + `gnu9x' is deprecated. + + `c++98' + The 1998 ISO C++ standard plus amendments. + + `gnu++98' + The same as `-std=c++98' plus GNU extensions. This is the + default for C++ code. + + Even when this option is not specified, you can still use some of + the features of newer standards in so far as they do not conflict + with previous C standards. For example, you may use + `__restrict__' even when `-std=c99' is not specified. + + The `-std' options specifying some version of ISO C have the same + effects as `-ansi', except that features that were not in ISO C90 + but are in the specified version (for example, `//' comments and + the `inline' keyword in ISO C99) are not disabled. + + *Note Language Standards Supported by GCC: Standards, for details + of these standard versions. + +`-aux-info FILENAME' + Output to the given filename prototyped declarations for all + functions declared and/or defined in a translation unit, including + those in header files. This option is silently ignored in any + language other than C. + + Besides declarations, the file indicates, in comments, the origin + of each declaration (source file and line), whether the + declaration was implicit, prototyped or unprototyped (`I', `N' for + new or `O' for old, respectively, in the first character after the + line number and the colon), and whether it came from a declaration + or a definition (`C' or `F', respectively, in the following + character). In the case of function definitions, a K&R-style list + of arguments followed by their declarations is also provided, + inside comments, after the declaration. + +`-fno-asm' + Do not recognize `asm', `inline' or `typeof' as a keyword, so that + code can use these words as identifiers. You can use the keywords + `__asm__', `__inline__' and `__typeof__' instead. `-ansi' implies + `-fno-asm'. + + In C++, this switch only affects the `typeof' keyword, since `asm' + and `inline' are standard keywords. You may want to use the + `-fno-gnu-keywords' flag instead, which has the same effect. In + C99 mode (`-std=c99' or `-std=gnu99'), this switch only affects + the `asm' and `typeof' keywords, since `inline' is a standard + keyword in ISO C99. + +`-fno-builtin' +`-fno-builtin-FUNCTION' + Don't recognize built-in functions that do not begin with + `__builtin_' as prefix. *Note Other built-in functions provided + by GCC: Other Builtins, for details of the functions affected, + including those which are not built-in functions when `-ansi' or + `-std' options for strict ISO C conformance are used because they + do not have an ISO standard meaning. + + GCC normally generates special code to handle certain built-in + functions more efficiently; for instance, calls to `alloca' may + become single instructions that adjust the stack directly, and + calls to `memcpy' may become inline copy loops. The resulting + code is often both smaller and faster, but since the function + calls no longer appear as such, you cannot set a breakpoint on + those calls, nor can you change the behavior of the functions by + linking with a different library. + + With the `-fno-builtin-FUNCTION' option only the built-in function + FUNCTION is disabled. FUNCTION must not begin with `__builtin_'. + If a function is named this is not built-in in this version of + GCC, this option is ignored. There is no corresponding + `-fbuiltin-FUNCTION' option; if you wish to enable built-in + functions selectively when using `-fno-builtin' or + `-ffreestanding', you may define macros such as: + + #define abs(n) __builtin_abs ((n)) + #define strcpy(d, s) __builtin_strcpy ((d), (s)) + +`-fhosted' + Assert that compilation takes place in a hosted environment. This + implies `-fbuiltin'. A hosted environment is one in which the + entire standard library is available, and in which `main' has a + return type of `int'. Examples are nearly everything except a + kernel. This is equivalent to `-fno-freestanding'. + +`-ffreestanding' + Assert that compilation takes place in a freestanding environment. + This implies `-fno-builtin'. A freestanding environment is one + in which the standard library may not exist, and program startup + may not necessarily be at `main'. The most obvious example is an + OS kernel. This is equivalent to `-fno-hosted'. + + *Note Language Standards Supported by GCC: Standards, for details + of freestanding and hosted environments. + +`-fms-extensions' + Accept some non-standard constructs used in Microsoft header files. + +`-trigraphs' + Support ISO C trigraphs. The `-ansi' option (and `-std' options + for strict ISO C conformance) implies `-trigraphs'. + +`-no-integrated-cpp' + Performs a compilation in two passes: preprocessing and compiling. + This option allows a user supplied "cc1", "cc1plus", or "cc1obj" + via the `-B' option. The user supplied compilation step can then + add in an additional preprocessing step after normal preprocessing + but before compiling. The default is to use the integrated cpp + (internal cpp) + + The semantics of this option will change if "cc1", "cc1plus", and + "cc1obj" are merged. + +`-traditional' +`-traditional-cpp' + Formerly, these options caused GCC to attempt to emulate a + pre-standard C compiler. They are now only supported with the + `-E' switch. The preprocessor continues to support a pre-standard + mode. See the GNU CPP manual for details. + +`-fcond-mismatch' + Allow conditional expressions with mismatched types in the second + and third arguments. The value of such an expression is void. + This option is not supported for C++. + +`-funsigned-char' + Let the type `char' be unsigned, like `unsigned char'. + + Each kind of machine has a default for what `char' should be. It + is either like `unsigned char' by default or like `signed char' by + default. + + Ideally, a portable program should always use `signed char' or + `unsigned char' when it depends on the signedness of an object. + But many programs have been written to use plain `char' and expect + it to be signed, or expect it to be unsigned, depending on the + machines they were written for. This option, and its inverse, let + you make such a program work with the opposite default. + + The type `char' is always a distinct type from each of `signed + char' or `unsigned char', even though its behavior is always just + like one of those two. + +`-fsigned-char' + Let the type `char' be signed, like `signed char'. + + Note that this is equivalent to `-fno-unsigned-char', which is the + negative form of `-funsigned-char'. Likewise, the option + `-fno-signed-char' is equivalent to `-funsigned-char'. + +`-fsigned-bitfields' +`-funsigned-bitfields' +`-fno-signed-bitfields' +`-fno-unsigned-bitfields' + These options control whether a bit-field is signed or unsigned, + when the declaration does not use either `signed' or `unsigned'. + By default, such a bit-field is signed, because this is + consistent: the basic integer types such as `int' are signed types. + +`-fwritable-strings' + Store string constants in the writable data segment and don't + uniquize them. This is for compatibility with old programs which + assume they can write into string constants. + + Writing into string constants is a very bad idea; "constants" + should be constant. + + This option is deprecated. + + +File: gcc.info, Node: C++ Dialect Options, Next: Objective-C Dialect Options, Prev: C Dialect Options, Up: Invoking GCC + +Options Controlling C++ Dialect +=============================== + + This section describes the command-line options that are only +meaningful for C++ programs; but you can also use most of the GNU +compiler options regardless of what language your program is in. For +example, you might compile a file `firstClass.C' like this: + + g++ -g -frepo -O -c firstClass.C + +In this example, only `-frepo' is an option meant only for C++ +programs; you can use the other options with any language supported by +GCC. + + Here is a list of options that are _only_ for compiling C++ programs: + +`-fabi-version=N' + Use version N of the C++ ABI. Version 2 is the version of the C++ + ABI that first appeared in G++ 3.4. Version 1 is the version of + the C++ ABI that first appeared in G++ 3.2. Version 0 will always + be the version that conforms most closely to the C++ ABI + specification. Therefore, the ABI obtained using version 0 will + change as ABI bugs are fixed. + + The default is version 2. + +`-fno-access-control' + Turn off all access checking. This switch is mainly useful for + working around bugs in the access control code. + +`-fcheck-new' + Check that the pointer returned by `operator new' is non-null + before attempting to modify the storage allocated. This check is + normally unnecessary because the C++ standard specifies that + `operator new' will only return `0' if it is declared `throw()', + in which case the compiler will always check the return value even + without this option. In all other cases, when `operator new' has + a non-empty exception specification, memory exhaustion is + signalled by throwing `std::bad_alloc'. See also `new (nothrow)'. + +`-fconserve-space' + Put uninitialized or runtime-initialized global variables into the + common segment, as C does. This saves space in the executable at + the cost of not diagnosing duplicate definitions. If you compile + with this flag and your program mysteriously crashes after + `main()' has completed, you may have an object that is being + destroyed twice because two definitions were merged. + + This option is no longer useful on most targets, now that support + has been added for putting variables into BSS without making them + common. + +`-fno-const-strings' + Give string constants type `char *' instead of type `const char + *'. By default, G++ uses type `const char *' as required by the + standard. Even if you use `-fno-const-strings', you cannot + actually modify the value of a string constant, unless you also use + `-fwritable-strings'. + + This option might be removed in a future release of G++. For + maximum portability, you should structure your code so that it + works with string constants that have type `const char *'. + +`-fno-elide-constructors' + The C++ standard allows an implementation to omit creating a + temporary which is only used to initialize another object of the + same type. Specifying this option disables that optimization, and + forces G++ to call the copy constructor in all cases. + +`-fno-enforce-eh-specs' + Don't check for violation of exception specifications at runtime. + This option violates the C++ standard, but may be useful for + reducing code size in production builds, much like defining + `NDEBUG'. The compiler will still optimize based on the exception + specifications. + +`-ffor-scope' +`-fno-for-scope' + If `-ffor-scope' is specified, the scope of variables declared in + a for-init-statement is limited to the `for' loop itself, as + specified by the C++ standard. If `-fno-for-scope' is specified, + the scope of variables declared in a for-init-statement extends to + the end of the enclosing scope, as was the case in old versions of + G++, and other (traditional) implementations of C++. + + The default if neither flag is given to follow the standard, but + to allow and give a warning for old-style code that would + otherwise be invalid, or have different behavior. + +`-fno-gnu-keywords' + Do not recognize `typeof' as a keyword, so that code can use this + word as an identifier. You can use the keyword `__typeof__' + instead. `-ansi' implies `-fno-gnu-keywords'. + +`-fno-implicit-templates' + Never emit code for non-inline templates which are instantiated + implicitly (i.e. by use); only emit code for explicit + instantiations. *Note Template Instantiation::, for more + information. + +`-fno-implicit-inline-templates' + Don't emit code for implicit instantiations of inline templates, + either. The default is to handle inlines differently so that + compiles with and without optimization will need the same set of + explicit instantiations. + +`-fno-implement-inlines' + To save space, do not emit out-of-line copies of inline functions + controlled by `#pragma implementation'. This will cause linker + errors if these functions are not inlined everywhere they are + called. + +`-fms-extensions' + Disable pedantic warnings about constructs used in MFC, such as + implicit int and getting a pointer to member function via + non-standard syntax. + +`-fno-nonansi-builtins' + Disable built-in declarations of functions that are not mandated by + ANSI/ISO C. These include `ffs', `alloca', `_exit', `index', + `bzero', `conjf', and other related functions. + +`-fno-operator-names' + Do not treat the operator name keywords `and', `bitand', `bitor', + `compl', `not', `or' and `xor' as synonyms as keywords. + +`-fno-optional-diags' + Disable diagnostics that the standard says a compiler does not + need to issue. Currently, the only such diagnostic issued by G++ + is the one for a name having multiple meanings within a class. + +`-fpermissive' + Downgrade some diagnostics about nonconformant code from errors to + warnings. Thus, using `-fpermissive' will allow some + nonconforming code to compile. + +`-frepo' + Enable automatic template instantiation at link time. This option + also implies `-fno-implicit-templates'. *Note Template + Instantiation::, for more information. + +`-fno-rtti' + Disable generation of information about every class with virtual + functions for use by the C++ runtime type identification features + (`dynamic_cast' and `typeid'). If you don't use those parts of + the language, you can save some space by using this flag. Note + that exception handling uses the same information, but it will + generate it as needed. + +`-fstats' + Emit statistics about front-end processing at the end of the + compilation. This information is generally only useful to the G++ + development team. + +`-ftemplate-depth-N' + Set the maximum instantiation depth for template classes to N. A + limit on the template instantiation depth is needed to detect + endless recursions during template class instantiation. ANSI/ISO + C++ conforming programs must not rely on a maximum depth greater + than 17. + +`-fuse-cxa-atexit' + Register destructors for objects with static storage duration with + the `__cxa_atexit' function rather than the `atexit' function. + This option is required for fully standards-compliant handling of + static destructors, but will only work if your C library supports + `__cxa_atexit'. + +`-fno-weak' + Do not use weak symbol support, even if it is provided by the + linker. By default, G++ will use weak symbols if they are + available. This option exists only for testing, and should not be + used by end-users; it will result in inferior code and has no + benefits. This option may be removed in a future release of G++. + +`-nostdinc++' + Do not search for header files in the standard directories + specific to C++, but do still search the other standard + directories. (This option is used when building the C++ library.) + + In addition, these optimization, warning, and code generation options +have meanings only for C++ programs: + +`-fno-default-inline' + Do not assume `inline' for functions defined inside a class scope. + *Note Options That Control Optimization: Optimize Options. Note + that these functions will have linkage like inline functions; they + just won't be inlined by default. + +`-Wabi (C++ only)' + Warn when G++ generates code that is probably not compatible with + the vendor-neutral C++ ABI. Although an effort has been made to + warn about all such cases, there are probably some cases that are + not warned about, even though G++ is generating incompatible code. + There may also be cases where warnings are emitted even though + the code that is generated will be compatible. + + You should rewrite your code to avoid these warnings if you are + concerned about the fact that code generated by G++ may not be + binary compatible with code generated by other compilers. + + The known incompatibilities at this point include: + + * Incorrect handling of tail-padding for bit-fields. G++ may + attempt to pack data into the same byte as a base class. For + example: + + struct A { virtual void f(); int f1 : 1; }; + struct B : public A { int f2 : 1; }; + + In this case, G++ will place `B::f2' into the same byte + as`A::f1'; other compilers will not. You can avoid this + problem by explicitly padding `A' so that its size is a + multiple of the byte size on your platform; that will cause + G++ and other compilers to layout `B' identically. + + * Incorrect handling of tail-padding for virtual bases. G++ + does not use tail padding when laying out virtual bases. For + example: + + struct A { virtual void f(); char c1; }; + struct B { B(); char c2; }; + struct C : public A, public virtual B {}; + + In this case, G++ will not place `B' into the tail-padding for + `A'; other compilers will. You can avoid this problem by + explicitly padding `A' so that its size is a multiple of its + alignment (ignoring virtual base classes); that will cause + G++ and other compilers to layout `C' identically. + + * Incorrect handling of bit-fields with declared widths greater + than that of their underlying types, when the bit-fields + appear in a union. For example: + + union U { int i : 4096; }; + + Assuming that an `int' does not have 4096 bits, G++ will make + the union too small by the number of bits in an `int'. + + * Empty classes can be placed at incorrect offsets. For + example: + + struct A {}; + + struct B { + A a; + virtual void f (); + }; + + struct C : public B, public A {}; + + G++ will place the `A' base class of `C' at a nonzero offset; + it should be placed at offset zero. G++ mistakenly believes + that the `A' data member of `B' is already at offset zero. + + * Names of template functions whose types involve `typename' or + template template parameters can be mangled incorrectly. + + template + void f(typename Q::X) {} + + template