From a8c9924456e5335c964e4e55b2dde1963c88726f Mon Sep 17 00:00:00 2001 From: tpearson Date: Wed, 17 Feb 2010 01:24:36 +0000 Subject: [PATCH] Added KDE3 version of Knights git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/knights@1091568 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- AUTHORS | 10 + COPYING | 280 + ChangeLog | 30 + CreatingThemes | 176 + History | 369 + INSTALL | 26 + Makefile.am | 54 + Makefile.dist | 14 + README | 44 + TODO | 48 + acinclude.m4 | 10775 ++++++++++++++++++++++++++ aclocal.m4 | 11308 ++++++++++++++++++++++++++++ config.guess | 1516 ++++ config.h.in | 169 + config.log | 300 + config.sub | 1622 ++++ configure.files | 2 + configure.in | 85 + configure.in.in | 8 + doc/Makefile.am | 118 + doc/Makefile.in.backup | 533 ++ doc/help_en.docbook | 795 ++ doc/help_fr.docbook | 658 ++ knights.lsm | 15 + knights.spec | 95 + knights/Makefile.am | 61 + knights/accel.cpp | 60 + knights/accel.h | 59 + knights/audio.cpp | 177 + knights/audio.h | 64 + knights/board_2d.cpp | 807 ++ knights/board_2d.h | 99 + knights/board_base.cpp | 125 + knights/board_base.h | 68 + knights/challenge_game.cpp | 37 + knights/challenge_game.h | 47 + knights/challenge_graph.cpp | 460 ++ knights/challenge_graph.h | 93 + knights/challenge_graph_view.cpp | 112 + knights/challenge_graph_view.h | 50 + knights/challenge_rectangle.cpp | 34 + knights/challenge_rectangle.h | 36 + knights/chessclock.cpp | 195 + knights/chessclock.h | 75 + knights/command.cpp | 98 + knights/command.h | 194 + knights/console.cpp | 264 + knights/console.h | 87 + knights/core.cpp | 892 +++ knights/core.h | 107 + knights/definitions.h | 292 + knights/dlg_challenge.cpp | 159 + knights/dlg_challenge.h | 69 + knights/dlg_engine.cpp | 226 + knights/dlg_engine.h | 77 + knights/dlg_login.cpp | 161 + knights/dlg_login.h | 73 + knights/dlg_newmatch.cpp | 385 + knights/dlg_newmatch.h | 110 + knights/dlg_promote.cpp | 123 + knights/dlg_promote.h | 58 + knights/dlg_selectemail.cpp | 46 + knights/dlg_selectemail.h | 52 + knights/dlg_selectengine.cpp | 201 + knights/dlg_selectengine.h | 72 + knights/dlg_server.cpp | 240 + knights/dlg_server.h | 92 + knights/dlg_settings.cpp | 201 + knights/dlg_settings.h | 80 + knights/idmanager.cpp | 37 + knights/idmanager.h | 42 + knights/io_base.cpp | 57 + knights/io_base.h | 68 + knights/io_engine.cpp | 312 + knights/io_engine.h | 81 + knights/io_internet.cpp | 1138 +++ knights/io_internet.h | 138 + knights/knights.cpp | 1024 +++ knights/knights.desktop | 16 + knights/knights.h | 145 + knights/knightsmap.h | 178 + knights/knightspixcache.cpp | 156 + knights/knightspixcache.h | 104 + knights/knightstextview.cpp | 238 + knights/knightstextview.h | 54 + knights/list_pgn.cpp | 145 + knights/list_pgn.h | 66 + knights/logic.cpp | 1495 ++++ knights/logic.h | 88 + knights/main.cpp | 85 + knights/match.cpp | 1120 +++ knights/match.h | 133 + knights/match_param.cpp | 243 + knights/match_param.h | 100 + knights/pgn.cpp | 1464 ++++ knights/pgn.desktop | 11 + knights/pgn.h | 153 + knights/proto_base.cpp | 34 + knights/proto_base.h | 54 + knights/proto_uci.cpp | 218 + knights/proto_uci.h | 55 + knights/proto_xboard.cpp | 687 ++ knights/proto_xboard.h | 78 + knights/resource.cpp | 1048 +++ knights/resource.h | 240 + knights/setpageaudio.cpp | 133 + knights/setpageaudio.h | 69 + knights/setpagedisplay.cpp | 563 ++ knights/setpagedisplay.h | 139 + knights/setpageengines.cpp | 362 + knights/setpageengines.h | 90 + knights/setpagegeneral.cpp | 224 + knights/setpagegeneral.h | 80 + knights/setpageservers.cpp | 379 + knights/setpageservers.h | 112 + knights/splash.cpp | 40 + knights/splash.h | 35 + knights/tab_pgnview.cpp | 160 + knights/tab_pgnview.h | 47 + knights/tab_seeklist.cpp | 209 + knights/tab_seeklist.h | 75 + knights/tabbox.cpp | 208 + knights/tabbox.h | 65 + knights/tabgrip.cpp | 109 + knights/tabgrip.h | 47 + knights/tabmanager.cpp | 202 + knights/tabmanager.h | 62 + knights/tabpage.cpp | 164 + knights/tabpage.h | 64 + knights/thinbuttons.cpp | 262 + knights/thinbuttons.h | 71 + knights/wiz_setup.cpp | 360 + knights/wiz_setup.h | 96 + media/KBDefault.tar.gz | Bin 0 -> 105539 bytes media/KCDefault.tar.gz | Bin 0 -> 102446 bytes media/KSDefault.tar.gz | Bin 0 -> 130182 bytes media/Makefile.am | 65 + media/default-engine-portrait.jpg | Bin 0 -> 2534 bytes media/default-portrait.jpg | Bin 0 -> 2049 bytes media/hi16-app-knights.png | Bin 0 -> 751 bytes media/hi16-mime-pgn.png | Bin 0 -> 773 bytes media/hi32-app-knights.png | Bin 0 -> 2037 bytes media/hi32-mime-pgn.png | Bin 0 -> 1747 bytes media/hi48-app-knights.png | Bin 0 -> 3947 bytes media/hi48-mime-pgn.png | Bin 0 -> 3083 bytes media/hi64-app-knights.png | Bin 0 -> 6677 bytes media/hi64-mime-pgn.png | Bin 0 -> 4007 bytes media/icon-display.png | Bin 0 -> 358 bytes media/icon-general.png | Bin 0 -> 2037 bytes media/pgn_template.kml | 17 + media/splash.png | Bin 0 -> 56726 bytes media/wizard.png | Bin 0 -> 47032 bytes patch-stamp | 17 + po/Makefile.am | 7 + po/de.po | 2290 ++++++ po/es.po | 2043 +++++ po/et.po | 2243 ++++++ po/fi.po | 2116 ++++++ po/fr.po | 2258 ++++++ po/it.po | 2242 ++++++ po/knights.pot | 2048 +++++ stamp-h.in | 1 + subdirs | 5 + 163 files changed, 67152 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 CreatingThemes create mode 100644 History create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.dist create mode 100644 README create mode 100644 TODO create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100644 config.guess create mode 100644 config.h.in create mode 100644 config.log create mode 100644 config.sub create mode 100644 configure.files create mode 100644 configure.in create mode 100644 configure.in.in create mode 100644 doc/Makefile.am create mode 100644 doc/Makefile.in.backup create mode 100644 doc/help_en.docbook create mode 100644 doc/help_fr.docbook create mode 100644 knights.lsm create mode 100644 knights.spec create mode 100644 knights/Makefile.am create mode 100644 knights/accel.cpp create mode 100644 knights/accel.h create mode 100644 knights/audio.cpp create mode 100644 knights/audio.h create mode 100644 knights/board_2d.cpp create mode 100644 knights/board_2d.h create mode 100644 knights/board_base.cpp create mode 100644 knights/board_base.h create mode 100644 knights/challenge_game.cpp create mode 100644 knights/challenge_game.h create mode 100644 knights/challenge_graph.cpp create mode 100644 knights/challenge_graph.h create mode 100644 knights/challenge_graph_view.cpp create mode 100644 knights/challenge_graph_view.h create mode 100644 knights/challenge_rectangle.cpp create mode 100644 knights/challenge_rectangle.h create mode 100644 knights/chessclock.cpp create mode 100644 knights/chessclock.h create mode 100644 knights/command.cpp create mode 100644 knights/command.h create mode 100644 knights/console.cpp create mode 100644 knights/console.h create mode 100644 knights/core.cpp create mode 100644 knights/core.h create mode 100644 knights/definitions.h create mode 100644 knights/dlg_challenge.cpp create mode 100644 knights/dlg_challenge.h create mode 100644 knights/dlg_engine.cpp create mode 100644 knights/dlg_engine.h create mode 100644 knights/dlg_login.cpp create mode 100644 knights/dlg_login.h create mode 100644 knights/dlg_newmatch.cpp create mode 100644 knights/dlg_newmatch.h create mode 100644 knights/dlg_promote.cpp create mode 100644 knights/dlg_promote.h create mode 100644 knights/dlg_selectemail.cpp create mode 100644 knights/dlg_selectemail.h create mode 100644 knights/dlg_selectengine.cpp create mode 100644 knights/dlg_selectengine.h create mode 100644 knights/dlg_server.cpp create mode 100644 knights/dlg_server.h create mode 100644 knights/dlg_settings.cpp create mode 100644 knights/dlg_settings.h create mode 100644 knights/idmanager.cpp create mode 100644 knights/idmanager.h create mode 100644 knights/io_base.cpp create mode 100644 knights/io_base.h create mode 100644 knights/io_engine.cpp create mode 100644 knights/io_engine.h create mode 100644 knights/io_internet.cpp create mode 100644 knights/io_internet.h create mode 100644 knights/knights.cpp create mode 100644 knights/knights.desktop create mode 100644 knights/knights.h create mode 100644 knights/knightsmap.h create mode 100644 knights/knightspixcache.cpp create mode 100644 knights/knightspixcache.h create mode 100644 knights/knightstextview.cpp create mode 100644 knights/knightstextview.h create mode 100644 knights/list_pgn.cpp create mode 100644 knights/list_pgn.h create mode 100644 knights/logic.cpp create mode 100644 knights/logic.h create mode 100644 knights/main.cpp create mode 100644 knights/match.cpp create mode 100644 knights/match.h create mode 100644 knights/match_param.cpp create mode 100644 knights/match_param.h create mode 100644 knights/pgn.cpp create mode 100644 knights/pgn.desktop create mode 100644 knights/pgn.h create mode 100644 knights/proto_base.cpp create mode 100644 knights/proto_base.h create mode 100644 knights/proto_uci.cpp create mode 100644 knights/proto_uci.h create mode 100644 knights/proto_xboard.cpp create mode 100644 knights/proto_xboard.h create mode 100644 knights/resource.cpp create mode 100644 knights/resource.h create mode 100644 knights/setpageaudio.cpp create mode 100644 knights/setpageaudio.h create mode 100644 knights/setpagedisplay.cpp create mode 100644 knights/setpagedisplay.h create mode 100644 knights/setpageengines.cpp create mode 100644 knights/setpageengines.h create mode 100644 knights/setpagegeneral.cpp create mode 100644 knights/setpagegeneral.h create mode 100644 knights/setpageservers.cpp create mode 100644 knights/setpageservers.h create mode 100644 knights/splash.cpp create mode 100644 knights/splash.h create mode 100644 knights/tab_pgnview.cpp create mode 100644 knights/tab_pgnview.h create mode 100644 knights/tab_seeklist.cpp create mode 100644 knights/tab_seeklist.h create mode 100644 knights/tabbox.cpp create mode 100644 knights/tabbox.h create mode 100644 knights/tabgrip.cpp create mode 100644 knights/tabgrip.h create mode 100644 knights/tabmanager.cpp create mode 100644 knights/tabmanager.h create mode 100644 knights/tabpage.cpp create mode 100644 knights/tabpage.h create mode 100644 knights/thinbuttons.cpp create mode 100644 knights/thinbuttons.h create mode 100644 knights/wiz_setup.cpp create mode 100644 knights/wiz_setup.h create mode 100644 media/KBDefault.tar.gz create mode 100644 media/KCDefault.tar.gz create mode 100644 media/KSDefault.tar.gz create mode 100644 media/Makefile.am create mode 100644 media/default-engine-portrait.jpg create mode 100644 media/default-portrait.jpg create mode 100644 media/hi16-app-knights.png create mode 100644 media/hi16-mime-pgn.png create mode 100644 media/hi32-app-knights.png create mode 100644 media/hi32-mime-pgn.png create mode 100644 media/hi48-app-knights.png create mode 100644 media/hi48-mime-pgn.png create mode 100644 media/hi64-app-knights.png create mode 100644 media/hi64-mime-pgn.png create mode 100644 media/icon-display.png create mode 100644 media/icon-general.png create mode 100644 media/pgn_template.kml create mode 100644 media/splash.png create mode 100644 media/wizard.png create mode 100644 patch-stamp create mode 100644 po/Makefile.am create mode 100644 po/de.po create mode 100644 po/es.po create mode 100644 po/et.po create mode 100644 po/fi.po create mode 100644 po/fr.po create mode 100644 po/it.po create mode 100644 po/knights.pot create mode 100644 stamp-h.in create mode 100644 subdirs diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..dcf989c --- /dev/null +++ b/AUTHORS @@ -0,0 +1,10 @@ +Authors of the Knights Project + +Project Leader & Lead Programmer + Troy Corbin Jr. + +Communications Programmer + Alexander Wels + +See the "About Knights" dialog for a complete and current list of +those who have helped make Knights possible. \ No newline at end of file diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..c7aea18 --- /dev/null +++ b/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, 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 diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..b8f65f1 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,30 @@ +Knights 0.6 -- Tuesday May 20th, 2003 +Troy Corbin Jr. + +* Changed version to 0.6 +* Added a new tab that displays details from a loaded PGN match. +* Added a server selector to the Login dialog. +* Added hyperlinks to the ICS Console. +* Improved printed output. +* Added printing capabilities to the ICS Console. +- Reduced the time needed to resize the board by about 33% +- Fixed bug where the New Match dialog sometimes defaulted to an unplayable + match. +- Fixed a bug in our XBoard protocol implementation which caused some engines + ( like GNUChess ) to fail. +- Fixed bug where some loaded matches wouldn't display the player's names. +- Fixed a crash that occured when you closed an ICS related tab, then + disconnected from the ICS. +- Fixed a crash that occured when you couldn't connect to your ICS. +- Expanded the range of the "Opponent's Strength" slider so that it didn't + cripple some engines. +- Fixed a bug where selecting the current board position from the Notation Bar + could erase the board. +- Fixed a bug where an engine that does not implement the 'pause' feature could + have caused Knights' clocks to continue running during a pause. +- Fixed a bug where the console could be displayed in doublespace. +- Fixed the Match->Resign option. +- Knights generated PGN files now save NAG, RAV, and Annotations. +- Removed the ability to swap sides midgame. This will be reinstated later when + we can implement a more feature-rich and trouble free dialog box. +- Potential memory leak fixed ( thanks to Jon Keating! ) diff --git a/CreatingThemes b/CreatingThemes new file mode 100644 index 0000000..f19cc9a --- /dev/null +++ b/CreatingThemes @@ -0,0 +1,176 @@ +==================== + Creating Themes +==================== + +This document is your guide to creating themes for the Knights chess +interface. + +----------------------- +1. Anatomy of a Theme: +----------------------- + +A theme is a collection of images, sounds, and settings which create a +unique representation of a chess environment. Typically, this theme is in the +form of a gzipped tarball. + +There are three types of themes for Knights: Chessboard themes, Chessmen +themes, and Audio themes. + +------------------------ +2. Tarball Information: +------------------------ + +Themes must be stored in tarballs. Knights will use any type of tarball that +KDE supports. A good test is to try loading it in Konqueror using a +tar://mytarball URL. Generaly speaking, using the standard gzipped tarball +( with a '.tar.gz' extension ) will be fine. + +The first two letters of your filename must be 'KB', 'KC', or 'KS' depending on +the type of theme it is. KB tells Knights that it is a Chessboard theme, +and KC represents Chessmen themes. KS is a sound theme. This is +case-sensitive. + +Between the prefix and the extension comes your theme's name. Write it exactly +how you want it displayed in Knights, except use underscores instead of spaces. +So if you want your theme to be called "My Uber Chessmen" within Knights, you'd +have the following filename: KCMy_Uber_Chessmen.tar.gz + +As a general rule, you should remove write and execute permissions on the +files, and either remove Owner/Group attributes, or make them something +harmless ( like nobody:users ) + +--------------------------- +3. theme.conf Information: +--------------------------- + +Every theme must contain a text file called 'theme.conf'. Here's a +sample theme.conf file: + +################################ +# A Sample theme.conf file +################################ +[General] +Type=Board +Name=Default +Version=1.0 +Author=Troy Corbin Jr. +AuthorEmail=tcorbin@users.sourceforge.net +AuthorWWW=http://knights.sourceforge.net +Notes=This is the default chessboard for Knights. It was made with the Gimp. + +[2DWhite] +King=white.king.png +Queen=white.queen.png +Bishop=white.bishop.png +Knight=white.knight.png +Rook=white.rook.png +Pawn=white.pawn.png + +[2DBlack] +King=black.king.png +Queen=black.queen.png +Bishop=black.bishop.png +Knight=black.knight.png +Rook=black.rook.png +Pawn=black.pawn.png + +[2DBoard] +Light=square.light.png +Dark=square.dark.png +Motion=square.motion.png +Select=square.select.png +Danger=square.danger.png + +[Coordinates] +TextColor=255,255,255 +ShadowColor=0,0,0 + +[Audio] +Select=select.wav +Move=move.wav +Check=check.wav +MatchOver=matchover.wav +Challenge=notify.wav +Tell=tell.wav +Notification=notify.wav +DrawOffer=draw.wav +Say=tell.wav +Promote=promote.wav +################################ + +Nothing too tough to figure out. 'Type' must be one of the following: + +- Board +- Chessmen +- Audio +- 3DBoard ( For future use ) +- 3DChessmen ( For future use ) + +'Name' is your theme's name and 'Version' is the version of your theme. Author, +AuthorEmail, and AuthorWWW should be self explanitory. Notes are any comments +you want to add. + +The '2DWhite' and '2DBlack' sections are required in Chessman themes. Each line +specifies the file to be used for each different piece type. + +'2DBoard' and 'Coordinates' are required in Chessboard themes. 'Light' and +'Dark' specify the file to be used for each color square on the board. 'Motion' +is the highlight used to indicate that a piece moved, 'Select' is the selection +highlight, and 'Danger' indicates an attacked piece. The 'Coordinates' are +standard 8bit RGB colors. These are the colors that Knights will use for board +coordinates. Try to use colors that contrast with the board itself. + +New in Knights 0.5.6 are Chessboard borders. They are not required, but they +can greatly enhance the appearance of your chessboard. If you'd like to use one +then under '2DBoard' add the following lines: + +HaveBorder=true +Border=border.png +BorderLightOn=light_on.png +BorderLightOff=light_off.png + +----------------------- +4. Pixmap Information: +----------------------- + +Your pixmaps can be in any format that Qt supports, as long as it supports an +alpha channel. For this reason you are strongly encouraged to stick with PNG +images. Note that there are a few exceptions to this in Chessboard themes. The +'Light', 'Dark', and 'Border' pixmaps constitute the lowest layer of graphics, +and so they will never be transparent. Therefore, for these items you can use +non-transparent file types ( like JPEG ). + +Knights will scale your pixmaps to the current theme size. This means you can +supply any sized images you want and Knights will make it work. However, when +Knights has to enlarge a pixmap, the resulting image tends to be of poor +quality. To keep this from happening to your themes, you should make all your +pixmaps 144 pixels by 144 pixels. This ensures that your images will never be +enlarged, and it's not so large that it's wasteful. + +Borders are an exception to the size rule. The 'Border' itself needs to be 9 +times the size of your other images. So if you use the recommended 144 pixel +image size, the 'Border' needs to be 1296 pixels. Likewise, the 'BorderLightOn' +and 'BorderLightOff' images need to be half the size of your other images. So +a regular size image of 144 pixels required that the lights be 72 pixels. + +---------------------- +5. Audio Information: +---------------------- + +Like pixmaps, you can supply your audio using any file format that aRts +supports. I recommend you stick with .wav and .ogg, although the last time +I checked aRts' Ogg Vorbis support was flaky with short sounds. Also, for +very short sounds, .wav files are actually smaller. It's best to try both +and see which works best with your paticular sounds. + +---------------------- +6. Copyrights: +---------------------- + +If you're planning to share your themes with the Knights Project, you must be +the copyright owner on all the material contained in the theme. As much as I'd +love to see the heads of Neo and Agent Smith flying around the board, I don't +want to recieve any nasty letters from Warner Brothers. + +Your material must also be released under a GNU or similar license. If you're +in doubt, contact us and we'll work it out. diff --git a/History b/History new file mode 100644 index 0000000..c461090 --- /dev/null +++ b/History @@ -0,0 +1,369 @@ +Knights 0.5.9 -- Friday January 17th, 2003 +Troy Corbin Jr. + +* Changed version to 0.5.9 +* The console is now organized into 'Tabs', rather than using a splitter. These + tabs can be dynamicaly organized into different windows by simply dragging + them. Drag a tab onto the desktop to create another tab window. +* Added the 'Seek Graph', which is a plotted chart of matches which people are + seeking. It behaves very much like the 'Sought Match List', but the graph + makes it easy to spot matches around your desired Rating / Time Controls. +* Added movement animations. +* Added a 'New Match' dialog that opens whenever you start a new match. It + allows you to set the time controls, players for each side, and more. +* Moved theme installation to the 'Settings' menu. +- Major speed improvments when selecting and dragging chessmen. +* You can now install multiple themes at once. +* Knights now handles keyboard input better. Don't worry about pressing + 'Enter' before you start chatting, just begin. +* Knights can now auto-configure the following additional chess engines: + Cilian, Faile, OliThink, Pepito, and Yace. +- Fixed sloppy SAN disambiguation where it wasn't needed. +- Fixed gcc 3.1 compilation errors. +* Added Italian translations. +* Added Finnish translations. +- Fixed a bug where Knights would sometimes declare a draw too early. +- Fixed a bug in which the King could castle even if an adjacent position was + being attacked. +* Knights can now correctly read PGN files that contain FEN notation. +* You can now right click on a match's button to access a mini-file menu. +- XBoard is now the default engine protocol when you configure a new engine. +* Added basic support for the UCI engine protocol. +- Removed the listing for the Knights engine protocol. +* New users must accept our license ( the GPL ) before they can continue. +* Movement highlights now also work when reviewing a match. +* You can choose to login to your ICS as a 'guest' from the Login Dialog. +- Fixed a bug which sometimes kept audio from working. +* The 'Help' button in the 'Configure Knights...' dialog will now display + context sensitive help, depending on what page you're viewing. +* Knights can read and display images stored in the SCID *.img file format. +- Fixed problem where the Console wouldn't redraw without focus. +* You can now change the Console's text size using it's context menu. +- The Retract menu option can now be used several times in a row. +- Knights' main window is now raised to the top and given focus whenever a + new match starts, or whenever you select a different match. +* You can now have multiple PGN files open at the same time. +- Major rewrite of internal communications code. +- Fixed bug that made en passant moves illegal when your king was in check. +- Countless minor bugfixes. + +Knights 0.5.6 -- Friday June 21st, 2002 +Troy Corbin Jr. + +* Changed version to 0.5.6 +- Fixed a bug in the setup wizard that makes every server but FICS the + current server. +- Knights will now handle invalid ICS logins in a sane manner. +- If you accept or counter-challenge a match offer from the + console, the Match Pop-up will go away. +- Fixed a bug where Less-than and Pipe symbols wouldn't render in the console. +- ( Possibily? ) Fixed a bug that caused Knights to repeat the final moves in a + match in the PGN game. +- If your opponent on ICS resigns, Knights now handles it properly.( Redux ) +* Added a History file to Knights. It will contain all past ChangeLog entries + while ChangeLog will only contain entries for the current version. +* Expanded error reporting for failed theme installation. +- Fixed missing character bug in ICC play. +* The "Auto Close Last ICS" option is now on by default. +* You now setup Timeseal for each individual server. +* Added a combobox that lets you select the level of profanity filtering your + ICS preforms on incomming messages. + ( Settings->Configure Knights->Chess Servers->Options->Profanity Filter ) +- Knights should now correctly use the "Clock Ticking" and "Lag Compensation" + data sent to it by FICS. +* Added support for movelist retrieval from ICS ( experimental ) +- Fixed Knights' parsing of Recursive Annotation Variations. RAVs embedded + within one another are now recognised and kept track of. +- Fixed the display of Numerical Annotation Glyphs +* Added support for proposed NAGs #140-154 and #190-195 +- After loading a completed match, Knights now stops the clock and displays an + appropriate message on the Status Bar. +* Knights now fills out the "Mode" PGN tag when it knows the correct value. +- Fixed a bug where Knights looked for the "root" entry in a chessman + theme.conf rather than "rook". +* Knights now reads and uses the Notation Coordinate Colors specified within + theme.conf files. +- Fixed the time read from saved, unfinished PGN games. +* Moved the "Seconds Between Seek Updates" and "Auto Close Last ICS" options + from the General Settings to the Server Options tab. +- Rewrote the engine communications code to use KDE's KProcess instead of UNIX + pipes and signals. This should make Knights more portable, and should fix + some obscure errors. +* Applied KDE3 compatability patch from Harald Fernengel +- Made internal changes to the shutdown procedure. (KDE3) +- Made internal changes to the console's stylesheet. (KDE3) +* Made some minor changes with layout spacing. +- Fixed the Status Bar so that it's alignment is automatic, based on the + current language. +* Replaced the Default Board's 'Highlight' graphics with new images that + show off KDE3's true alpha-channel support. ( Blatant eye-candy, yum ) +- Disabled the back button in the Setup Wizard's last page so you can't go back + and set everything up multiple times. +* When examining a match, manipulating the Notation List will now move you + back and forth through the match. +* Moving the mouse wheel will now navigate the Notation List. +* Added "Player History" to the right-click menu in the Sought Games List. +- Fixed that annoying Console 'jump' you got whenever a match began. +- Fixed the coloring of t-shouts and says. +* You can now continue to drag your chessman even after your opponent has moved +* The 'Show Last Move' option now uses the 'Movement' highlight to display the + appropriate positions. If a chessman was attacked as a part of the previous + move, then that position is shown with the 'Attack' highlight. +* When you preform a 'Premove', it will be represented on the board using + transparent chessmen, rather than the old way ( which was represented with + nothing =). +* You can now preform premoves during a match vs. a computer opponent. +* Left clicking anywhere on the board will cancel a premove. +* Added the "Assess" option to the right-click menu in the Sought Games List. +* Improved handling of Disconnections during ICS play. Also improved handling + of "Illegal Move" messages. +* "Play White" and "Play Black" menu options will now be disabled during an + ICS match. +* Added the ability to Print the notation for the current Match. +* Added translations to French, German, and Estonian. +- Fixed shutdown crash that occured when console was still open. +* Added 'Borders' to Chessboard themes. +- Knights no longer requires OpenGL. +* Added 'busy' cursor when waiting for opponent to move. +* Added the "Bowron Abernethy Chess Engine" to the list of autodetected + engines in the Setup Wizard. +- Fixed a bug in the Challenge Dialog Box that scrambled match parameters. +* Expanded 'Notification' coloring. + +Knights 0.5.4.1 -- Wednesday February 6th, 2002 +Troy Corbin Jr. + +* Changed version to 0.5.4.1 +- Fixed critical error which disabled your ability to capture pieces. + +Knights 0.5.4 -- Monday February 4th, 2002 +Troy Corbin Jr. + +* Changed version to 0.5.4 +* All matches now use the same image cache, rather than creating it's own. + This will save you 2 meg of memory per concurrent match. +- Fixed a bug which prevented some castling. +* Added the 'Resign' option. ( Match->Resign ) +* Knights now automatically adjusts the display depending on which army you're + playing. If you're black, it will be displayed on the bottom. Of course, the + option 'Reverse Board Orientation' reverses this effect: the local player's + army will be displayed at the top. +- Fixed problem with the display of the clocks while playing over an ICS. +- Fixed a bug where Knights will send the resign command to an ICS whenever + an ICS match is closed. Now, resign is never sent to ICS unless you tell + Knights to do so. +- If your opponent on ICS resigns, Knights now handles it properly. +- Knights now writes the correct result of a resigned game in .pgn files. +* Knights now fills out the PlayerType and Termination .pgn tags when it knows + the correct value. +* Implemented "drag & drop" movement of chessmen. +* Streamlined a lot of drawing code, making some operations ( like "Reverse + Board Orientation" ) much faster +* Added initial support for examining games via ICS. +* Added SOUND! ( Settings->Configure Knights->Audio ) +* Optimized various bits of ICS code +* You can now call your opponent's flag ( Match->Call Flag ) +- Fixed some bugs concerning ambiguous SAN notation +* Increased the width of the clock displays, making them more readable with + smaller boards. +* Added an option to automatically close the previous ICS match when you + begin a new one. ( Settings->Configure Knights->General->Automatically + Close Previous ICS Match ) +* Knights can now begin with a match vs PC open, or it can begin connecting + to your ICS. ( Settings->Configure Knights->General->When Knights Begins + It Should: ) +* Added Premove support. ( Settings->Configure Knights->Chess Servers-> + Options->enable Premove ) +* Added checkboxes for ICS Shouts, Unregistered Tells, Kibitzes, Seeks, and + Private Matches. ( Settings->Configure Knights->Chess Servers->Options ) +- Fixed the "Reject Draw" option for ICS games. +- Fixed a bug where Channel Reply didn't work when the last channel message + came from an unregistered user. +* The menu option "Match->Reverse Board Orientation F2" has been renamed to + "Match->Flip Board F2". This option now works independently of the original + option ( Settings->Configure Knights->Display->Reverse Board Orientation" ). + Where the original option effects every board ( and is saved between + sessions ), this new Match Menu option effects only the current match, and + is not saved in any way. +* Now when you're challenged in ICS, a dialog will pop up with the details of + the challenge. From here you can accept or decline, or change the parameters + and make a counter offer. +* Added a patch from Harald Fernengel that makes Knights compatable with KDE3. +- Fixed bug where new ICS games began with garbage highlights. +- Fixed a bug which disabled en Passant moves via ICS game. +* Added extra error messages to detect theme loading problems. + +Knights 0.5.1 -- Friday December 21st, 2001 +Troy Corbin Jr. + +- Fixed a compile bug for Tru64 users +- Fixed a bug introduced in 0.5 that made all play over ICS impossible +- Fixed a bug where Knights counted the opening position in an ICS match + as a move. +- Fixed another ICS related bug where moves you made, which ICS echos back, + were counted twice. +- Fixed yet another bug. This one wrote SAN for a pawn's captures in a way which + was incompatible with other programs. + +Knights 0.5 -- Monday December 17th, 2001 +Troy Corbin Jr. + +* Changed version to 0.5 +- Some distros had a problem compiling 2 lines of the documentation. This + has been fixed. +- Fixed a bug where recieving a position for a game we don't know about caused + Knights to crash. +- Fixed a bug where Knights did not notify ICS when a game was closed. +- In ICS matches where the local player was black, the chessmen were displayed + on the wrong coordinates on the board, making the match unplayable. This has + been fixed. +- Incomming clock times from ICS matches where divided by 10, making a 2 minute + clock look like 12 seconds. This has been fixed. +* Buffered the output of the Sought Games List to help remove the + "flashing" effect. +- Fixed the ability to review games on an ICS. +* Added ability to read .pgn files that contain multiple matches. Knights will + display a summary of the matches in a new window, and you simply click ( or + double-click based on your global KDE settings ) on a match to review it. +- The Sought Games List required a double click to accept a match, regardless + of your global KDE preferences. This has been fixed. +* Knights can now append all your saved games to a single .pgn file. +* Added the "Accept Match", "Tell...", "Finger", and "Add to Friends List" + options to the Sought Games List right click menu. +* Added "Reverse Board Orientation" option to the Match menu thanks to a patch + from Kunnar Klauks. +- Knights now closes the connection to the ICS when you close the console. +- Fixed a bug where a pawn promotion in a loaded game would prompt you to + choose the promotion. +- Fixed the phantom button bug which could occur if you closed matches + out of sequence. +* Added support for the XBoard commands "telluser" and "tellusererror". +- Did some minor code cleanup throughout the project. + +Knights 0.4.9 -- Tuesday December 4th, 2001 +Troy Corbin Jr. + +- Changed version number to 0.4.9 +* Added option to disable the splash screen +* Added configuration for internet servers +* The Game menu is now the File menu, and the Opponent menu is now the Match + menu. +- The new game menu now dynamically enables or disables game types based on + your configuration. So, if you don't have any chess engines configured, you + can't play a vs. PC or PC vs PC game. Likewise for internet play and server + configuration. +* Added the Console... which handles sending and receiving messages via chess + server, and any other online transactions that don't occur Over the Board. +* Added "High Quality" mode, which displays a much smoother chessboard with + very little pixelation... even at the smallest board sizes. However, there + is a noticeable speed tradeoff. +* Added a 2Meg cache which greatly offsets much of the speed loss in High + Quality mode ( At least on my 600 it does ). Still not as fast as regular, + which should be fine for lower-end machines. +- Knights now displays an error message when you try playing with a bad book + engine configuration. +- Fixed bug where Knights couldn't read a move from a .pgn file if it was the + last token on the line. +* Knights will now read themes from two locations... The system-wide themes + directory ( usually /usr/share/apps/knights/themes ) and the media directory + so you can run Knights without installing it ( ../media ) +* Added the 'Ponder' option to the Opponent menu. +* Added the 'Show Last Move' option to the Settings menu. +* Added 'Pause/Resume' functions to the Game menu. +* Separated themes into two - a board theme and a chessman theme. +- Removed the Green Marble theme from the Knights distro. +* Created the ThemePack distro. All themes ( except default ) will go here. +- Fixed the 'Reverse Orientation' option... it now displays correctly. +* Extended Knights' document handling to act like you would expect it: It + remembers URLs ( to resave, or save a loaded game ), and prompts whenever + an unsaved game is about to be destroyed. +* Expanded .pgn support to include multiple games per file and propper + parsing of comments. +* Added application/pgn mimetype +* Knights now connects to FICS and will play chess there. +* Added ALT-R to reply to the last private tell you recieved. +* Added ALT-C to chat on the last channel you recieved a message on. +* Knights now supports multiple matches at once. +* Knights will now default Pawn Promotions to Queen if the user does not + select one. +* Added ability to Retract or Undo a move while playing against an engine. +* Added a "Install Themes" function in the Settings. +* Added ability to modify the key bindings. +* Added a setup wizard to get new users up and running faster. +* Too many minor changes to document. + +Knights 0.4.6 -- Wednesday August 15th, 2001 +Troy Corbin Jr. + +- Changed version to 0.4.6 +* Added en passant moves. +* Added rules for 50 move rule. +* Added rules for forced draws. ( 10.3 & 10.4 of F.I.D.E. Laws of Chess ) +* Knights now sends time & otim to engines that want it. +- Fixed bug where Knights interpreted messages during a game into feature + commands. This occurred while playing Crafty. It sent "time control" during a + match, which Knights interpreted as "feature time=0" due to the way Knights + parses engine data as space separated tokens. A Timer was added to engineio + which keeps any feature commands from comming through after an initial two + seconds. This will probably become a problem again, however, and I should + look into making Knights read engine data as full lines rather than space + separated tokens. +- Fixed bug where internal records, and therefore PGN output, did not reflect + engine names properly when the feature myname was used. Now internal + records are not initiated until after the engines have initiated. +- Fixed bug where the last move of a game could result in an Illegal Move + error being printed on the status bar. +* Knights now recognizes all PGN Tags. +* Loaded games will now be displayed as it loads. +* Added command line option -d for specifying Knights' data directory +- Fixed bug where the king could castle even after he moved +- v 0.4.5 broke the Promotion Selection Dialog. It is now fixed. +* Selecting previous moves from the notation combobox will let you review + the game. If someone makes a move while you're reviewing, you are returned + to the current position. +* The up and down arrow keys will cycle you through your game's history. +- You should now be able to continue a game if the engine thinks you've made + an illegal move. +* Added "Force Move" command to force a computer opponent to make a move. +* Added "Offer Draw" command to offer a draw to your opponent. +* Experimental support for Book Engines +- Fixed FEATURE delay for XBoard compatible engines +- Fixed a bug where new installs had to create two engines and switch them once + before any engines would load. +* Added "Reverse Board Orientation" option which, well, reverses the board's + orientation. =) +* Added first draft of documentation. +- Fixed minor bug in XBoard protocol's alternative move command +- Fixed other minor XBoard compliance issues +- Confirmed that KnightCap works with Knights +- Confirmed that Sjeng works with Knights +- Consolidated entries for GNUChess v4, XBoard v1, XBoard v2, and XBoard v3 + protocols into XBoard +* Engine configurator now sorts the engine list +- Other minor tweaks that I can't remember + +Knights 0.4.5 -- Sunday July 29th, 2001 +Troy Corbin Jr. + +* Re-rendered graphics +* graphics are scalable... 14 different board sizes per theme +* Themes now stored in tarballs +* Knights recognizes and accepts most XBoard version 2 Features +* Crafty v18.9 is confirmed to work! + +Knights 0.4.4 -- Friday July 20th, 2001 +Troy Corbin Jr. + +* enabled engine setup from Settings +* enabled engine vs. engine games +* Knights now recognizes true time control periods +* enabled playing as the black army +* added work on supporting book engines +* minor changes to the main interface + +Knights 0.4.2 -- Tuesday July 17th, 2001 +Troy Corbin Jr. + +* Initial public offering via CVS + + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..4cc16f2 --- /dev/null +++ b/INSTALL @@ -0,0 +1,26 @@ +Dependencies: +------------- + +- Qt 3.x +- KDE 3.x +- Autoconf 2.5 +- Automake 1.6 + +You'll also need to have your $KDEDIR environment variable set correctly. + + +Installing from Tarball Distribution: +------------------------------------- + + Type: ./configure + make + make install + + +Installing from CVS: +-------------------- + + Type: make -f Makefile.dist + ./configure + make + make install diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..24a78b1 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,54 @@ +####### kdevelop will overwrite this part!!! (begin)########## + +SUBDIRS = admin doc knights media po + +####### kdevelop will overwrite this part!!! (end)############ +# not a GNU package. You can remove this line, if +# have all needed files, that a GNU package needs +AUTOMAKE_OPTIONS = foreign + +$(top_srcdir)/configure.in: configure.in.in $(top_srcdir)/subdirs + cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure.in ; + +$(top_srcdir)/subdirs: + cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common subdirs + +$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in + @cd $(top_srcdir) && cat admin/acinclude.m4.in admin/libtool.m4.in > acinclude.m4 + +MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files + +package-messages: + $(MAKE) -f admin/Makefile.common package-messages + $(MAKE) -C po merge + +dist-hook: + cd $(top_distdir) && perl admin/am_edit -padmin + cd $(top_distdir) && $(MAKE) -f admin/Makefile.common subdirs + +rpm_prep: doc clean distclean-generic ${PACKAGE}.spec + rm -R -f /tmp/${PACKAGE}-@RPM_VERSION@ + mkdir -p /tmp/${PACKAGE}-@RPM_VERSION@ + (cd ${srcdir} ; cp -R -a ./* /tmp/${PACKAGE}-@RPM_VERSION@ ) + (cd /tmp/ ; \ + touch ${PACKAGE}-@RPM_VERSION@/doc/help_{en,de,fr,et}.docbook ; \ + find ${SRC_PREFIX}-@RPM_VERSION@ -name CVS > \ + /tmp/${PACKAGE}-tar-excludes.lst ; \ + find ${SRC_PREFIX}-@RPM_VERSION@ -name Makefile \ + -o -name Makefile.in >> \ + /tmp/${PACKAGE}-tar-excludes.lst ; \ + echo "${SRC_PREFIX}-@RPM_VERSION@/doc/api" >> \ + /tmp/${PACKAGE}-tar-excludes.lst ; \ + tar --exclude-from=/tmp/${PACKAGE}-tar-excludes.lst \ + -chzf ${PACKAGE}-@RPM_VERSION@.tar.gz \ + ${SRC_PREFIX}-@RPM_VERSION@ ; \ + rm -f /tmp/${PACKAGE}-tar-excludes.lst ) + rm -R -f /tmp/${PACKAGE}-@RPM_VERSION@ + +# does not work with original SuSE-6.4 rpm +# you will need an update of the rpm package ! +rpm: rpm_prep + rpm -ta /tmp/${PACKAGE}-@RPM_VERSION@.tar.gz + +src.rpm: rpm_prep + rpm -ts /tmp/${PACKAGE}-@RPM_VERSION@.tar.gz diff --git a/Makefile.dist b/Makefile.dist new file mode 100644 index 0000000..be59a86 --- /dev/null +++ b/Makefile.dist @@ -0,0 +1,14 @@ +all: + @echo "This Makefile is only for the CVS repository" + @echo "This will be deleted before making the distribution" + @echo "" + @if test ! -d admin; then \ + echo "Please recheckout this module!" ;\ + echo "for cvs: use checkout once and after that update again" ;\ + echo "for cvsup: checkout kde-common from cvsup and" ;\ + echo " link kde-common/admin to ./admin" ;\ + exit 1 ;\ + fi + $(MAKE) -f admin/Makefile.common cvs + +.SILENT: diff --git a/README b/README new file mode 100644 index 0000000..751514e --- /dev/null +++ b/README @@ -0,0 +1,44 @@ +Knights - A chess interface for the K Desktop Environment + +FOR INSTALLATION INSTRUCTIONS, SEE THE "INSTALL" FILE + +- What Is Knights? + +Knights is a graphical chess interface designed to work with KDE. Knights +is called a chess 'interface' because it does not come with it's own computer +players. There are several very good computer players ( Chess Engines ) +already. Unfortunatly, most chess engines do not include fully featured GUIs. +Instead, they rely on other programs ( like Knights ) to fill the gap. + +- How can I learn more about Knights? + +If you're interested in learning more, you should visit our project's website +at http://knights.sourceforge.net + +- What Chess Engines work with Knights? + +Knights should support any engine which uses the XBoard protocol developed by +Tim Mann. Knights will also offer it's own protocol for future use. To date, +the following chess engines have been confirmed to work with Knights. If you +know of another, please let me know so I can update this list. + + - GNUChess v4.0 patchlevel 80 + - GNUChess v5.02 + - Crafty v18.09 + - Crafty v18.10 + - KnightCap v3.3 + - Sjeng v10.0 + - BabyChess + +- What can I do to help Knights? + +Knights can always use help in a number of areas. The best way to get started +would be to express your interests on the knights-devel mailing list. You can +sign up from here: + + http://sourceforge.net/mail/?group_id=31461 + +Currently, we're very interested in talking to a graphics artist about +designing some new themes, and we would like to talk to some advanced +chess players about helping to develop the tutorials. + diff --git a/TODO b/TODO new file mode 100644 index 0000000..59ea918 --- /dev/null +++ b/TODO @@ -0,0 +1,48 @@ +Knights TODO version 0.6 + +- Server Selector in dlg_logic + +- Bughouse/Crazyhouse Support + + o Add support for multiple boards viewed at once + + - Convert the Main Window to use the TabManager + + o Must find a way to replicate the top-menu + + o Must move most of the knights class into the match class + + - Time to remove the knights class completely?!?!?!? + + o Umm.. is the main window going to look OK with the menu BELOW the tabGrip and close button? + + o We can remove the thinbutton class + + o Must make game boards dynamically resizeable + + - Resizing is slow. How can we speed this up? + + o Add support for a 'sideboard' which displays waiting chessmen + + - Must use TabManager tabs + + o Resizing will be slow. We must find a way to speed up resizing. + +- Add scratchboard support + + o Must replace match's right-click code with a pop-up menu + or context sensitive actions + +- Implement io_email + +- Implement 'Online Player' option in New Match Dialog + + o If player is not online at the time, begin connecting + + o Once online, begin seeking a match w/ time controls set in New Match dialog + +- Implement audio speech which follows teh action on the board + + o Must find someone with a great voice. :-) + +- Support hyperlinks in the console diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..33f5ef8 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,10775 @@ +## -*- autoconf -*- + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) +dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +dnl IMPORTANT NOTE: +dnl Please do not modify this file unless you expect your modifications to be +dnl carried into every other module in the repository. +dnl +dnl Single-module modifications are best placed in configure.in for kdelibs +dnl and kdebase or configure.in.in if present. + +dnl ------------------------------------------------------------------------ +dnl Forward compatibility macros (make autoconf 2.13 look like 2.50), +dnl thanks to Raja R Harinath. +dnl ------------------------------------------------------------------------ +dnl +ifdef([_AC_PATH_X_XMKMF],[], + [AC_DEFUN([_AC_PATH_X_XMKMF],[AC_PATH_X_XMKMF])]) +ifdef([AC_OUTPUT_SUBDIRS],[], + [AC_DEFUN([AC_OUTPUT_SUBDIRS],[subdirs=$1; _AC_OUTPUT_SUBDIRS])]) + +# KDE_PATH_X_DIRECT +dnl Internal subroutine of AC_PATH_X. +dnl Set ac_x_includes and/or ac_x_libraries. +AC_DEFUN(KDE_PATH_X_DIRECT, +[ +AC_REQUIRE([KDE_CHECK_LIB64]) + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +AC_TRY_CPP([#include <$x_direct_test_include>], +[# We can compile using X headers with no special include directory. +ac_x_includes=], +[# Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done]) +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +AC_TRY_LINK(, [${x_direct_test_function}()], +[LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries=], +[LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ + /usr/X11/lib${kdelibsuff} \ + /usr/X11R6/lib${kdelibsuff} \ + /usr/X11R5/lib${kdelibsuff} \ + /usr/X11R4/lib${kdelibsuff} \ + \ + /usr/lib${kdelibsuff}/X11 \ + /usr/lib${kdelibsuff}/X11R6 \ + /usr/lib${kdelibsuff}/X11R5 \ + /usr/lib${kdelibsuff}/X11R4 \ + \ + /usr/local/X11/lib${kdelibsuff} \ + /usr/local/X11R6/lib${kdelibsuff} \ + /usr/local/X11R5/lib${kdelibsuff} \ + /usr/local/X11R4/lib${kdelibsuff} \ + \ + /usr/local/lib${kdelibsuff}/X11 \ + /usr/local/lib${kdelibsuff}/X11R6 \ + /usr/local/lib${kdelibsuff}/X11R5 \ + /usr/local/lib${kdelibsuff}/X11R4 \ + \ + /usr/X386/lib${kdelibsuff} \ + /usr/x386/lib${kdelibsuff} \ + /usr/XFree86/lib${kdelibsuff}/X11 \ + \ + /usr/lib${kdelibsuff} \ + /usr/local/lib${kdelibsuff} \ + /usr/unsupported/lib${kdelibsuff} \ + /usr/athena/lib${kdelibsuff} \ + /usr/local/x11r5/lib${kdelibsuff} \ + /usr/lpp/Xamples/lib${kdelibsuff} \ + /lib/usr/lib${kdelibsuff}/X11 \ + \ + /usr/openwin/lib${kdelibsuff} \ + /usr/openwin/share/lib${kdelibsuff} \ + ; \ +do +dnl Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done]) +fi # $ac_x_libraries = NO +]) + + +dnl ------------------------------------------------------------------------ +dnl Find a file (or one of more files in a list of dirs) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_FIND_FILE, +[ +$3=NO +for i in $2; +do + for j in $1; + do + echo "configure: __oline__: $i/$j" >&AC_FD_CC + if test -r "$i/$j"; then + echo "taking that" >&AC_FD_CC + $3=$i + break 2 + fi + done +done +]) + +dnl KDE_FIND_PATH(programm-name, variable-name, list of directories, +dnl if-not-found, test-parameter) +AC_DEFUN(KDE_FIND_PATH, +[ + AC_MSG_CHECKING([for $1]) + if test -n "$$2"; then + kde_cv_path="$$2"; + else + kde_cache=`echo $1 | sed 'y%./+-%__p_%'` + + AC_CACHE_VAL(kde_cv_path_$kde_cache, + [ + kde_cv_path="NONE" + dirs="$3" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + dirs="$dirs $dir" + done + IFS=$kde_save_IFS + + for dir in $dirs; do + if test -x "$dir/$1"; then + if test -n "$5" + then + evalstr="$dir/$1 $5 2>&1 " + if eval $evalstr; then + kde_cv_path="$dir/$1" + break + fi + else + kde_cv_path="$dir/$1" + break + fi + fi + done + + eval "kde_cv_path_$kde_cache=$kde_cv_path" + + ]) + + eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" + + fi + + if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then + AC_MSG_RESULT(not found) + $4 + else + AC_MSG_RESULT($kde_cv_path) + $2=$kde_cv_path + + fi +]) + +AC_DEFUN(KDE_MOC_ERROR_MESSAGE, +[ + AC_MSG_ERROR([No Qt meta object compiler (moc) found! +Please check whether you installed Qt correctly. +You need to have a running moc binary. +configure tried to run $ac_cv_path_moc and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable MOC to the right one before running +configure. +]) +]) + +AC_DEFUN(KDE_UIC_ERROR_MESSAGE, +[ + AC_MSG_WARN([No Qt ui compiler (uic) found! +Please check whether you installed Qt correctly. +You need to have a running uic binary. +configure tried to run $ac_cv_path_uic and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable UIC to the right one before running +configure. +]) +]) + + +AC_DEFUN(KDE_CHECK_UIC_FLAG, +[ + AC_MSG_CHECKING([whether uic supports -$1 ]) + kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` + AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, + [ + cat >conftest.ui < +EOT + ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" + if AC_TRY_EVAL(ac_uic_testrun); then + eval "kde_cv_prog_uic_$kde_cache=yes" + else + eval "kde_cv_prog_uic_$kde_cache=no" + fi + rm -f conftest* + ]) + + if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then + AC_MSG_RESULT([yes]) + : + $3 + else + AC_MSG_RESULT([no]) + : + $4 + fi +]) + + +dnl ------------------------------------------------------------------------ +dnl Find the meta object compiler and the ui compiler in the PATH, +dnl in $QTDIR/bin, and some more usual places +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_PATH_QT_MOC_UIC, +[ + qt_bindirs="" + for dir in $kde_qt_dirs; do + qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" + done + qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" + if test ! "$ac_qt_bindir" = "NO"; then + qt_bindirs="$ac_qt_bindir $qt_bindirs" + fi + + KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) + if test -z "$UIC_NOT_NEEDED"; then + KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) + if test -z "$UIC_PATH" ; then + KDE_UIC_ERROR_MESSAGE + exit 1 + elif test $kde_qtver = 3; then + KDE_CHECK_UIC_FLAG(L,[/nonexistant],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) + KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) + + UIC=$UIC_PATH + if test x$ac_uic_supports_libpath = xyes; then + UIC="$UIC -L \$(kde_widgetdir)" + fi + if test x$ac_uic_supports_nounload = xyes; then + UIC="$UIC -nounload" + fi + fi + else + UIC="echo uic not available: " + fi + + AC_SUBST(MOC) + AC_SUBST(UIC) + + UIC_TR="i18n" + if test $kde_qtver = 3; then + UIC_TR="tr2i18n" + fi + + AC_SUBST(UIC_TR) +]) + +AC_DEFUN(KDE_1_CHECK_PATHS, +[ + KDE_1_CHECK_PATH_HEADERS + + KDE_TEST_RPATH= + + if test -n "$USE_RPATH"; then + + if test -n "$kde_libraries"; then + KDE_TEST_RPATH="-R $kde_libraries" + fi + + if test -n "$qt_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" + fi + + if test -n "$x_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" + fi + + KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" + fi + +AC_MSG_CHECKING([for KDE libraries installed]) +ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + AC_MSG_RESULT(yes) +else + AC_MSG_ERROR([your system fails at linking a small KDE application! +Check, if your compiler is installed correctly and if you have used the +same compiler to compile Qt and kdelibs as you did use now. +For more details about this problem, look at the end of config.log.]) +fi + +if eval `KDEDIR= ./conftest 2>&5`; then + kde_result=done +else + kde_result=problems +fi + +KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log +kde_have_all_paths=yes + +KDE_SET_PATHS($kde_result) + +]) + +AC_DEFUN(KDE_SET_PATHS, +[ + kde_cv_all_paths="kde_have_all_paths=\"yes\" \ + kde_htmldir=\"$kde_htmldir\" \ + kde_appsdir=\"$kde_appsdir\" \ + kde_icondir=\"$kde_icondir\" \ + kde_sounddir=\"$kde_sounddir\" \ + kde_datadir=\"$kde_datadir\" \ + kde_locale=\"$kde_locale\" \ + kde_cgidir=\"$kde_cgidir\" \ + kde_confdir=\"$kde_confdir\" \ + kde_mimedir=\"$kde_mimedir\" \ + kde_toolbardir=\"$kde_toolbardir\" \ + kde_wallpaperdir=\"$kde_wallpaperdir\" \ + kde_templatesdir=\"$kde_templatesdir\" \ + kde_bindir=\"$kde_bindir\" \ + kde_servicesdir=\"$kde_servicesdir\" \ + kde_servicetypesdir=\"$kde_servicetypesdir\" \ + kde_moduledir=\"$kde_moduledir\" \ + kde_styledir=\"$kde_styledir\" \ + kde_widgetdir=\"$kde_widgetdir\" \ + kde_result=$1" +]) + +AC_DEFUN(KDE_SET_DEFAULT_PATHS, +[ +if test "$1" = "default"; then + + if test -z "$kde_htmldir"; then + kde_htmldir='\${prefix}/share/doc/HTML' + fi + if test -z "$kde_appsdir"; then + kde_appsdir='\${prefix}/share/applnk' + fi + if test -z "$kde_icondir"; then + kde_icondir='\${prefix}/share/icons' + fi + if test -z "$kde_sounddir"; then + kde_sounddir='\${prefix}/share/sounds' + fi + if test -z "$kde_datadir"; then + kde_datadir='\${prefix}/share/apps' + fi + if test -z "$kde_locale"; then + kde_locale='\${prefix}/share/locale' + fi + if test -z "$kde_cgidir"; then + kde_cgidir='\${exec_prefix}/cgi-bin' + fi + if test -z "$kde_confdir"; then + kde_confdir='\${prefix}/share/config' + fi + if test -z "$kde_mimedir"; then + kde_mimedir='\${prefix}/share/mimelnk' + fi + if test -z "$kde_toolbardir"; then + kde_toolbardir='\${prefix}/share/toolbar' + fi + if test -z "$kde_wallpaperdir"; then + kde_wallpaperdir='\${prefix}/share/wallpapers' + fi + if test -z "$kde_templatesdir"; then + kde_templatesdir='\${prefix}/share/templates' + fi + if test -z "$kde_bindir"; then + kde_bindir='\${exec_prefix}/bin' + fi + if test -z "$kde_servicesdir"; then + kde_servicesdir='\${prefix}/share/services' + fi + if test -z "$kde_servicetypesdir"; then + kde_servicetypesdir='\${prefix}/share/servicetypes' + fi + if test -z "$kde_moduledir"; then + if test "$kde_qtver" = "2"; then + kde_moduledir='\${libdir}/kde2' + else + kde_moduledir='\${libdir}/kde3' + fi + fi + if test -z "$kde_styledir"; then + kde_styledir='\${libdir}/kde3/plugins/styles' + fi + if test -z "$kde_widgetdir"; then + kde_widgetdir='\${libdir}/kde3/plugins/designer' + fi + + KDE_SET_PATHS(defaults) + +else + + if test $kde_qtver = 1; then + AC_MSG_RESULT([compiling]) + KDE_1_CHECK_PATHS + else + AC_MSG_ERROR([path checking not yet supported for KDE 2]) + fi + +fi +]) + +AC_DEFUN(KDE_CHECK_PATHS_FOR_COMPLETENESS, +[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || + test -z "$kde_icondir" || test -z "$kde_sounddir" || + test -z "$kde_datadir" || test -z "$kde_locale" || + test -z "$kde_cgidir" || test -z "$kde_confdir" || + test -z "$kde_mimedir" || test -z "$kde_toolbardir" || + test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || + test -z "$kde_bindir" || test -z "$kde_servicesdir" || + test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || + test -z "$kde_styledir" || test -z "kde_widgetdir" + test "x$kde_have_all_paths" != "xyes"; then + kde_have_all_paths=no + fi +]) + +AC_DEFUN(KDE_MISSING_PROG_ERROR, +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed KDE correctly. +]) +]) + +AC_DEFUN(KDE_MISSING_ARTS_ERROR, +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed aRts correctly. +]) +]) + +AC_DEFUN(KDE_SUBST_PROGRAMS, +[ + + kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" + test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" + if test -n "$KDEDIRS"; then + kde_save_IFS=$IFS + IFS=: + for dir in $KDEDIRS; do + kde_default_bindirs="$dir/bin $kde_default_bindirs " + done + IFS=$kde_save_IFS + fi + kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_default_bindirs" + KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) + KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) + KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) + KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs]) + KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) + + if test -n "$MEINPROC" && test ! "$MEINPROC" = "compiled"; then + kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" + test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" + AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) + if test "$KDE_XSL_STYLESHEET" = "NO"; then + KDE_XSL_STYLESHEET="" + else + KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" + fi + fi + + DCOP_DEPENDENCIES='$(DCOPIDL)' + AC_SUBST(DCOPIDL) + AC_SUBST(DCOPIDL2CPP) + AC_SUBST(DCOP_DEPENDENCIES) + AC_SUBST(MCOPIDL) + AC_SUBST(ARTSCCONFIG) + AC_SUBST(KDECONFIG) + AC_SUBST(MEINPROC) + AC_SUBST(KDE_XSL_STYLESHEET) + + if test -x "$KDECONFIG"; then # it can be "compiled" + kde_libs_prefix=`$KDECONFIG --prefix` + if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then + AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. + This means it has been moved since you installed it. + This won't work. Please recompile kdelibs for the new prefix. + ]) + fi + kde_libs_htmldir=`$KDECONFIG --install html --expandvars` + else + kde_libs_prefix='$(prefix)' + kde_libs_htmldir='$(kde_htmldir)' + fi + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) +])dnl + +AC_DEFUN(AC_CREATE_KFSSTND, +[ +AC_REQUIRE([AC_CHECK_RPATH]) + +AC_MSG_CHECKING([for KDE paths]) +kde_result="" +kde_cached_paths=yes +AC_CACHE_VAL(kde_cv_all_paths, +[ + KDE_SET_DEFAULT_PATHS($1) + kde_cached_paths=no +]) +eval "$kde_cv_all_paths" +KDE_CHECK_PATHS_FOR_COMPLETENESS +if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then + # wrong values were cached, may be, we can set better ones + kde_result= + kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= + kde_datadir= kde_locale= kde_cgidir= kde_confdir= + kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= + kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= + kde_have_all_paths= + kde_styledir= + kde_widgetdir= + KDE_SET_DEFAULT_PATHS($1) + eval "$kde_cv_all_paths" + KDE_CHECK_PATHS_FOR_COMPLETENESS + kde_result="$kde_result (cache overridden)" +fi +if test "$kde_have_all_paths" = "no"; then + AC_MSG_ERROR([configure could not run a little KDE program to test the environment. +Since it had compiled and linked before, it must be a strange problem on your system. +Look at config.log for details. If you are not able to fix this, look at +http://www.kde.org/faq/installation.html or any www.kde.org mirror. +(If you're using an egcs version on Linux, you may update binutils!) +]) +else + rm -f conftest* + AC_MSG_RESULT($kde_result) +fi + +bindir=$kde_bindir + +KDE_SUBST_PROGRAMS + +]) + +AC_DEFUN(AC_SUBST_KFSSTND, +[ +AC_SUBST(kde_htmldir) +AC_SUBST(kde_appsdir) +AC_SUBST(kde_icondir) +AC_SUBST(kde_sounddir) +AC_SUBST(kde_datadir) +AC_SUBST(kde_locale) +AC_SUBST(kde_confdir) +AC_SUBST(kde_mimedir) +AC_SUBST(kde_wallpaperdir) +AC_SUBST(kde_bindir) +dnl for KDE 2 +AC_SUBST(kde_templatesdir) +AC_SUBST(kde_servicesdir) +AC_SUBST(kde_servicetypesdir) +AC_SUBST(kde_moduledir) +AC_SUBST(kde_styledir) +AC_SUBST(kde_widgetdir) +if test "$kde_qtver" = 1; then + kde_minidir="$kde_icondir/mini" +else +# for KDE 1 - this breaks KDE2 apps using minidir, but +# that's the plan ;-/ + kde_minidir="/dev/null" +fi +dnl AC_SUBST(kde_minidir) +dnl AC_SUBST(kde_cgidir) +dnl AC_SUBST(kde_toolbardir) +]) + +AC_DEFUN(KDE_MISC_TESTS, +[ + AC_LANG_C + dnl Checks for libraries. + AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD + AC_SUBST(LIBUTIL) + AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD + AC_SUBST(LIBCOMPAT) + kde_have_crypt= + AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], + AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ + AC_MSG_WARN([you have no crypt in either libcrypt or libc. +You should install libcrypt from another source or configure with PAM +support]) + kde_have_crypt=no + ])) + AC_SUBST(LIBCRYPT) + if test $kde_have_crypt = yes; then + AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) + fi + AC_CHECK_SOCKLEN_T + AC_LANG_C + AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + AC_CHECK_LIB(dnet_stub, dnet_ntoa, + [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) + fi + AC_CHECK_FUNC(inet_ntoa) + if test $ac_cv_func_inet_ntoa = no; then + AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") + fi + AC_CHECK_FUNC(connect) + if test $ac_cv_func_connect = no; then + AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , + $X_EXTRA_LIBS) + fi + + AC_CHECK_FUNC(remove) + if test $ac_cv_func_remove = no; then + AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + AC_CHECK_FUNC(shmat, , + AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) + + # darwin needs this to initialize the environment + AC_CHECK_HEADERS(crt_externs.h) + AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) + + # more headers that need to be explicitly included on darwin + AC_CHECK_HEADERS(sys/types.h stdint.h) + + # darwin requires a poll emulation library + AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") + + # CoreAudio framework + AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ + AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) + FRAMEWORK_COREAUDIO="-framework CoreAudio" + ]) + + AC_CHECK_RES_INIT + AC_SUBST(LIB_POLL) + AC_SUBST(FRAMEWORK_COREAUDIO) + LIBSOCKET="$X_EXTRA_LIBS" + AC_SUBST(LIBSOCKET) + AC_SUBST(X_EXTRA_LIBS) + AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 + AC_SUBST(LIBUCB) + + case $host in dnl this *is* LynxOS specific + *-*-lynxos* ) + AC_MSG_CHECKING([LynxOS header file wrappers]) + [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] + AC_MSG_RESULT(disabled) + AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS + ;; + esac + + KDE_CHECK_TYPES + KDE_CHECK_LIBDL + +AH_VERBATIM(_AIX_STRINGS_H_BZERO, +[ +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif +]) + +AC_CHECK_FUNCS([vsnprintf snprintf]) + +AH_VERBATIM(_TRU64,[ +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Find the header files and libraries for X-Windows. Extended the +dnl macro AC_PATH_X +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(K_PATH_X, +[ +AC_REQUIRE([KDE_MISC_TESTS])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_ARG_ENABLE( + embedded, + [ --enable-embedded link to Qt-embedded, don't use X], + kde_use_qt_emb=$enableval, + kde_use_qt_emb=no +) + +AC_ARG_ENABLE( + qtopia, + [ --enable-qtopia link to Qt-embedded, link to the Qtopia Environment], + kde_use_qt_emb_palm=$enableval, + kde_use_qt_emb_palm=no +) + +if test "$kde_use_qt_emb" = "no"; then + +AC_MSG_CHECKING(for X) +AC_LANG_SAVE +AC_LANG_C +AC_CACHE_VAL(kde_cv_have_x, +[# One or both of the vars are not set, and there is no cached value. +if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then + kde_x_includes=NO +else + kde_x_includes=$x_includes +fi +if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then + kde_x_libraries=NO +else + kde_x_libraries=$x_libraries +fi + +# below we use the standard autoconf calls +ac_x_libraries=$kde_x_libraries +ac_x_includes=$kde_x_includes + +KDE_PATH_X_DIRECT +dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. +dnl Unfortunately, if compiling with the N32 ABI, this is not the correct +dnl location. The correct location is /usr/lib32 or an undefined value +dnl (the linker is smart enough to pick the correct default library). +dnl Things work just fine if you use just AC_PATH_X_DIRECT. +dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to +dnl /usr/openwin/include, which doesn't work. /usr/include does work, so +dnl x_includes should be left alone. +case "$host" in +mips-sgi-irix6*) + ;; +*-*-solaris*) + ;; +*) + _AC_PATH_X_XMKMF + if test -z "$ac_x_includes"; then + ac_x_includes="." + fi + if test -z "$ac_x_libraries"; then + ac_x_libraries="/usr/lib${kdelibsuff}" + fi +esac +#from now on we use our own again + +# when the user already gave --x-includes, we ignore +# what the standard autoconf macros told us. +if test "$kde_x_includes" = NO; then + kde_x_includes=$ac_x_includes +fi + +# for --x-libraries too +if test "$kde_x_libraries" = NO; then + kde_x_libraries=$ac_x_libraries +fi + +if test "$kde_x_includes" = NO; then + AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) +fi + +if test "$kde_x_libraries" = NO; then + AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) +fi + +# Record where we found X for the cache. +kde_cv_have_x="have_x=yes \ + kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" +])dnl + +eval "$kde_cv_have_x" + +if test "$have_x" != yes; then + AC_MSG_RESULT($have_x) + no_x=yes +else + AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) +fi + +if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then + X_INCLUDES="" + x_includes="."; dnl better than nothing :- + else + x_includes=$kde_x_includes + X_INCLUDES="-I$x_includes" +fi + +if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE; then + X_LDFLAGS="" + x_libraries="/usr/lib"; dnl better than nothing :- + else + x_libraries=$kde_x_libraries + X_LDFLAGS="-L$x_libraries" +fi +all_includes="$X_INCLUDES" +all_libraries="$X_LDFLAGS" + +AC_SUBST(X_INCLUDES) +AC_SUBST(X_LDFLAGS) +AC_SUBST(x_libraries) +AC_SUBST(x_includes) + +# Check for libraries that X11R6 Xt/Xaw programs need. +ac_save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $X_LDFLAGS" +# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to +# check for ICE first), but we must link in the order -lSM -lICE or +# we get undefined symbols. So assume we have SM if we have ICE. +# These have to be linked with before -lX11, unlike the other +# libraries we check for below, so use a different variable. +# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. +AC_CHECK_LIB(ICE, IceConnectionNumber, + [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) +AC_SUBST(LIBSM) +LDFLAGS="$ac_save_LDFLAGS" + +AC_SUBST(X_PRE_LIBS) + +LIB_X11='-lX11 $(LIBSOCKET)' +AC_SUBST(LIB_X11) + +AC_MSG_CHECKING(for libXext) +AC_CACHE_VAL(kde_cv_have_libXext, +[ +kde_ldflags_safe="$LDFLAGS" +kde_libs_safe="$LIBS" + +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +LIBS="-lXext -lX11 $LIBSOCKET" + +AC_TRY_LINK([ +#include +#ifdef STDC_HEADERS +# include +#endif +], +[ +printf("hello Xext\n"); +], +kde_cv_have_libXext=yes, +kde_cv_have_libXext=no + ) + +LDFLAGS=$kde_ldflags_safe +LIBS=$kde_libs_safe + ]) + +AC_MSG_RESULT($kde_cv_have_libXext) + +if test "$kde_cv_have_libXext" = "no"; then + AC_MSG_ERROR([We need a working libXext to proceed. Since configure +can't find it itself, we stop here assuming that make wouldn't find +them either.]) +fi + +AC_MSG_CHECKING(for Xinerama) + + AC_ARG_WITH(xinerama, + [ --with-xinerama enable support for Xinerama ], + [ + no_xinerama=no + ], [ + no_xinerama=yes + ] +) + +kde_save_LDFLAGS="$LDFLAGS" +kde_save_CFLAGS="$CFLAGS" +kde_save_LIBS="$LIBS" +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +CFLAGS="$CFLAGS -I$x_includes" +LIBS="-lXinerama -lXext" + +if test "x$no_xinerama" = "xno"; then + + AC_CACHE_VAL(ac_cv_have_xinerama, + [ + AC_TRY_LINK([#include + #include ], + [XineramaIsActive(NULL);], + [ac_cv_have_xinerama="yes"], + [ac_cv_have_xinerama="no"]) + ]) +else + ac_cv_have_xinerama=no; +fi + +AC_MSG_RESULT($ac_cv_have_xinerama) + +LIBXINERAMA="" + +if test "$ac_cv_have_xinerama" = "yes"; then + AC_DEFINE(HAVE_XINERAMA, 1, [Define if you want Xinerama support]) + LIBXINERAMA="-lXinerama" +fi + +AC_SUBST(LIBXINERAMA) + +LDFLAGS="$kde_save_LDFLAGS" +CFLAGS="$kde_save_CFLAGS" +LIBS="$kde_save_LIBS" + +LIB_XEXT="-lXext" +QTE_NORTTI="" + +else + dnl We're using QT Embedded + CPPFLAGS=-DQWS + CXXFLAGS="$CXXFLAGS -fno-rtti" + QTE_NORTTI="-fno-rtti -DQWS" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" + AC_SUBST(X_PRE_LIBS) + AC_SUBST(LIB_X11) + AC_SUBST(LIBSM) + AC_SUBST(X_INCLUDES) + AC_SUBST(X_LDFLAGS) + AC_SUBST(x_includes) + AC_SUBST(x_libraries) +fi +AC_SUBST(QTE_NORTTI) +AC_SUBST(LIB_XEXT) + + +AC_LANG_RESTORE + +]) + +AC_DEFUN(KDE_PRINT_QT_PROGRAM, +[ +AC_REQUIRE([KDE_USE_QT]) +cat > conftest.$ac_ext < +#include +EOF +if test "$kde_qtver" = "2"; then +cat >> conftest.$ac_ext < +#include +#include +EOF + +if test $kde_qtsubver -gt 0; then +cat >> conftest.$ac_ext <> conftest.$ac_ext < +#include +#include +EOF +fi + +echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext +cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC +fi + +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" +export LD_LIBRARY_PATH +LIBRARY_PATH="$ac_LIBRARY_PATH" +export LIBRARY_PATH +AC_LANG_RESTORE +]) + +if test "$kde_cv_qt_direct" = "yes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the Qt headers and libraries. +dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) +dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_PATH_QT_1_3, +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([KDE_USE_QT]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +dnl ------------------------------------------------------------------------ +dnl Add configure flag to enable linking to MT version of Qt library. +dnl ------------------------------------------------------------------------ + +AC_ARG_ENABLE( + mt, + [ --disable-mt link to non-threaded Qt (deprecated)], + kde_use_qt_mt=$enableval, + [ + if test $kde_qtver = 3; then + kde_use_qt_mt=yes + else + kde_use_qt_mt=no + fi + ] +) + +USING_QT_MT="" + +dnl ------------------------------------------------------------------------ +dnl If we not get --disable-qt-mt then adjust some vars for the host. +dnl ------------------------------------------------------------------------ + +KDE_MT_LDFLAGS= +KDE_MT_LIBS= +if test "x$kde_use_qt_mt" = "xyes"; then + KDE_CHECK_THREADING + if test "x$kde_use_threading" = "xyes"; then + CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" + KDE_MT_LDFLAGS="$USE_THREADS" + KDE_MT_LIBS="$LIBPTHREAD" + else + kde_use_qt_mt=no + fi +fi +AC_SUBST(KDE_MT_LDFLAGS) +AC_SUBST(KDE_MT_LIBS) + +kde_qt_was_given=yes + +dnl ------------------------------------------------------------------------ +dnl If we haven't been told how to link to Qt, we work it out for ourselves. +dnl ------------------------------------------------------------------------ +if test -z "$LIBQT_GLOB"; then + if test "x$kde_use_qt_emb" = "xyes"; then + LIBQT_GLOB="libqte.*" + else + LIBQT_GLOB="libqt.*" + fi +fi + +if test -z "$LIBQT"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-embedded then adjust the Qt library name. +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + qtlib="qte" + else + qtlib="qt" + fi + + kde_int_qt="-l$qtlib" +else + kde_int_qt="$LIBQT" + kde_lib_qt_set=yes +fi + +if test -z "$LIBQPE"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-palmtop then add -lqpe to the link line +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + if test "x$kde_use_qt_emb_palm" = "xyes"; then + LIB_QPE="-lqpe" + else + LIB_QPE="" + fi + else + LIB_QPE="" + fi +fi + +dnl ------------------------------------------------------------------------ +dnl If we got --enable-qt-mt then adjust the Qt library name for the host. +dnl ------------------------------------------------------------------------ + +if test "x$kde_use_qt_mt" = "xyes"; then + if test -z "$LIBQT"; then + LIBQT="-l$qtlib-mt" + kde_int_qt="-l$qtlib-mt" + else + LIBQT="$qtlib-mt" + kde_int_qt="$qtlib-mt" + fi + LIBQT_GLOB="lib$qtlib-mt.*" + USING_QT_MT="using -mt" +else + LIBQT="-l$qtlib" +fi + +if test $kde_qtver != 1; then + + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([AC_FIND_JPEG]) + LIBQT="$LIBQT $LIBPNG $LIBJPEG" +fi + +if test $kde_qtver = 3; then + AC_REQUIRE([KDE_CHECK_LIBDL]) + LIBQT="$LIBQT $LIBDL" +fi + +AC_MSG_CHECKING([for Qt]) + +if test "x$kde_use_qt_emb" != "xyes"; then +LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" +fi +ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO +qt_libraries="" +qt_includes="" +AC_ARG_WITH(qt-dir, + [ --with-qt-dir=DIR where the root of Qt is installed ], + [ ac_qt_includes="$withval"/include + ac_qt_libraries="$withval"/lib${kdelibsuff} + ac_qt_bindir="$withval"/bin + ]) + +AC_ARG_WITH(qt-includes, + [ --with-qt-includes=DIR where the Qt includes are. ], + [ + ac_qt_includes="$withval" + ]) + +kde_qt_libs_given=no + +AC_ARG_WITH(qt-libraries, + [ --with-qt-libraries=DIR where the Qt library is installed.], + [ ac_qt_libraries="$withval" + kde_qt_libs_given=yes + ]) + +AC_CACHE_VAL(ac_cv_have_qt, +[#try to guess Qt locations + +qt_incdirs="" +for dir in $kde_qt_dirs; do + qt_incdirs="$qt_incdirs $dir/include $dir" +done +qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 $x_includes" +if test ! "$ac_qt_includes" = "NO"; then + qt_incdirs="$ac_qt_includes $qt_incdirs" +fi + +if test "$kde_qtver" != "1"; then + kde_qt_header=qstyle.h +else + kde_qt_header=qglobal.h +fi + +AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) +ac_qt_includes="$qt_incdir" + +qt_libdirs="" +for dir in $kde_qt_dirs; do + qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir" +done +qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" +if test ! "$ac_qt_libraries" = "NO"; then + qt_libdir=$ac_qt_libraries +else + qt_libdirs="$ac_qt_libraries $qt_libdirs" + # if the Qt was given, the chance is too big that libqt.* doesn't exist + qt_libdir=NONE + for dir in $qt_libdirs; do + try="ls -1 $dir/${LIBQT_GLOB}" + if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done +fi + +ac_qt_libraries="$qt_libdir" + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +ac_cxxflags_safe="$CXXFLAGS" +ac_ldflags_safe="$LDFLAGS" +ac_libs_safe="$LIBS" + +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" +LIBS="$LIBS $LIBQT $KDE_MT_LIBS" + +KDE_PRINT_QT_PROGRAM + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* +else + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ac_qt_libraries="NO" +fi +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +AC_LANG_RESTORE +if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then + ac_cv_have_qt="have_qt=no" + ac_qt_notfound="" + missing_qt_mt="" + if test "$ac_qt_includes" = NO; then + if test "$ac_qt_libraries" = NO; then + ac_qt_notfound="(headers and libraries)"; + else + ac_qt_notfound="(headers)"; + fi + else + if test "x$kde_use_qt_mt" = "xyes"; then + missing_qt_mt=" +Make sure that you have compiled Qt with thread support!" + ac_qt_notfound="(library $qtlib-mt)"; + else + ac_qt_notfound="(library $qtlib)"; + fi + fi + + AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! +For more details about this problem, look at the end of config.log.$missing_qt_mt]) +else + have_qt="yes" +fi +]) + +eval "$ac_cv_have_qt" + +if test "$have_qt" != yes; then + AC_MSG_RESULT([$have_qt]); +else + ac_cv_have_qt="have_qt=yes \ + ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" + AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) + + qt_libraries="$ac_qt_libraries" + qt_includes="$ac_qt_includes" +fi + +if test ! "$kde_qt_libs_given" = "yes"; then +KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) +fi + +AC_SUBST(qt_libraries) +AC_SUBST(qt_includes) + +if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then + QT_INCLUDES="" +else + QT_INCLUDES="-I$qt_includes" + all_includes="$QT_INCLUDES $all_includes" +fi + +if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then + QT_LDFLAGS="" +else + QT_LDFLAGS="-L$qt_libraries" + all_libraries="$all_libraries $QT_LDFLAGS" +fi +test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" + +AC_SUBST(QT_INCLUDES) +AC_SUBST(QT_LDFLAGS) +AC_PATH_QT_MOC_UIC + +KDE_CHECK_QT_JPEG + +if test "x$kde_use_qt_emb" != "xyes"; then +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' +else +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBPNG)' +fi +test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" + +AC_SUBST(LIB_QT) +AC_SUBST(LIB_QPE) + +AC_SUBST(kde_qtver) +]) + +AC_DEFUN(AC_PATH_QT, +[ +AC_PATH_QT_1_3 +]) + +AC_DEFUN(KDE_CHECK_UIC_PLUGINS, +[ +AC_REQUIRE([AC_PATH_QT_MOC_UIC]) + +if test x$ac_uic_supports_libpath = xyes; then + +AC_MSG_CHECKING([if UIC has KDE plugins available]) +AC_CACHE_VAL(kde_cv_uic_plugins, +[ +cat > actest.ui << EOF + +NewConnectionDialog + + + + testInput + + + + +EOF + + + +kde_cv_uic_plugins=no +kde_line="$UIC_PATH -L $kde_widgetdir" +if test x$ac_uic_supports_nounload = xyes; then + kde_line="$kde_line -nounload" +fi +kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" +if AC_TRY_EVAL(kde_line); then + if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then + kde_cv_uic_plugins=yes + fi +fi +rm -f actest.ui actest.cpp +]) + +if test "$kde_cv_uic_plugins" = yes; then + AC_MSG_RESULT([yes]) +else + AC_MSG_ERROR([not found - you need to install kdelibs first.]) +fi +fi +]) + +AC_DEFUN(KDE_CHECK_FINAL, +[ + AC_ARG_ENABLE(final, [ --enable-final build size optimized apps (experimental - needs lots of memory)], + kde_use_final=$enableval, kde_use_final=no) + + KDE_COMPILER_REPO + if test "x$kde_use_final" = "xyes"; then + KDE_USE_FINAL_TRUE="" + KDE_USE_FINAL_FALSE="#" + else + KDE_USE_FINAL_TRUE="#" + KDE_USE_FINAL_FALSE="" + fi + AC_SUBST(KDE_USE_FINAL_TRUE) + AC_SUBST(KDE_USE_FINAL_FALSE) + + AC_ARG_ENABLE(closure, [ --disable-closure don't delay template instantiation], + kde_use_closure=$enableval, kde_use_closure=yes) + + if test "x$kde_use_closure" = "xyes"; then + KDE_USE_CLOSURE_TRUE="" + KDE_USE_CLOSURE_FALSE="#" +# CXXFLAGS="$CXXFLAGS $REPO" + else + KDE_USE_CLOSURE_TRUE="#" + KDE_USE_CLOSURE_FALSE="" + fi + AC_SUBST(KDE_USE_CLOSURE_TRUE) + AC_SUBST(KDE_USE_CLOSURE_FALSE) +]) + +dnl ------------------------------------------------------------------------ +dnl Now, the same with KDE +dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) +dnl and $(kde_includes) will be the kdehdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_BASE_PATH_KDE, +[ +AC_PREREQ([2.13]) +AC_REQUIRE([AC_PATH_QT])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_CHECK_RPATH +AC_MSG_CHECKING([for KDE]) + +if test "${prefix}" != NONE; then + kde_includes=${prefix}/include + ac_kde_includes=$prefix/include + + if test "${exec_prefix}" != NONE; then + kde_libraries=${libdir} + ac_kde_libraries=$libdir + if test "$ac_kde_libraries" = '${exec_prefix}/lib'${kdelibsuff}; then + ac_kde_libraries=$exec_prefix/lib${kdelibsuff} + fi + else + kde_libraries=${prefix}/lib${kdelibsuff} + ac_kde_libraries=$prefix/lib${kdelibsuff} + fi +else + ac_kde_includes= + ac_kde_libraries= + kde_libraries="" + kde_includes="" +fi + +AC_CACHE_VAL(ac_cv_have_kde, +[#try to guess kde locations + +if test "$kde_qtver" = 1; then + kde_check_header="ksock.h" + kde_check_lib="libkdecore.la" +else + kde_check_header="ksharedptr.h" + kde_check_lib="libkio.la" +fi + +if test -z "$1"; then + +kde_incdirs="/usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" +test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" +kde_incdirs="$ac_kde_includes $kde_incdirs" +AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) +ac_kde_includes="$kde_incdir" + +if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then + AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE headers installed. This will fail. +So, check this please and use another prefix!]) +fi + +kde_libdirs="/usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" +test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" +kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" +AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) +ac_kde_libraries="$kde_libdir" + +kde_widgetdir=NO +dnl this might be somewhere else +AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) + +if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then +AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE libraries installed. This will fail. +So, check this please and use another prefix!]) +fi + +if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then +AC_MSG_ERROR([ +I can't find the designer plugins. These are required and should have been installed +by kdelibs]) +fi + +if test -n "$kde_widgetdir"; then + kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" +fi + + +if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then + ac_cv_have_kde="have_kde=no" +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" +fi + +else dnl test -z $1 + + ac_cv_have_kde="have_kde=no" + +fi +])dnl + +eval "$ac_cv_have_kde" + +if test "$have_kde" != "yes"; then + if test "${prefix}" = NONE; then + ac_kde_prefix="$ac_default_prefix" + else + ac_kde_prefix="$prefix" + fi + if test "$exec_prefix" = NONE; then + ac_kde_exec_prefix="$ac_kde_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix]) + else + ac_kde_exec_prefix="$exec_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) + fi + + kde_libraries="${libdir}" + kde_includes=${ac_kde_prefix}/include + +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" + AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) + + kde_libraries="$ac_kde_libraries" + kde_includes="$ac_kde_includes" +fi +AC_SUBST(kde_libraries) +AC_SUBST(kde_includes) + +if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then + KDE_INCLUDES="" +else + KDE_INCLUDES="-I$kde_includes" + all_includes="$KDE_INCLUDES $all_includes" +fi + +KDE_LDFLAGS="-L$kde_libraries" +if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then + all_libraries="$all_libraries $KDE_LDFLAGS" +fi + +AC_SUBST(KDE_LDFLAGS) +AC_SUBST(KDE_INCLUDES) + +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +all_libraries="$all_libraries $USER_LDFLAGS" +all_includes="$all_includes $USER_INCLUDES" +AC_SUBST(all_includes) +AC_SUBST(all_libraries) + +if test -z "$1"; then +KDE_CHECK_UIC_PLUGINS +fi + +ac_kde_libraries="$kde_libdir" + +AC_SUBST(AUTODIRS) + + +]) + +AC_DEFUN(KDE_CHECK_EXTRA_LIBS, +[ +AC_MSG_CHECKING(for extra includes) +AC_ARG_WITH(extra-includes, [ --with-extra-includes=DIR + adds non standard include paths], + kde_use_extra_includes="$withval", + kde_use_extra_includes=NONE +) +kde_extra_includes= +if test -n "$kde_use_extra_includes" && \ + test "$kde_use_extra_includes" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_includes; do + kde_extra_includes="$kde_extra_includes $dir" + USER_INCLUDES="$USER_INCLUDES -I$dir" + done + IFS=$ac_save_ifs + kde_use_extra_includes="added" +else + kde_use_extra_includes="no" +fi +AC_SUBST(USER_INCLUDES) + +AC_MSG_RESULT($kde_use_extra_includes) + +kde_extra_libs= +AC_MSG_CHECKING(for extra libs) +AC_ARG_WITH(extra-libs, [ --with-extra-libs=DIR adds non standard library paths], + kde_use_extra_libs=$withval, + kde_use_extra_libs=NONE +) +if test -n "$kde_use_extra_libs" && \ + test "$kde_use_extra_libs" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_libs; do + kde_extra_libs="$kde_extra_libs $dir" + KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" + USER_LDFLAGS="$USER_LDFLAGS -L$dir" + done + IFS=$ac_save_ifs + kde_use_extra_libs="added" +else + kde_use_extra_libs="no" +fi + +AC_SUBST(USER_LDFLAGS) + +AC_MSG_RESULT($kde_use_extra_libs) + +]) + +AC_DEFUN(KDE_1_CHECK_PATH_HEADERS, +[ + AC_MSG_CHECKING([for KDE headers installed]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS +cat > conftest.$ac_ext < +#endif +#include +#include "confdefs.h" +#include + +int main() { + printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); + printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); + printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); + printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); + printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); + printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); + printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); + printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); + printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); + printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); + printf("kde_wallpaperdir=\\"%s\\"\n", + KApplication::kde_wallpaperdir().data()); + printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); + printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); + printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); + printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); + printf("kde_moduledir=\\"/tmp/dummy\\"\n"); + printf("kde_styledir=\\"/tmp/dummy\\"\n"); + printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); + return 0; + } +EOF + + ac_compile='${CXX-g++} -c $CXXFLAGS $all_includes $CPPFLAGS conftest.$ac_ext' + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + else + AC_MSG_ERROR([your system is not able to compile a small KDE application! +Check, if you installed the KDE header files correctly. +For more details about this problem, look at the end of config.log.]) + fi + + AC_LANG_RESTORE +]) + +AC_DEFUN(KDE_CHECK_KDEQTADDON, +[ +AC_MSG_CHECKING(for kde-qt-addon) +AC_CACHE_VAL(kde_cv_have_kdeqtaddon, +[ + kde_ldflags_safe="$LDFLAGS" + kde_libs_safe="$LIBS" + kde_cxxflags_safe="$CXXFLAGS" + + LIBS="-lkde-qt-addon $LIBQT $LIBS" + CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" + LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" + + AC_TRY_LINK([ + #include + ], + [ + QDomDocument doc; + ], + kde_cv_have_kdeqtaddon=yes, + kde_cv_have_kdeqtaddon=no + ) + + LDFLAGS=$kde_ldflags_safe + LIBS=$kde_libs_safe + CXXFLAGS=$kde_cxxflags_safe +]) + +AC_MSG_RESULT($kde_cv_have_kdeqtaddon) + +if test "$kde_cv_have_kdeqtaddon" = "no"; then + AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. +It is a separate package (and CVS module) named kde-qt-addon.]) +fi +]) + +AC_DEFUN(KDE_CHECK_KIMGIO, +[ + AC_REQUIRE([AC_BASE_PATH_KDE]) + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + AC_REQUIRE([AC_FIND_TIFF]) + AC_REQUIRE([AC_FIND_JPEG]) + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([KDE_CREATE_LIBS_ALIASES]) + + if test "$1" = "existance"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_LIBS="$LIBS" + LIBS="$LIBS $all_libraries $LIBJPEG $LIBTIFF $LIBPNG $LIBQT -lm" + AC_CHECK_LIB(kimgio, kimgioRegister, [ + LIBKIMGIO_EXISTS=yes],LIBKIMGIO_EXISTS=no) + LIBS="$kde_save_LIBS" + AC_LANG_RESTORE + else + LIBKIMGIO_EXISTS=yes + fi + + if test "$LIBKIMGIO_EXISTS" = "yes"; then + LIB_KIMGIO='-lkimgio' + else + LIB_KIMGIO='' + fi + AC_SUBST(LIB_KIMGIO) +]) + +AC_DEFUN(KDE_CREATE_LIBS_ALIASES, +[ + AC_REQUIRE([KDE_MISC_TESTS]) + AC_REQUIRE([KDE_CHECK_LIBDL]) + AC_REQUIRE([K_PATH_X]) + +if test $kde_qtver = 3; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KABC, "-lkabc") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +# these are for backward compatibility + AC_SUBST(LIB_KSYCOCA, "-lkio") + AC_SUBST(LIB_KFILE, "-lkio") +elif test $kde_qtver = 2; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KSYCOCA, "-lksycoca") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KFILE, "-lkfile") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +else + AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") + AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") + AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") + AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") + AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") +fi +]) + +AC_DEFUN(AC_PATH_KDE, +[ + AC_BASE_PATH_KDE + AC_ARG_ENABLE(path-check, [ --disable-path-check don't try to find out, where to install], + [ + if test "$enableval" = "no"; + then ac_use_path_checking="default" + else ac_use_path_checking="" + fi + ], + [ + if test "$kde_qtver" = 1; + then ac_use_path_checking="" + else ac_use_path_checking="default" + fi + ] + ) + + AC_CREATE_KFSSTND($ac_use_path_checking) + + AC_SUBST_KFSSTND + KDE_CREATE_LIBS_ALIASES +]) + +dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) +AC_DEFUN(KDE_CHECK_FUNC_EXT, +[ +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(kde_cv_func_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +save_CXXFLAGS="$CXXFLAGS" +kde_safe_LIBS="$LIBS" +LIBS="$LIBS $X_EXTRA_LIBS" +if test "$GXX" = "yes"; then + CXXFLAGS="$CXXFLAGS -pedantic-errors" +fi +AC_TRY_COMPILE([ +$2 +], +[ +$3 +], +kde_cv_func_$1=yes, +kde_cv_func_$1=no) +CXXFLAGS="$save_CXXFLAGS" +LIBS=$kde_safe_LIBS +AC_LANG_RESTORE +]) + +AC_MSG_RESULT($kde_cv_func_$1) + +AC_MSG_CHECKING([if $1 needs custom prototype]) +AC_CACHE_VAL(kde_cv_proto_$1, +[ +if test "x$kde_cv_func_$1" = xyes; then + kde_cv_proto_$1=no +else + case "$1" in + setenv|unsetenv|usleep|getdomainname|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) + kde_cv_proto_$1="yes - in libkdefakes" + ;; + *) + kde_cv_proto_$1=unknown + ;; + esac +fi + +if test "x$kde_cv_proto_$1" = xunknown; then + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + kde_safe_libs=$LIBS + LIBS="$LIBS $X_EXTRA_LIBS" + AC_TRY_LINK([ +$2 + +extern "C" $4; +], +[ +$3 +], +[ kde_cv_func_$1=yes + kde_cv_proto_$1=yes ], + [kde_cv_proto_$1="$1 unavailable"] +) +LIBS=$kde_safe_libs +AC_LANG_RESTORE +fi +]) +AC_MSG_RESULT($kde_cv_proto_$1) + +if test "x$kde_cv_func_$1" = xyes; then + AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) + $6 +fi +if test "x$kde_cv_proto_$1" = xno; then + AC_DEFINE(HAVE_$5_PROTO, 1, + [Define if you have the $1 prototype]) +fi + +AH_VERBATIM([_HAVE_$5_PROTO], +[ +#if !defined(HAVE_$5_PROTO) +#ifdef __cplusplus +extern "C" +#endif +$4; +#endif +]) +]) + +AC_DEFUN(AC_CHECK_SETENV, +[ + KDE_CHECK_FUNC_EXT(setenv, [ +#include +], + [setenv("VAR", "VALUE", 1);], + [int setenv (const char *, const char *, int)], + [SETENV]) +]) + +AC_DEFUN(AC_CHECK_UNSETENV, +[ + KDE_CHECK_FUNC_EXT(unsetenv, [ +#include +], + [unsetenv("VAR");], + [void unsetenv (const char *)], + [UNSETENV]) +]) + +AC_DEFUN(AC_CHECK_GETDOMAINNAME, +[ + KDE_CHECK_FUNC_EXT(getdomainname, [ +#include +#include +], + [ +char buffer[200]; +getdomainname(buffer, 200); +], + [int getdomainname (char *, unsigned int)], + [GETDOMAINNAME]) +]) + +AC_DEFUN(AC_CHECK_GETHOSTNAME, +[ + KDE_CHECK_FUNC_EXT(gethostname, [ +#include +#include +], + [ +char buffer[200]; +gethostname(buffer, 200); +], + [int gethostname (char *, unsigned int)], + [GETHOSTNAME]) +]) + +AC_DEFUN(AC_CHECK_USLEEP, +[ + KDE_CHECK_FUNC_EXT(usleep, [ +#include +], + [ +usleep(200); +], + [int usleep (unsigned int)], + [USLEEP]) +]) + + +AC_DEFUN(AC_CHECK_RANDOM, +[ + KDE_CHECK_FUNC_EXT(random, [ +#include +], + [ +random(); +], + [long int random(void)], + [RANDOM]) + + KDE_CHECK_FUNC_EXT(srandom, [ +#include +], + [ +srandom(27); +], + [void srandom(unsigned int)], + [SRANDOM]) + +]) + +AC_DEFUN(AC_CHECK_INITGROUPS, +[ + KDE_CHECK_FUNC_EXT(initgroups, [ +#include +#include +#include +], + [ +char buffer[200]; +initgroups(buffer, 27); +], + [int initgroups(const char *, gid_t)], + [INITGROUPS]) +]) + +AC_DEFUN(AC_CHECK_MKSTEMP, +[ + KDE_CHECK_FUNC_EXT(mkstemp, [ +#include +], + [ +mkstemp("/tmp/aaaXXXXXX"); +], + [int mkstemp(char *)], + [MKSTEMP]) +]) + +AC_DEFUN(AC_CHECK_MKSTEMPS, +[ + KDE_CHECK_FUNC_EXT(mkstemps, [ +#include +#include +], + [ +mkstemps("/tmp/aaaXXXXXX", 6); +], + [int mkstemps(char *, int)], + [MKSTEMPS]) +]) + +AC_DEFUN(AC_CHECK_RES_INIT, +[ + AC_MSG_CHECKING([if res_init needs -lresolv]) + kde_libs_safe="$LIBS" + LIBS="$LIBS $X_EXTRA_LIBS -lresolv" + AC_TRY_LINK( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + LIBRESOLV="-lresolv" + AC_MSG_RESULT(yes) + X_EXTRA_LIBS="$X_EXTRA_LIBS $LIBRESOLV" + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) + LIBS=$kde_libs_safe + AC_SUBST(LIBRESOLV) + + AC_MSG_CHECKING([if res_init is available]) + AC_TRY_COMPILE( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) +]) + +AC_DEFUN(AC_CHECK_STRLCPY, +[ + KDE_CHECK_FUNC_EXT(strlcpy, [ +#include +], +[ char buf[20]; + strlcpy(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcpy(char*, const char*, unsigned long)], + [STRLCPY]) +]) + +AC_DEFUN(AC_CHECK_STRLCAT, +[ + KDE_CHECK_FUNC_EXT(strlcat, [ +#include +], +[ char buf[20]; + buf[0]='\0'; + strlcat(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcat(char*, const char*, unsigned long)], + [STRLCAT]) +]) + +AC_DEFUN(AC_FIND_GIF, + [AC_MSG_CHECKING([for giflib]) +AC_CACHE_VAL(ac_cv_lib_gif, +[ac_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes"; then +LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" +else +LIBS="$all_libraries -lgif" +fi +AC_TRY_LINK(dnl +[ +#ifdef __cplusplus +extern "C" { +#endif +int GifLastError(void); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [return GifLastError();], + eval "ac_cv_lib_gif=yes", + eval "ac_cv_lib_gif=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) +else + AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) +fi +]) + +AC_DEFUN(KDE_FIND_JPEG_HELPER, +[ +AC_MSG_CHECKING([for libjpeg$2]) +AC_CACHE_VAL(ac_cv_lib_jpeg_$1, +[ +AC_LANG_C +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[/* Override any gcc2 internal prototype to avoid an error. */ +struct jpeg_decompress_struct; +typedef struct jpeg_decompress_struct * j_decompress_ptr; +typedef int size_t; +#ifdef __cplusplus +extern "C" { +#endif + void jpeg_CreateDecompress(j_decompress_ptr cinfo, + int version, size_t structsize); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [jpeg_CreateDecompress(0L, 0, 0);], + eval "ac_cv_lib_jpeg_$1=-ljpeg$2", + eval "ac_cv_lib_jpeg_$1=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then + LIBJPEG="$ac_cv_lib_jpeg_$1" + AC_MSG_RESULT($ac_cv_lib_jpeg_$1) +else + AC_MSG_RESULT(no) + $3 +fi + +]) + +AC_DEFUN(AC_FIND_JPEG, +[ +dnl first look for libraries +KDE_FIND_JPEG_HELPER(6b, 6b, + KDE_FIND_JPEG_HELPER(normal, [], + [ + LIBJPEG= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h +dnl requires system dependent includes loaded before it) +jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" +AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no jpeg support in khtml) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then + AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then + AC_MSG_WARN([ +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +]) + else + AC_MSG_WARN([libjpeg not found. disable JPEG support.]) + fi + jpeg_incdir= + LIBJPEG= +fi + +AC_SUBST(LIBJPEG) +AH_VERBATIM(_AC_CHECK_JPEG, +[/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif +]) +]) + +AC_DEFUN(KDE_CHECK_QT_JPEG, +[ +AC_MSG_CHECKING([if Qt needs $LIBJPEG]) +AC_CACHE_VAL(kde_cv_qt_jpeg, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS $LIBQT" +LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[#include ], + [ + int argc; + char** argv; + QApplication app(argc, argv);], + eval "kde_cv_qt_jpeg=no", + eval "kde_cv_qt_jpeg=yes") +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then + AC_MSG_RESULT(yes) + LIBJPEG_QT='$(LIBJPEG)' +else + AC_MSG_RESULT(no) + LIBJPEG_QT= +fi + +]) + +AC_DEFUN(AC_FIND_ZLIB, +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for libz]) +AC_CACHE_VAL(ac_cv_lib_z, +[ +AC_LANG_C +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#include +], + [return (zlibVersion() == ZLIB_VERSION); ], + eval "ac_cv_lib_z='-lz'", + eval "ac_cv_lib_z=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if test ! "$ac_cv_lib_z" = no; then + AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) + LIBZ="$ac_cv_lib_z" + AC_SUBST(LIBZ) + AC_MSG_RESULT($ac_cv_lib_z) +else + AC_MSG_ERROR(not found. Check your installation and look into config.log) + LIBZ="" + AC_SUBST(LIBZ) +fi +]) + +AC_DEFUN(KDE_TRY_TIFFLIB, +[ +AC_MSG_CHECKING([for libtiff $1]) + +AC_CACHE_VAL(kde_cv_libtiff_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes"; then +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" +else +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" +fi +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl +[ +#include +], + [return (TIFFOpen( "", "r") == 0); ], +[ + kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" +], [ + kde_cv_libtiff_$1=no +]) + +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if test "$kde_cv_libtiff_$1" = "no"; then + AC_MSG_RESULT(no) + LIBTIFF="" + $3 +else + LIBTIFF="$kde_cv_libtiff_$1" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) + $2 +fi + +]) + +AC_DEFUN(AC_FIND_TIFF, +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +KDE_TRY_TIFFLIB(tiff, [], + KDE_TRY_TIFFLIB(tiff34)) + +AC_SUBST(LIBTIFF) +]) + + +AC_DEFUN(AC_FIND_PNG, +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_MSG_CHECKING([for libpng]) +AC_CACHE_VAL(ac_cv_lib_png, +[ +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes"; then +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" +else +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" +fi +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_LANG_C +AC_TRY_LINK(dnl + [ + #include + ], + [ + png_structp png_ptr = png_create_read_struct( /* image ptr */ + PNG_LIBPNG_VER_STRING, 0, 0, 0 ); + return( png_ptr != 0 ); + ], + eval "ac_cv_lib_png='-lpng $LIBZ -lm'", + eval "ac_cv_lib_png=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) + LIBPNG="$ac_cv_lib_png" + AC_SUBST(LIBPNG) + AC_MSG_RESULT($ac_cv_lib_png) +else + AC_MSG_RESULT(no) + LIBPNG="" + AC_SUBST(LIBPNG) +fi +]) + +AC_DEFUN(AC_CHECK_BOOL, +[ + AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) +]) + +AC_DEFUN(AC_CHECK_GNU_EXTENSIONS, +[ +AC_MSG_CHECKING(if you need GNU extensions) +AC_CACHE_VAL(ac_cv_gnu_extensions, +[ +cat > conftest.c << EOF +#include + +#ifdef __GNU_LIBRARY__ +yes +#endif +EOF + +if (eval "$ac_cpp conftest.c") 2>&5 | + egrep "yes" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_gnu_extensions=yes +else + ac_cv_gnu_extensions=no +fi +]) + +AC_MSG_RESULT($ac_cv_gnu_extensions) +if test "$ac_cv_gnu_extensions" = "yes"; then + AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) +fi +]) + +AC_DEFUN(KDE_CHECK_COMPILER_FLAG, +[ +AC_MSG_CHECKING(whether $CXX supports -$1) +kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` +AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) + CXXFLAGS="$save_CXXFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + +dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables +dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) +dnl it's all white-space separated +AC_DEFUN(AC_REMOVE_FORBIDDEN, +[ __val=$$1 + __forbid=" $2 " + if test -n "$__val"; then + __new="" + ac_save_IFS=$IFS + IFS=" " + for i in $__val; do + case "$__forbid" in + *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; + *) # Careful to not add spaces, where there were none, because otherwise + # libtool gets confused, if we change e.g. CXX + if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; + esac + done + IFS=$ac_save_IFS + $1=$__new + fi +]) + +dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given +AC_DEFUN(AC_VALIDIFY_CXXFLAGS, +[dnl +if test "x$kde_use_qt_emb" != "xyes"; then + AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) +else + AC_REMOVE_FORBIDDEN(CXX, [-rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) +fi +]) + +AC_DEFUN(AC_CHECK_COMPILERS, +[ + AC_ARG_ENABLE(debug,[ --enable-debug[=ARG] enables debug symbols (yes|no|full) [default=no]], + [ + case $enableval in + yes) + kde_use_debug_code="yes" + kde_use_debug_define=no + ;; + full) + kde_use_debug_code="full" + kde_use_debug_define=no + ;; + *) + kde_use_debug_code="no" + kde_use_debug_define=yes + ;; + esac + ], + [kde_use_debug_code="no" + kde_use_debug_define=no + ]) + + dnl Just for configure --help + AC_ARG_ENABLE(dummyoption,[ --disable-debug disables debug output and debug symbols [default=no]],[],[]) + + AC_ARG_ENABLE(strict,[ --enable-strict compiles with strict compiler options (may not work!)], + [ + if test $enableval = "no"; then + kde_use_strict_options="no" + else + kde_use_strict_options="yes" + fi + ], [kde_use_strict_options="no"]) + + AC_ARG_ENABLE(warnings,[ --disable-warnings disables compilation with -Wall and similiar], + [ + if test $enableval = "no"; then + kde_use_warnings="no" + else + kde_use_warnings="yes" + fi + ], [kde_use_warnings="yes"]) + + dnl enable warnings for debug build + if test "$kde_use_debug_code" != "no"; then + kde_use_warnings=yes + fi + + AC_ARG_ENABLE(profile,[ --enable-profile creates profiling infos [default=no]], + [kde_use_profiling=$enableval], + [kde_use_profiling="no"] + ) + + dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS + CFLAGS=" $CFLAGS" + + AC_PROG_CC + + AC_PROG_CPP + + if test "$GCC" = "yes"; then + if test "$kde_use_debug_code" != "no"; then + if test $kde_use_debug_code = "full"; then + CFLAGS="-g3 $CFLAGS" + else + CFLAGS="-g -O2 $CFLAGS" + fi + else + CFLAGS="-O2 $CFLAGS" + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CFLAGS="-DNDEBUG $CFLAGS" + fi + + + case "$host" in + *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; + *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; + esac + + if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then + LDFLAGS="" + fi + + CXXFLAGS=" $CXXFLAGS" + + AC_PROG_CXX + + if test "$GXX" = "yes" || test "$CXX" = "KCC"; then + if test "$kde_use_debug_code" != "no"; then + if test "$CXX" = "KCC"; then + CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings $CXXFLAGS" + else + if test "$kde_use_debug_code" = "full"; then + CXXFLAGS="-g3 $CXXFLAGS" + else + CXXFLAGS="-g -O2 $CXXFLAGS" + fi + fi + KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) + + dnl convenience compiler flags + KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) + AC_SUBST(WOVERLOADED_VIRTUAL) + else + if test "$CXX" = "KCC"; then + CXXFLAGS="+K3 $CXXFLAGS" + else + CXXFLAGS="-O2 $CXXFLAGS" + fi + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" + fi + + if test "$kde_use_profiling" = "yes"; then + KDE_CHECK_COMPILER_FLAG(pg, + [ + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + ]) + fi + + if test "$kde_use_warnings" = "yes"; then + if test "$GCC" = "yes"; then + case $host in + *-*-linux-gnu) + CFLAGS="-ansi -W -Wall -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" + CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion $CXXFLAGS" + ;; + esac + CXXFLAGS="-Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings $CXXFLAGS" + KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wnon-virtual-dtor,[CXXFLAGS="-Wnon-virtual-dtor $CXXFLAGS"]) + fi + fi + + if test "$GCC" = "yes" && test "$kde_use_strict_options" = "yes"; then + CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" + fi + + if test "$GXX" = "yes"; then + KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) + KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) + KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) + fi + if test "$CXX" = "KCC"; then + dnl unfortunately we currently cannot disable exception support in KCC + dnl because doing so is binary incompatible and Qt by default links with exceptions :-( + dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) + dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) + + AC_ARG_ENABLE(pch,[ --enable-pch enables precompiled header support (currently only KCC) [default=no]], + [ + kde_use_pch=$enableval + ],[kde_use_pch=no]) + + if test "$kde_use_pch" = "yes"; then + dnl TODO: support --pch-dir! + KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) + dnl the below works (but the dir must exist), but it's + dnl useless for a whole package. + dnl The are precompiled headers for each source file, so when compiling + dnl from scratch, it doesn't make a difference, and they take up + dnl around ~5Mb _per_ sourcefile. + dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, + dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) + fi + dnl this flag controls inlining. by default KCC inlines in optimisation mode + dnl all implementations that are defined inside the class {} declaration. + dnl because of templates-compatibility with broken gcc compilers, this + dnl can cause excessive inlining. This flag limits it to a sane level + KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) + KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) + KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) + KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) + dnl Some source files are shared between multiple executables + dnl (or libraries) and some of those need template instantiations. + dnl In that case KCC needs to compile those sources with + dnl --one_instantiation_per_object. To make it easy for us we compile + dnl _all_ objects with that flag (--one_per is a shorthand). + KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) + fi + AC_SUBST(USE_EXCEPTIONS) + dnl obsolete macro - provided to keep things going + USE_RTTI= + AC_SUBST(USE_RTTI) + + case "$host" in + *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; + *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; + *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; + *-*-solaris*) + if test "$GXX" = yes; then + libstdcpp=`$CXX -print-file-name=libstdc++.so` + if test ! -f $libstdcpp; then + AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) + fi + fi + ;; + esac + + AC_VALIDIFY_CXXFLAGS + + AC_PROG_CXXCPP + + if test "$GCC" = yes; then + NOOPT_CXXFLAGS=-O0 + NOOPT_CFLAGS=-O0 + fi + + AC_SUBST(NOOPT_CXXFLAGS) + AC_SUBST(NOOPT_CFLAGS) + + KDE_CHECK_FINAL + + ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) +]) + +AC_DEFUN(KDE_ADD_DEPENDENCIES, +[ + [A]M_DEPENDENCIES(CC) + [A]M_DEPENDENCIES(CXX) +]) + +dnl just a wrapper to clean up configure.in +AC_DEFUN(KDE_PROG_LIBTOOL, +[ +AC_REQUIRE([AC_CHECK_COMPILERS]) +AC_REQUIRE([AC_ENABLE_SHARED]) +AC_REQUIRE([AC_ENABLE_STATIC]) + +AC_REQUIRE([AC_LIBTOOL_DLOPEN]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_LANG_SAVE +AC_LANG_C +AC_OBJEXT +AC_EXEEXT +AC_LANG_RESTORE + +AM_PROG_LIBTOOL +AC_LIBTOOL_CXX + +LIBTOOL_SHELL="/bin/sh ./libtool" +# LIBTOOL="$LIBTOOL --silent" +KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" +AC_SUBST(KDE_PLUGIN) + +AC_ARG_ENABLE(objprelink, [ --enable-objprelink prelink apps using objprelink (obsolete)], + kde_use_objprelink=$enableval, kde_use_objprelink=no) + if test "x$kde_use_objprelink" = "xyes"; then + AC_MSG_WARN([ +------------------------------------------------------------ +Configuration option --enable-objprelink is no longer useful. +See http:://objprelink.sourceforge.net for details: +1- Recent binutils are fast enough to do without objprelink. +2- Newer versions of objprelink do not need this option. +------------------------------------------------------------ +]) + fi +]) + +AC_DEFUN(KDE_CHECK_LIB64, +[ + kdelibsuff=none + AC_ARG_ENABLE(libsuffix, + AC_HELP_STRING([--enable-libsuffix], + [/lib directory suffix (64,32,none)]), + kdelibsuff=$enableval) + if test "$kdelibsuff" = "none"; then + if test -d /lib64 ; then + kdelibsuff=64 + else + kdelibsuff= + fi + fi + if test -z "$kdelibsuff"; then + AC_MSG_RESULT([not using lib directory suffix]) + AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) + else + if test "$libdir" = '${exec_prefix}/lib'; then + libdir="$libdir${kdelibsuff}" + AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms + fi + AC_DEFINE_UNQUOTED(KDELIBSUFF, ["\"${kdelibsuff}\""], Suffix for lib directories) + AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) + fi +]) + +AC_DEFUN(KDE_CHECK_TYPES, +[ AC_CHECK_SIZEOF(int, 4)dnl + AC_CHECK_SIZEOF(long, 4)dnl + AC_CHECK_SIZEOF(char *, 4)dnl + AC_CHECK_SIZEOF(char, 1)dnl +])dnl + +AC_DEFUN(KDE_DO_IT_ALL, +[ +AC_CANONICAL_SYSTEM +AC_ARG_PROGRAM +AM_INIT_AUTOMAKE($1, $2) +AM_DISABLE_LIBRARIES +AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) +AC_CHECK_COMPILERS +KDE_PROG_LIBTOOL +AM_KDE_WITH_NLS +AC_PATH_KDE +]) + +AC_DEFUN(AC_CHECK_RPATH, +[ +AC_MSG_CHECKING(for rpath) +AC_ARG_ENABLE(rpath, + [ --disable-rpath do not use the rpath feature of ld], + USE_RPATH=$enableval, USE_RPATH=yes) + +if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then + + KDE_RPATH="-R \$(kde_libraries)" + + if test -n "$qt_libraries"; then + KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" + fi + dnl $x_libraries is set to /usr/lib in case + if test -n "$X_LDFLAGS"; then + KDE_RPATH="$KDE_RPATH -R \$(x_libraries)" + fi + if test -n "$KDE_EXTRA_RPATH"; then + KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" + fi +fi +AC_SUBST(KDE_EXTRA_RPATH) +AC_SUBST(KDE_RPATH) +AC_MSG_RESULT($USE_RPATH) +]) + +dnl Check for the type of the third argument of getsockname +AC_DEFUN(AC_CHECK_SOCKLEN_T, [ + AC_MSG_CHECKING(for socklen_t) + AC_CACHE_VAL(ac_cv_socklen_t, [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ +#include +#include + ],[ +socklen_t a=0; +getsockname(0,(struct sockaddr*)0, &a); + ], + ac_cv_socklen_t=socklen_t, + AC_TRY_COMPILE([ +#include +#include + ],[ +int a=0; +getsockname(0,(struct sockaddr*)0, &a); + ], + ac_cv_socklen_t=int, + ac_cv_socklen_t=size_t + ) + ) + AC_LANG_RESTORE + ]) + + AC_MSG_RESULT($ac_cv_socklen_t) + if test "$ac_cv_socklen_t" != "socklen_t"; then + AC_DEFINE_UNQUOTED(socklen_t, $ac_cv_socklen_t, + [Define the real type of socklen_t]) + fi + AC_DEFINE_UNQUOTED(ksize_t, socklen_t, [Compatibility define]) + +]) + +dnl This is a merge of some macros out of the gettext aclocal.m4 +dnl since we don't need anything, I took the things we need +dnl the copyright for them is: +dnl > +dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +dnl This Makefile.in is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. +dnl > +dnl for this file it is relicensed under LGPL + +AC_DEFUN(AM_KDE_WITH_NLS, + [ + dnl If we use NLS figure out what method + + AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, + [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then + AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + MSGFMT=$GMSGFMT + AC_SUBST(GMSGFMT) + AC_SUBST(MSGFMT) + + AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext programs is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + AC_SUBST(XGETTEXT) + + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. + +# serial 1 +# Stephan Kulow: I appended a _KDE against name conflicts + +dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN(AM_PATH_PROG_WITH_TEST_KDE, +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. + +# serial 1 + +AC_DEFUN(AM_LC_MESSAGES, + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) + fi + fi]) + +dnl From Jim Meyering. +dnl FIXME: migrate into libit. + +AC_DEFUN([AM_FUNC_OBSTACK], +[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, + [AC_TRY_LINK([#include "obstack.h"], + [struct obstack *mem;obstack_free(mem,(char *) 0)], + am_cv_func_obstack=yes, + am_cv_func_obstack=no)]) + if test $am_cv_func_obstack = yes; then + AC_DEFINE(HAVE_OBSTACK) + else + LIBOBJS="$LIBOBJS obstack.o" + fi +]) + +dnl From Jim Meyering. Use this if you use the GNU error.[ch]. +dnl FIXME: Migrate into libit + +AC_DEFUN([AM_FUNC_ERROR_AT_LINE], +[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, + [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], + am_cv_lib_error_at_line=yes, + am_cv_lib_error_at_line=no)]) + if test $am_cv_lib_error_at_line = no; then + LIBOBJS="$LIBOBJS error.o" + fi + AC_SUBST(LIBOBJS)dnl +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. + +# serial 1 +# Stephan Kulow: I put a KDE in it to avoid name conflicts + +AC_DEFUN(AM_KDE_GNU_GETTEXT, + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([AM_KDE_WITH_NLS])dnl + AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ +__argz_count __argz_stringify __argz_next]) + + AC_MSG_CHECKING(for stpcpy) + AC_CACHE_VAL(kde_cv_func_stpcpy, + [ + kde_safe_cxxflags=$CXXFLAGS + CXXFLAGS="-Wmissing-prototypes -Werror" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + #include + ], + [ + char buffer[200]; + stpcpy(buffer, buffer); + ], + kde_cv_func_stpcpy=yes, + kde_cv_func_stpcpy=no) + AC_LANG_RESTORE + CXXFLAGS=$kde_safe_cxxflags + ]) + AC_MSG_RESULT($kde_cv_func_stpcpy) + if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then + AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) + fi + + AM_LC_MESSAGES + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + ]) + +AC_DEFUN(AC_HAVE_XPM, + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= + test -z "$XPM_INCLUDE" && XPM_INCLUDE= + + AC_ARG_WITH(xpm, [ --without-xpm disable color pixmap XPM tests], + xpm_test=$withval, xpm_test="yes") + if test "x$xpm_test" = xno; then + ac_cv_have_xpm=no + else + AC_MSG_CHECKING(for XPM) + AC_CACHE_VAL(ac_cv_have_xpm, + [ + AC_LANG_C + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + if test "x$kde_use_qt_emb" != "xyes"; then + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" + else + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" + fi + CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" + test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" + AC_TRY_LINK([#include ],[], + ac_cv_have_xpm="yes",ac_cv_have_xpm="no") + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + ])dnl + + if test "$ac_cv_have_xpm" = no; then + AC_MSG_RESULT(no) + XPM_LDFLAGS="" + XPMINC="" + $2 + else + AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) + if test "$XPM_LDFLAGS" = ""; then + XPMLIB='-lXpm $(LIB_X11)' + else + XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' + fi + if test "$XPM_INCLUDE" = ""; then + XPMINC="" + else + XPMINC="-I$XPM_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(XPMINC) + AC_SUBST(XPMLIB) +]) + +AC_DEFUN(AC_HAVE_DPMS, + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= + test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= + DPMS_LIB= + + AC_ARG_WITH(dpms, [ --without-dpms disable DPMS power saving], + dpms_test=$withval, dpms_test="yes") + if test "x$dpms_test" = xno; then + ac_cv_have_dpms=no + else + AC_MSG_CHECKING(for DPMS) + dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. + dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". + AC_CACHE_VAL(ac_cv_have_dpms, + [ + if test "x$kde_use_qt_emb" = "xyes"; then + AC_MSG_RESULT(no) + ac_cv_have_dpms="no" + else + AC_LANG_C + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + ac_save_libs="$LIBS" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries -lX11 -lXext $LIBSOCKET" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + ac_cv_have_dpms="yes", [ + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries -lX11 -lXext $LIBSOCKET" + LIBS="$LIBS -lXdpms" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + [ + ac_cv_have_dpms="-lXdpms" + ],ac_cv_have_dpms="no") + ]) + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LIBS="$ac_save_libs" + fi + ])dnl + + if test "$ac_cv_have_dpms" = no; then + AC_MSG_RESULT(no) + DPMS_LDFLAGS="" + DPMSINC="" + $2 + else + AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) + if test "$ac_cv_have_dpms" = "-lXdpms"; then + DPMS_LIB="-lXdpms" + fi + if test "$DPMS_LDFLAGS" = ""; then + DPMSLIB="$DPMS_LIB "'$(LIB_X11)' + else + DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' + fi + if test "$DPMS_INCLUDE" = ""; then + DPMSINC="" + else + DPMSINC="-I$DPMS_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(DPMSINC) + AC_SUBST(DPMSLIB) +]) + +AC_DEFUN(AC_HAVE_GL, + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$GL_LDFLAGS" && GL_LDFLAGS= + test -z "$GL_INCLUDE" && GL_INCLUDE= + + AC_ARG_WITH(gl, [ --without-gl disable 3D GL modes], + gl_test=$withval, gl_test="yes") + if test "x$kde_use_qt_emb" = "xyes"; then + # GL and Qt Embedded is a no-go for now. + ac_cv_have_gl=no + elif test "x$gl_test" = xno; then + ac_cv_have_gl=no + else + AC_MSG_CHECKING(for GL) + AC_CACHE_VAL(ac_cv_have_gl, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_ldflags="$LDFLAGS" + ac_save_cxxflags="$CXXFLAGS" + LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries -lMesaGL -lMesaGLU" + test "x$kde_use_qt_emb" != xyes && LDFLAGS="$LDFLAGS -lX11" + LDFLAGS="$LDFLAGS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$CFLAGS $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="mesa", ac_cv_have_gl="no") + if test "x$ac_cv_have_gl" = "xno"; then + LDFLAGS="$ac_save_ldflags $X_LDFLAGS $GL_LDFLAGS $all_libraries -lGLU -lGL" + test "x$kde_use_qt_emb" != xyes && LDFLAGS="$LDFLAGS -lX11" + LDFLAGS="$LDFLAGS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$ac_save_cflags $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="yes", ac_cv_have_gl="no") + fi + AC_LANG_RESTORE + LDFLAGS="$ac_save_ldflags" + CXXFLAGS="$ac_save_cxxflags" + ])dnl + + if test "$ac_cv_have_gl" = "no"; then + AC_MSG_RESULT(no) + GL_LDFLAGS="" + GLINC="" + $2 + else + AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) + if test "$GL_LDFLAGS" = ""; then + if test "$ac_cv_have_gl" = "mesa"; then + GLLIB='-lMesaGLU -lMesaGL $(LIB_X11)' + else + GLLIB='-lGLU -lGL $(LIB_X11)' + fi + else + if test "$ac_cv_have_gl" = "mesa"; then + GLLIB="$GL_LDFLAGS -lMesaGLU -lMesaGL "'$(LIB_X11)' + else + GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' + fi + fi + if test "$GL_INCLUDE" = ""; then + GLINC="" + else + GLINC="-I$GL_INCLUDE" + fi + AC_MSG_RESULT($ac_cv_have_gl) + $1 + fi + fi + AC_SUBST(GLINC) + AC_SUBST(GLLIB) +]) + + + dnl shadow password and PAM magic - maintained by ossi@kde.org + +AC_DEFUN(KDE_PAM, [ + AC_REQUIRE([KDE_CHECK_LIBDL]) + + AC_ARG_WITH(pam, + [ --with-pam[=ARG] enable support for PAM: ARG=[yes|no|service name]], + [ if test "x$withval" = "xyes"; then + use_pam=yes + pam_service=kde + elif test "x$withval" = "xno"; then + use_pam=no + else + use_pam=yes + pam_service=$withval + fi + ac_cv_path_pam="use_pam=$use_pam pam_service=$pam_service" + ], [ + AC_CACHE_VAL(ac_cv_path_pam, + [ use_pam=no + AC_CHECK_LIB(pam, pam_start, + [ AC_CHECK_HEADER(security/pam_appl.h, + [ use_pam=yes + pam_service=kde ]) + ], , $LIBDL) + ac_cv_path_pam="use_pam=$use_pam pam_service=$pam_service" + ]) + ]) + eval "$ac_cv_path_pam" + + AC_MSG_CHECKING(for PAM) + if test "x$use_pam" = xno; then + AC_MSG_RESULT(no) + PAMLIBS="" + else + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) + PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" + + dnl test whether struct pam_message is const (Linux) or not (Sun) + AC_MSG_CHECKING(for const pam_message) + AC_EGREP_HEADER([struct pam_message], security/pam_appl.h, + [ AC_EGREP_HEADER([const struct pam_message], security/pam_appl.h, + [AC_MSG_RESULT([const: Linux-type PAM])], + [AC_MSG_RESULT([nonconst: Sun-type PAM]) + AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] + )], + [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) + fi + + AC_SUBST(PAMLIBS) +]) + +dnl DEF_PAM_SERVICE(arg name, full name, define name) +AC_DEFUN(DEF_PAM_SERVICE, [ + AC_ARG_WITH($1-pam, + [ --with-$1-pam=[val] override PAM service from --with-pam for $2], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$withval" + else + AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. +You may want to enforce it by using --with-pam.]) + fi + ], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$pam_service" + fi + ]) + if test -n "$$3_PAM_SERVICE"; then + AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) + AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) + fi + AC_SUBST($3_PAM_SERVICE) +]) + +AC_DEFUN(KDE_SHADOWPASSWD, [ + AC_REQUIRE([KDE_PAM]) + + AC_CHECK_LIB(shadow, getspent, + [ LIBSHADOW="-lshadow" + ac_use_shadow=yes + ], + [ dnl for UnixWare + AC_CHECK_LIB(gen, getspent, + [ LIBGEN="-lgen" + ac_use_shadow=yes + ], + [ AC_CHECK_FUNC(getspent, + [ ac_use_shadow=yes ], + [ ac_use_shadow=no ]) + ]) + ]) + AC_SUBST(LIBSHADOW) + AC_SUBST(LIBGEN) + + AC_MSG_CHECKING([for shadow passwords]) + + AC_ARG_WITH(shadow, + [ --with-shadow If you want shadow password support ], + [ if test "x$withval" != "xno"; then + use_shadow=yes + else + use_shadow=no + fi + ], [ + use_shadow="$ac_use_shadow" + ]) + + if test "x$use_shadow" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) + else + AC_MSG_RESULT(no) + LIBSHADOW= + LIBGEN= + fi + + dnl finally make the relevant binaries setuid root, if we have shadow passwds. + dnl this still applies, if we could use it indirectly through pam. + if test "x$use_shadow" = xyes || + ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then + case $host in + *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) + SETUIDFLAGS="-m 4755 -o root";; + *) + SETUIDFLAGS="-m 4755";; + esac + fi + AC_SUBST(SETUIDFLAGS) + +]) + +AC_DEFUN(KDE_PASSWDLIBS, [ + AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT + AC_REQUIRE([KDE_PAM]) + AC_REQUIRE([KDE_SHADOWPASSWD]) + + if test "x$use_pam" = "xyes"; then + PASSWDLIBS="$PAMLIBS" + else + PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" + fi + + dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but + dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires + dnl root to read, so kcheckpass needs to be root (even when using pam, since pam + dnl may need to read /etc/master.passwd). + case $host in + *-*-freebsd*) + SETUIDFLAGS="-m 4755 -o root" + ;; + *) + ;; + esac + + AC_SUBST(PASSWDLIBS) +]) + +AC_DEFUN(KDE_CHECK_LIBDL, +[ +AC_CHECK_LIB(dl, dlopen, [ +LIBDL="-ldl" +ac_cv_have_dlfcn=yes +]) + +AC_CHECK_LIB(dld, shl_unload, [ +LIBDL="-ldld" +ac_cv_have_shload=yes +]) + +AC_SUBST(LIBDL) +]) + +AC_DEFUN(KDE_CHECK_DLOPEN, +[ +KDE_CHECK_LIBDL +AC_CHECK_HEADERS(dlfcn.h dl.h) +if test "$ac_cv_header_dlfcn_h" = "no"; then + ac_cv_have_dlfcn=no +fi + +if test "$ac_cv_header_dl_h" = "no"; then + ac_cv_have_shload=no +fi + +dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE +dnl (MM) +AC_ARG_ENABLE(dlopen, +[ --disable-dlopen link statically [default=no]] , +enable_dlopen=$enableval, +enable_dlopen=yes) + +# override the user's opinion, if we know it better ;) +if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then + enable_dlopen=no +fi + +if test "$ac_cv_have_dlfcn" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) +fi + +if test "$ac_cv_have_shload" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) +fi + +if test "$enable_dlopen" = no ; then + test -n "$1" && eval $1 +else + test -n "$2" && eval $2 +fi + +]) + +AC_DEFUN(KDE_CHECK_DYNAMIC_LOADING, +[ +KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) +KDE_PROG_LIBTOOL +AC_MSG_CHECKING([dynamic loading]) +eval "`egrep '^build_libtool_libs=' libtool`" +if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then + dynamic_loading=yes + AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) +else + dynamic_loading=no +fi +AC_MSG_RESULT($dynamic_loading) +if test "$dynamic_loading" = "yes"; then + $1 +else + $2 +fi +]) + +AC_DEFUN(KDE_ADD_INCLUDES, +[ +if test -z "$1"; then + test_include="Pix.h" +else + test_include="$1" +fi + +AC_MSG_CHECKING([for libg++ ($test_include)]) + +AC_CACHE_VAL(kde_cv_libgpp_includes, +[ +kde_cv_libgpp_includes=no + + for ac_dir in \ + \ + /usr/include/g++ \ + /usr/include \ + /usr/unsupported/include \ + /opt/include \ + $extra_include \ + ; \ + do + if test -r "$ac_dir/$test_include"; then + kde_cv_libgpp_includes=$ac_dir + break + fi + done +]) + +AC_MSG_RESULT($kde_cv_libgpp_includes) +if test "$kde_cv_libgpp_includes" != "no"; then + all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" +fi +]) +]) + + +AC_DEFUN(KDE_CHECK_MICO, +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_MISC_TESTS]) +AC_MSG_CHECKING(for MICO) + +if test -z "$MICODIR"; then + kde_micodir=/usr/local + else + kde_micodir="$MICODIR" +fi + +AC_ARG_WITH(micodir, + [ --with-micodir=micodir where mico is installed ], + kde_micodir=$withval, + kde_micodir=$kde_micodir +) + +AC_CACHE_VAL(kde_cv_mico_incdir, +[ + mico_incdirs="$kde_micodir/include /usr/include /usr/local/include /usr/local/include /opt/local/include $kde_extra_includes" +AC_FIND_FILE(CORBA.h, $mico_incdirs, kde_cv_mico_incdir) + +]) +kde_micodir=`echo $kde_cv_mico_incdir | sed -e 's#/include##'` + +if test ! -r $kde_micodir/include/CORBA.h; then + AC_MSG_ERROR([No CORBA.h found, specify another micodir]) +fi + +AC_MSG_RESULT($kde_micodir) + +MICO_INCLUDES=-I$kde_micodir/include +AC_SUBST(MICO_INCLUDES) +MICO_LDFLAGS=-L$kde_micodir/lib +AC_SUBST(MICO_LDFLAGS) +micodir=$kde_micodir +AC_SUBST(micodir) + +AC_MSG_CHECKING([for MICO version]) +AC_CACHE_VAL(kde_cv_mico_version, +[ +AC_LANG_C +cat >conftest.$ac_ext < +#include +int main() { + + printf("MICO_VERSION=%s\n",MICO_VERSION); + return (0); +} +EOF +ac_compile='${CC-gcc} $CFLAGS $MICO_INCLUDES conftest.$ac_ext -o conftest' +if AC_TRY_EVAL(ac_compile); then + if eval `./conftest 2>&5`; then + kde_cv_mico_version=$MICO_VERSION + else + AC_MSG_ERROR([your system is not able to execute a small application to + find MICO version! Check $kde_micodir/include/mico/version.h]) + fi +else + AC_MSG_ERROR([your system is not able to compile a small application to + find MICO version! Check $kde_micodir/include/mico/version.h]) +fi +]) + +dnl installed MICO version +mico_v_maj=`echo $kde_cv_mico_version | sed -e 's/^\(.*\)\..*\..*$/\1/'` +mico_v_mid=`echo $kde_cv_mico_version | sed -e 's/^.*\.\(.*\)\..*$/\1/'` +mico_v_min=`echo $kde_cv_mico_version | sed -e 's/^.*\..*\.\(.*\)$/\1/'` + +if test "x$1" = "x"; then + req_version="2.3.0" +else + req_version=$1 +fi + +dnl required MICO version +req_v_maj=`echo $req_version | sed -e 's/^\(.*\)\..*\..*$/\1/'` +req_v_mid=`echo $req_version | sed -e 's/^.*\.\(.*\)\..*$/\1/'` +req_v_min=`echo $req_version | sed -e 's/^.*\..*\.\(.*\)$/\1/'` + +if test "$mico_v_maj" -lt "$req_v_maj" || \ + ( test "$mico_v_maj" -eq "$req_v_maj" && \ + test "$mico_v_mid" -lt "$req_v_mid" ) || \ + ( test "$mico_v_mid" -eq "$req_v_mid" && \ + test "$mico_v_min" -lt "$req_v_min" ) + +then + AC_MSG_ERROR([found MICO version $kde_cv_mico_version but version $req_version \ +at least is required. You should upgrade MICO.]) +else + AC_MSG_RESULT([$kde_cv_mico_version (minimum version $req_version, ok)]) +fi + +LIBMICO="-lmico$kde_cv_mico_version $LIBCRYPT $LIBSOCKET $LIBDL" +AC_SUBST(LIBMICO) +if test -z "$IDL"; then + IDL='$(kde_bindir)/cuteidl' +fi +AC_SUBST(IDL) +IDL_DEPENDENCIES='$(kde_includes)/CUTE.h' +AC_SUBST(IDL_DEPENDENCIES) + +idldir="\$(includedir)/idl" +AC_SUBST(idldir) + +]) + +AC_DEFUN(KDE_CHECK_MINI_STL, +[ +AC_REQUIRE([KDE_CHECK_MICO]) + +AC_MSG_CHECKING(if we use mico's mini-STL) +AC_CACHE_VAL(kde_cv_have_mini_stl, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_cxxflags="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $MICO_INCLUDES" +AC_TRY_COMPILE( +[ +#include +], +[ +#ifdef HAVE_MINI_STL +#error "nothing" +#endif +], +kde_cv_have_mini_stl=no, +kde_cv_have_mini_stl=yes) +CXXFLAGS="$kde_save_cxxflags" +AC_LANG_RESTORE +]) + +if test "x$kde_cv_have_mini_stl" = "xyes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +]) + + +AC_DEFUN(KDE_CHECK_LIBPTHREAD, +[ +AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"] ) +AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN(KDE_CHECK_PTHREAD_OPTION, +[ + AC_ARG_ENABLE(kernel-threads, [ --enable-kernel-threads Enable the use of the LinuxThreads port on FreeBSD/i386 only.], + kde_use_kernthreads=$enableval, kde_use_kernthreads=no) + + if test "$kde_use_kernthreads" = "yes"; then + ac_save_CXXFLAGS="$CXXFLAGS" + ac_save_CFLAGS="$CFLAGS" + CXXFLAGS="-I/usr/local/include/pthread/linuxthreads $CXXFLAGS" + CFLAGS="-I/usr/local/include/pthread/linuxthreads $CFLAGS" + AC_CHECK_HEADERS(pthread/linuxthreads/pthread.h) + CXXFLAGS="$ac_save_CXXFLAGS" + CFLAGS="$ac_save_CFLAGS" + if test "$ac_cv_header_pthread_linuxthreads_pthread_h" = "no"; then + kde_use_kernthreads=no + else + dnl Add proper -I and -l statements + AC_CHECK_LIB(lthread, pthread_join, [LIBPTHREAD="-llthread -llgcc_r"]) dnl for FreeBSD + if test "x$LIBPTHREAD" = "x"; then + kde_use_kernthreads=no + else + USE_THREADS="-D_THREAD_SAFE -I/usr/local/include/pthread/linuxthreads" + fi + fi + else + USE_THREADS="" + if test -z "$LIBPTHREAD"; then + KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-pthread"] ) + fi + fi + + AH_VERBATIM(__svr_define, [ +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif +]) + case $host_os in + solaris*) + KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) + CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" + ;; + freebsd*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + ;; + aix*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + LIBPTHREAD="$LIBPTHREAD -lc_r" + ;; + linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" + if test "$CXX" = "KCC"; then + CXXFLAGS="$CXXFLAGS --thread_safe" + NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" + fi + ;; + *) + ;; + esac + AC_SUBST(USE_THREADS) + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN(KDE_CHECK_THREADING, +[ + AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) + AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) + dnl default is yes if libpthread is found and no if no libpthread is available + if test -z "$LIBPTHREAD"; then + if test -z "$USE_THREADS"; then + kde_check_threading_default=no + else + kde_check_threading_default=yes + fi + else + kde_check_threading_default=yes + fi + AC_ARG_ENABLE(threading, [ --disable-threading disables threading even if libpthread found ], + kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) + if test "x$kde_use_threading" = "xyes"; then + AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) + fi +]) + +AC_DEFUN(KDE_TRY_LINK_PYTHON, +[ +if test "$kde_python_link_found" = no; then + +if test "$1" = normal; then + AC_MSG_CHECKING(if a Python application links) +else + AC_MSG_CHECKING(if Python depends on $2) +fi + +AC_CACHE_VAL(kde_cv_try_link_python_$1, +[ +AC_LANG_SAVE +AC_LANG_C +kde_save_cflags="$CFLAGS" +CFLAGS="$CFLAGS $PYTHONINC" +kde_save_libs="$LIBS" +LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" +kde_save_ldflags="$LDFLAGS" +LDFLAGS="$LDFLAGS $PYTHONLIB" + +AC_TRY_LINK( +[ +#include +],[ + PySys_SetArgv(1, 0); +], + [kde_cv_try_link_python_$1=yes], + [kde_cv_try_link_python_$1=no] +) +CFLAGS="$kde_save_cflags" +LIBS="$kde_save_libs" +LDFLAGS="$kde_save_ldflags" +]) + +if test "$kde_cv_try_link_python_$1" = "yes"; then + AC_MSG_RESULT(yes) + kde_python_link_found=yes + if test ! "$1" = normal; then + LIBPYTHON="$LIBPYTHON $2" + fi + $3 +else + AC_MSG_RESULT(no) + $4 +fi +AC_LANG_RESTORE + +fi + +]) + +AC_DEFUN(KDE_CHECK_PYTHON_DIR, +[ +AC_MSG_CHECKING([for Python directory]) + +AC_CACHE_VAL(kde_cv_pythondir, +[ + if test -z "$PYTHONDIR"; then + kde_cv_pythondir=/usr/local + else + kde_cv_pythondir="$PYTHONDIR" + fi +]) + +AC_ARG_WITH(pythondir, +[ --with-pythondir=pythondir use python installed in pythondir ], +[ + ac_python_dir=$withval +], ac_python_dir=$kde_cv_pythondir +) + +AC_MSG_RESULT($ac_python_dir) +]) + +AC_DEFUN(KDE_CHECK_PYTHON_INTERN, +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) +AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) + +if test -z "$1"; then + version="1.5" +else + version="$1" +fi + +AC_MSG_CHECKING([for Python$version]) + +python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" +AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) +if test ! -r $python_incdir/Python.h; then + AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) + python_incdir=$python_incdir/python$version + if test ! -r $python_incdir/Python.h; then + python_incdir=no + fi +fi + +PYTHONINC=-I$python_incdir + +python_libdirs="$ac_python_dir/lib /usr/lib /usr/local /usr/lib $kde_extra_libs" +AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) +if test ! -r $python_libdir/libpython$version.a; then + AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) + python_libdir=$python_libdir/python$version/config + if test ! -r $python_libdir/libpython$version.a; then + python_libdir=no + fi +fi + +PYTHONLIB=-L$python_libdir +kde_orig_LIBPYTHON=$LIBPYTHON +if test -z "$LIBPYTHON"; then + LIBPYTHON=-lpython$version +fi + +python_libdirs="$ac_python_dir/lib /usr/lib /usr/local /usr/lib $kde_extra_libs" +AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) +python_moddir=$python_moddir/python$version +if test ! -r $python_moddir/copy.py; then + python_moddir=no +fi + +PYTHONMODDIR=$python_moddir + +AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) + +if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then + LIBPYTHON=$kde_orig_LIBPYTHON + test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" + test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" + $2 +else + dnl Note: this test is very weak + kde_python_link_found=no + KDE_TRY_LINK_PYTHON(normal) + KDE_TRY_LINK_PYTHON(m, -lm) + KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) + KDE_TRY_LINK_PYTHON(tcl, -ltcl) + KDE_TRY_LINK_PYTHON(db2, -ldb2) + KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], + [AC_MSG_WARN([it seems, Python depends on another library. + Pleae set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this + and contact the authors to let them know about this problem]) + ]) + + LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" + AC_SUBST(PYTHONINC) + AC_SUBST(PYTHONLIB) + AC_SUBST(LIBPYTHON) + AC_SUBST(PYTHONMODDIR) + AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) +fi + +]) + + +AC_DEFUN(KDE_CHECK_PYTHON, +[ + KDE_CHECK_PYTHON_INTERN("2.2", + [KDE_CHECK_PYTHON_INTERN("2.1", + [KDE_CHECK_PYTHON_INTERN("2.0", [ KDE_CHECK_PYTHON_INTERN($1, $2) ]) + ])]) +]) + +AC_DEFUN(KDE_CHECK_STL_SGI, +[ + AC_MSG_CHECKING([if STL implementation is SGI like]) + AC_CACHE_VAL(kde_cv_stl_type_sgi, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hallo Welt."; + astring.erase(0, 6); // now astring is "Welt" + return 0; +], kde_cv_stl_type_sgi=yes, + kde_cv_stl_type_sgi=no) +]) + + AC_MSG_RESULT($kde_cv_stl_type_sgi) + + if test "$kde_cv_stl_type_sgi" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) + fi +]) + +AC_DEFUN(KDE_CHECK_STL_HP, +[ + AC_MSG_CHECKING([if STL implementation is HP like]) + AC_CACHE_VAL(kde_cv_stl_type_hp, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hello World"; + astring.remove(0, 6); // now astring is "World" + return 0; +], kde_cv_stl_type_hp=yes, + kde_cv_stl_type_hp=no) +]) + AC_MSG_RESULT($kde_cv_stl_type_hp) + + if test "$kde_cv_stl_type_hp" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_HP_STL, 1, [Define if you have a STL implementation by HP]) + fi +]) + +AC_DEFUN(KDE_CHECK_STL, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" + KDE_CHECK_STL_SGI + + if test "$kde_cv_stl_type_sgi" = "no"; then + KDE_CHECK_STL_HP + + if test "$kde_cv_stl_type_hp" = "no"; then + AC_MSG_ERROR("no known STL type found - did you forget to install libstdc++[-devel] ?") + fi + fi + + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE +]) + +AC_DEFUN(AC_FIND_QIMGIO, + [AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for qimgio]) +AC_CACHE_VAL(ac_cv_lib_qimgio, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +ac_save_CXXFLAGS="$CXXFLAGS" +LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +AC_TRY_RUN(dnl +[ +#include +#include +int main() { + QString t = "hallo"; + t.fill('t'); + qInitImageIO(); +} +], + ac_cv_lib_qimgio=yes, + ac_cv_lib_qimgio=no, + ac_cv_lib_qimgio=no) +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then + LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) + AC_SUBST(LIBQIMGIO) +else + AC_MSG_RESULT(not found) +fi +]) + +AC_DEFUN(KDE_CHECK_ANSI, +[ +]) + +AC_DEFUN(KDE_CHECK_INSURE, +[ + AC_ARG_ENABLE(insure, [ --enable-insure use insure++ for debugging [default=no]], + [ + if test $enableval = "no"; dnl + then ac_use_insure="no" + else ac_use_insure="yes" + fi + ], [ac_use_insure="no"]) + + AC_MSG_CHECKING(if we will use Insure++ to debug) + AC_MSG_RESULT($ac_use_insure) + if test "$ac_use_insure" = "yes"; dnl + then CC="insure"; CXX="insure"; dnl CFLAGS="$CLAGS -fno-rtti -fno-exceptions "???? + fi +]) + +AC_DEFUN(AM_DISABLE_LIBRARIES, +[ + AC_PROVIDE([AM_ENABLE_STATIC]) + AC_PROVIDE([AM_ENABLE_SHARED]) + enable_static=no + enable_shared=yes +]) + + +AC_DEFUN(AC_CHECK_UTMP_FILE, +[ + AC_MSG_CHECKING([for utmp file]) + + AC_CACHE_VAL(kde_cv_utmp_file, + [ + kde_cv_utmp_file=no + + for ac_file in \ + \ + /var/run/utmp \ + /var/adm/utmp \ + /etc/utmp \ + ; \ + do + if test -r "$ac_file"; then + kde_cv_utmp_file=$ac_file + break + fi + done + ]) + + if test "$kde_cv_utmp_file" != "no"; then + AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) + $1 + AC_MSG_RESULT($kde_cv_utmp_file) + else + $2 + AC_MSG_RESULT([non found]) + fi +]) + + +AC_DEFUN(KDE_CREATE_SUBDIRSLIST, +[ + +DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" + +if test ! -s $srcdir/subdirs; then + dnl Note: Makefile.common creates subdirs, so this is just a fallback + TOPSUBDIRS="" + files=`cd $srcdir && ls -1` + dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` + for i in $dirs; do + echo $i >> $srcdir/subdirs + done +fi + +if test -s $srcdir/inst-apps; then + ac_topsubdirs="`cat $srcdir/inst-apps`" +else + ac_topsubdirs="`cat $srcdir/subdirs`" +fi + +for i in $ac_topsubdirs; do + AC_MSG_CHECKING([if $i should be compiled]) + if test -d $srcdir/$i; then + install_it="yes" + for j in $DO_NOT_COMPILE; do + if test $i = $j; then + install_it="no" + fi + done + else + install_it="no" + fi + AC_MSG_RESULT($install_it) + vari=`echo $i | sed -e 's,[[-+.]],_,g'` + if test $install_it = "yes"; then + TOPSUBDIRS="$TOPSUBDIRS $i" + eval "$vari""_SUBDIR_included=yes" + else + eval "$vari""_SUBDIR_included=no" + fi +done + +AC_SUBST(TOPSUBDIRS) +]) + +AC_DEFUN(KDE_CHECK_NAMESPACES, +[ +AC_MSG_CHECKING(whether C++ compiler supports namespaces) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([ +], +[ +namespace Foo { + extern int i; + namespace Bar { + extern int i; + } +} + +int Foo::i = 0; +int Foo::Bar::i = 1; +],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NAMESPACES) +], [ +AC_MSG_RESULT(no) +]) +AC_LANG_RESTORE +]) + +AC_DEFUN(KDE_CHECK_NEWLIBS, +[ + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_CHECK_S_ISSOCK, +[ +AC_MSG_CHECKING(for S_ISSOCK) +AC_CACHE_VAL(ac_cv_have_s_issock, +[ +AC_LANG_SAVE +AC_LANG_C +AC_TRY_LINK( +[ +#include +], +[ +struct stat buff; +int b = S_ISSOCK( buff.st_mode ); +], +ac_cv_have_s_issock=yes, +ac_cv_have_s_issock=no) +AC_LANG_RESTORE +]) +AC_MSG_RESULT($ac_cv_have_s_issock) +if test "$ac_cv_have_s_issock" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) +fi + +AH_VERBATIM(_ISSOCK, +[ +#ifndef HAVE_S_ISSOCK +#define HAVE_S_ISSOCK +#define S_ISSOCK(mode) (1==0) +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_CHECK_KDEMAXPATHLEN, +[ +AC_MSG_CHECKING(for MAXPATHLEN) +AC_CACHE_VAL(ac_cv_maxpathlen, +[ +AC_LANG_C +cat > conftest.$ac_ext < +#endif +#include +#include +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +KDE_HELLO MAXPATHLEN + +EOF + +ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" + +if AC_TRY_EVAL(ac_try) && test -s conftest.out; then + ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` +else + ac_cv_maxpathlen=1024 +fi + +rm conftest.* + +]) +AC_MSG_RESULT($ac_cv_maxpathlen) +AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) +]) + +dnl ------------------------------------------------------------------------- +dnl See if the compiler supports a template repository bero@redhat.de +dnl ------------------------------------------------------------------------- +AC_DEFUN(KDE_COMPILER_REPO, +[ + REPO="" + NOREPO="" + + KDE_CHECK_COMPILER_FLAG(frepo, + [ + REPO="-frepo" + NOREPO="-fno-repo" + ]) + + if test -z "$REPO"; then + KDE_CHECK_COMPILER_FLAG(instances=explicit, + [ + REPO="-instances=explicit" + NOREPO="-instances=extern" + ]) + fi + + if test -n "$REPO"; then + AC_DEFINE_UNQUOTED(HAVE_TEMPLATE_REPOSITORY, 1, + [C++ compiler supports template repository]) + $1 + fi + + AC_SUBST(REPO) + AC_SUBST(NOREPO) +]) + +AC_DEFUN(KDE_CHECK_HEADER, +[ + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADER($1, $2, $3) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN(KDE_CHECK_HEADERS, +[ + AH_CHECK_HEADERS([$1]) + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN(KDE_FAST_CONFIGURE, +[ + dnl makes configure fast (needs perl) + AC_ARG_ENABLE(fast-perl, [ --disable-fast-perl disable fast Makefile generation (needs perl)], + with_fast_perl=$enableval, with_fast_perl=yes) +]) + +AC_DEFUN(KDE_CONF_FILES, +[ + val= + if test -f $srcdir/configure.files ; then + val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` + fi + CONF_FILES= + if test -n "$val" ; then + for i in $val ; do + CONF_FILES="$CONF_FILES $i" + done + fi + AC_SUBST(CONF_FILES) +])dnl + +AC_DEFUN(KDE_SET_PREFIX, +[ + unset CDPATH + dnl make $KDEDIR the default for the installation + AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) + + if test "x$prefix" = "xNONE"; then + prefix=$ac_default_prefix + ac_configure_args="$ac_configure_args --prefix=$prefix" + fi + # And delete superflous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + +pushdef([AC_PROG_INSTALL], +[ + dnl our own version, testing for a -p flag + popdef([AC_PROG_INSTALL]) + dnl as AC_PROG_INSTALL works as it works we first have + dnl to save if the user didn't specify INSTALL, as the + dnl autoconf one overwrites INSTALL and we have no chance to find + dnl out afterwards + test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL + test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM + test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT + AC_PROG_INSTALL + + if test -z "$kde_save_INSTALL_given" ; then + # OK, user hasn't given any INSTALL, autoconf found one for us + # now we test, if it supports the -p flag + AC_MSG_CHECKING(for -p flag to install) + rm -f confinst.$$.* > /dev/null 2>&1 + echo "Testtest" > confinst.$$.orig + ac_res=no + if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then + if test -f confinst.$$.new ; then + # OK, -p seems to do no harm to install + INSTALL="${INSTALL} -p" + ac_res=yes + fi + fi + rm -f confinst.$$.* + AC_MSG_RESULT($ac_res) + fi + dnl the following tries to resolve some signs and wonders coming up + dnl with different autoconf/automake versions + dnl e.g.: + dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s + dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) + dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s + dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has + dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the + dnl install-@DIR@PROGRAMS targets to explicitly use that flag + dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as + dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 + dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure + dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from + dnl automake (due to broken Makefile.am or whatever) to install programs, + dnl and so does not see the -s flag in automake > 1.4 + dnl to clean up that mess we: + dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG + dnl which cleans KDE's program with automake > 1.4; + dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems + dnl with automake<=1.4 + dnl note that dues to this sometimes two '-s' flags are used (if KDE + dnl properly uses install-@DIR@PROGRAMS, but I don't care + dnl + dnl And to all this comes, that I even can't write in comments variable + dnl names used by automake, because it is so stupid to think I wanted to + dnl _use_ them, therefor I have written A_M_... instead of AM_ + dnl hmm, I wanted to say something ... ahh yes: Arghhh. + + if test -z "$kde_save_INSTALL_PROGRAM_given" ; then + INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' + fi + if test -z "$kde_save_INSTALL_SCRIPT_given" ; then + INSTALL_SCRIPT='${INSTALL}' + fi +])dnl + +AC_DEFUN(KDE_LANG_CPLUSPLUS, +[AC_LANG_CPLUSPLUS +ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' +pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) +]) + +pushdef([AC_LANG_CPLUSPLUS], +[popdef([AC_LANG_CPLUSPLUS]) +KDE_LANG_CPLUSPLUS +]) + +AC_DEFUN(KDE_CHECK_LONG_LONG, +[ +AC_MSG_CHECKING(for long long) +AC_CACHE_VAL(kde_cv_c_long_long, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_LINK([], [ + long long foo = 0; + foo = foo+1; + ], + kde_cv_c_long_long=yes, kde_cv_c_long_long=no) + AC_LANG_RESTORE +]) +AC_MSG_RESULT($kde_cv_c_long_long) +if test "$kde_cv_c_long_long" = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) +fi +]) + +AC_DEFUN(KDE_CHECK_LIB, +[ + kde_save_LDFLAGS="$LDFLAGS" + dnl AC_CHECK_LIB modifies LIBS, so save it here + kde_save_LIBS="$LIBS" + LDFLAGS="$LDFLAGS $all_libraries" + case $host_os in + aix*) LDFLAGS="-brtl $LDFLAGS" + test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" + ;; + esac + AC_CHECK_LIB($1, $2, $3, $4, $5) + LDFLAGS="$kde_save_LDFLAGS" + LIBS="$kde_save_LIBS" +]) + +AC_DEFUN(KDE_JAVA_PREFIX, +[ + dir=`dirname "$1"` + base=`basename "$1"` + list=`ls -1 $dir 2> /dev/null` + for entry in $list; do + if test -d $dir/$entry/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/bin" + ;; + esac + elif test -d $dir/$entry/jre/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/jre/bin" + ;; + esac + fi + done +]) + +dnl KDE_CHEC_JAVA_DIR(onlyjre) +AC_DEFUN(KDE_CHECK_JAVA_DIR, +[ + +AC_ARG_WITH(java, +[ --with-java=javadir use java installed in javadir, --without-java disables ], +[ ac_java_dir=$withval +], ac_java_dir="" +) + +AC_MSG_CHECKING([for Java]) + +dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH +if test "x$ac_java_dir" = "xno"; then + kde_java_bindir=no + kde_java_includedir=no + kde_java_libjvmdir=no + kde_java_libhpidir=no +else + if test "x$ac_java_dir" = "x"; then + + + dnl No option set -> look in $PATH + KDE_JAVA_PREFIX(/usr/j2se) + KDE_JAVA_PREFIX(/usr/j*dk*) + KDE_JAVA_PREFIX(/usr/lib/j*dk*) + KDE_JAVA_PREFIX(/opt/j*sdk*) + KDE_JAVA_PREFIX(/usr/lib/java*) + KDE_JAVA_PREFIX(/usr/java*) + KDE_JAVA_PREFIX(/usr/lib/SunJava2*) + KDE_JAVA_PREFIX(/usr/lib/SunJava*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava*) + KDE_JAVA_PREFIX(/opt/java*) + + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + javadirs="$javadirs $dir" + done + IFS=$kde_save_IFS + jredirs= + + for dir in $javadirs; do + if test ! -d $dir; then break; fi + if test -x "$dir/java"; then + libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + if test ! -f $libjvmdir/libjvm.so; then continue; fi + jredirs="$jredirs $dir" + fi + done + + JAVAC= + JAVA= + kde_java_bindir=no + for dir in $jredirs; do + JAVA="$dir/java" + kde_java_bindir=$dir + if test -x "$dir/javac"; then + JAVAC="$dir/javac" + break + fi + done + + if test -n "$JAVAC"; then + dnl this substitution might not work - well, we test for jni.h below + kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` + else + kde_java_includedir=no + fi + else + dnl config option set + kde_java_bindir=$ac_java_dir/bin + if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then + kde_java_includedir=no + else + kde_java_includedir=$ac_java_dir/include + fi + fi +fi + +dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" +if test "x$kde_java_bindir" != "xno"; then + + dnl Look for libjvm.so + kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + dnl Look for libhpi.so and avoid green threads + kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` + + dnl Now check everything's fine under there + dnl the include dir is our flag for having the JDK + if test -d "$kde_java_includedir"; then + if test ! -x "$kde_java_bindir/javac"; then + AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) + fi + if test ! -x "$kde_java_bindir/javah"; then + AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -x "$kde_java_bindir/jar"; then + AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -r "$kde_java_includedir/jni.h"; then + AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) + fi + + jni_includes="-I$kde_java_includedir" + dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. + dnl and under linux here.. + test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" + test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" + test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" + + else + JAVAC= + jni_includes= + fi + + if test ! -r "$kde_java_libjvmdir/libjvm.so"; then + AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) + fi + + if test ! -x "$kde_java_bindir/java"; then + AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + + if test ! -r "$kde_java_libhpidir/libhpi.so"; then + AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) + fi + + if test -n "$jni_includes"; then + dnl Check for JNI version + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cxxflags_safe="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" + + AC_TRY_COMPILE([ + #include + ], + [ + #ifndef JNI_VERSION_1_2 + Syntax Error + #endif + ],[ kde_jni_works=yes ], + [ kde_jni_works=no ]) + + if test $kde_jni_works = no; then + AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. + You need to have Java Development Kit (JDK) version 1.2. + + Use --with-java to specify another location. + Use --without-java to configure without java support. + Or download a newer JDK and try again. + See e.g. http://java.sun.com/products/jdk/1.2 ]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + AC_LANG_RESTORE + + dnl All tests ok, inform and subst the variables + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" + AC_MSG_RESULT([java JDK in $kde_java_bindir]) + + else + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([java JRE in $kde_java_bindir]) + fi +else # no + AC_MSG_RESULT([none found]) +fi + +AC_SUBST(JAVAC) +AC_SUBST(JAVAH) +AC_SUBST(JAR) +AC_SUBST(JVMLIBS) +AC_SUBST(jni_includes) + +# for backward compat +kde_cv_java_includedir=$kde_java_includedir +kde_cv_java_bindir=$kde_java_bindir +]) + +dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. +dnl When the argument list becomes big, as in KDE for AC_OUTPUT in +dnl big packages, m4_foreach is dog-slow. So use our own version of +dnl it. (matz@kde.org) +m4_define([mm_foreach], +[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) +m4_define([mm_car], [[$1]]) +m4_define([mm_car2], [[$@]]) +m4_define([_mm_foreach], +[m4_if(m4_quote($2), [], [], + [m4_define([$1], [mm_car($2)])$3[]_mm_foreach([$1], + mm_car2(m4_shift($2)), + [$3])])]) +m4_define([AC_FOREACH], +[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) + +AC_DEFUN(KDE_NEED_FLEX, +[ +kde_libs_safe=$LIBS +LIBS="$LIBS $USER_LDFLAGS" +AM_PROG_LEX +LIBS=$kde_libs_safe +if test -z "$LEXLIB"; then + AC_MSG_ERROR([You need to have flex installed.]) +fi +AC_SUBST(LEXLIB) +]) + +AC_DEFUN(AC_PATH_QTOPIA, +[ + dnl TODO: use AC_CACHE_VAL + + if test -z "$1"; then + qtopia_minver_maj=1 + qtopia_minver_min=5 + qtopia_minver_pat=0 + else + qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` + qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` + qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` + fi + + qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" + qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" + + AC_REQUIRE([AC_PATH_QT]) + + AC_MSG_CHECKING([for Qtopia]) + + LIB_QTOPIA="-lqpe" + AC_SUBST(LIB_QTOPIA) + + kde_qtopia_dirs="$QPEDIR /opt/Qtopia" + + ac_qtopia_incdir=NO + + AC_ARG_WITH(qtopia-dir, + [ --with-qtopia-dir=DIR where the root of Qtopia is installed ], + [ ac_qtopia_incdir="$withval"/include] ) + + qtopia_incdirs="" + for dir in $kde_qtopia_dirs; do + qtopia_incdirs="$qtopia_incdirs $dir/include" + done + + if test ! "$ac_qtopia_incdir" = "NO"; then + qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" + fi + + qtopia_incdir="" + AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) + ac_qtopia_incdir="$qtopia_incdir" + + if test -z "$qtopia_incdir"; then + AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) + fi + + qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; + qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; + qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; + + qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" + qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" + if test "$qtopia_ver" -lt "$qtopia_minver"; then + AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr +is required.]) + fi + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + ac_cxxflags_safe="$CXXFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" + LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" + LIBS="$LIBS $LIB_QTOPIA $LIBQT" + + cat > conftest.$ac_ext < +#include + +int main( int argc, char **argv ) +{ + QPEApplication app( argc, argv ); + return 0; +} +EOF + + if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* + else + rm -f conftest* + AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at +the end of config.log]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + QTOPIA_INCLUDES="-I$qtopia_incdir" + AC_SUBST(QTOPIA_INCLUDES) + + AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) +]) + + +AC_DEFUN(KDE_INIT_DOXYGEN, +[ +AC_MSG_CHECKING([for Qt docs]) +kde_qtdir= +if test "${with_qt_dir+set}" = set; then + kde_qtdir="$with_qt_dir" +fi + +AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc], QTDOCDIR) +AC_MSG_RESULT($QTDOCDIR) + +AC_SUBST(QTDOCDIR) + +KDE_FIND_PATH(dot, DOT, [], []) +if test -n "$DOT"; then + KDE_HAVE_DOT="YES" +else + KDE_HAVE_DOT="NO" +fi +AC_SUBST(KDE_HAVE_DOT) +KDE_FIND_PATH(doxygen, DOXYGEN, [], []) +AC_SUBST(DOXYGEN) + +DOXYGEN_PROJECT_NAME="$1" +DOXYGEN_PROJECT_NUMBER="$2" +AC_SUBST(DOXYGEN_PROJECT_NAME) +AC_SUBST(DOXYGEN_PROJECT_NUMBER) + +KDE_HAS_DOXYGEN=no +if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then + KDE_HAS_DOXYGEN=yes +fi +AC_SUBST(KDE_HAS_DOXYGEN) + +]) + + +AC_DEFUN(AC_FIND_BZIP2, +[ +AC_MSG_CHECKING([for bzDecompress in libbz2]) +AC_CACHE_VAL(ac_cv_lib_bzip2, +[ +AC_LANG_C +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#define BZ_NO_STDIO +#include +], + [ bz_stream s; (void) bzDecompress(&s); ], + eval "ac_cv_lib_bzip2='-lbz2'", + eval "ac_cv_lib_bzip2=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +AC_MSG_RESULT($ac_cv_lib_bzip2) + +if test ! "$ac_cv_lib_bzip2" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2" + AC_SUBST(LIBBZ2) + +else + + cxx_shared_flags= + KDE_CHECK_COMPILER_FLAG(shared, [ + cxx_shared_flag="-shared" + ]) + + AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) + AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, + [ + AC_LANG_C + kde_save_LIBS="$LIBS" + LIBS="$all_libraries $USER_LDFLAGS $cxx_shared_flag -lbz2 $LIBSOCKET" + kde_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + + AC_TRY_LINK(dnl + [ + #define BZ_NO_STDIO + #include + ], + [ bz_stream s; (void) BZ2_bzDecompress(&s); ], + eval "ac_cv_lib_bzip2_prefix='-lbz2'", + eval "ac_cv_lib_bzip2_prefix=no") + LIBS="$kde_save_LIBS" + CFLAGS="$kde_save_CFLAGS" + ])dnl + + AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) + + + + if test ! "$ac_cv_lib_bzip2_prefix" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2_prefix" + AC_SUBST(LIBBZ2) + + AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) + dnl else, we just ignore this + fi + +fi +AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the SSL headers and libraries. +dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) +dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(KDE_CHECK_SSL, +[ +LIBSSL="-lssl -lcrypto" +AC_REQUIRE([KDE_CHECK_LIB64]) + +ac_ssl_includes=NO ac_ssl_libraries=NO +ssl_libraries="" +ssl_includes="" +AC_ARG_WITH(ssl-dir, + [ --with-ssl-dir=DIR where the root of OpenSSL is installed], + [ ac_ssl_includes="$withval"/include + ac_ssl_libraries="$withval"/lib$kdelibsuff + ]) + +want_ssl=yes +AC_ARG_WITH(ssl, + [ --without-ssl disable SSL checks], + [want_ssl=$withval]) + +if test $want_ssl = yes; then + +AC_MSG_CHECKING(for OpenSSL) + +AC_CACHE_VAL(ac_cv_have_ssl, +[#try to guess OpenSSL locations + + ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" + ssl_incdirs="$ac_ssl_includes $ssl_incdirs" + AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) + ac_ssl_includes="$ssl_incdir" + + ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" + if test ! "$ac_ssl_libraries" = "NO"; then + ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" + fi + + test=NONE + ssl_libdir=NONE + for dir in $ssl_libdirs; do + try="ls -1 $dir/libssl*" + if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done + + ac_ssl_libraries="$ssl_libdir" + + AC_LANG_SAVE + AC_LANG_C + + ac_cflags_safe="$CFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CFLAGS="$CFLAGS -I$ssl_incdir $all_includes" + LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" + LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" + + AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, + ac_ssl_rsaref="yes" + , + ac_ssl_rsaref="no" + ) + + CFLAGS="$ac_cflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then + have_ssl=no + else + have_ssl=yes; + fi + + ]) + + eval "$ac_cv_have_ssl" + + AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) + + AC_MSG_CHECKING([whether OpenSSL uses rsaref]) + AC_MSG_RESULT($ac_ssl_rsaref) + + AC_MSG_CHECKING([for easter eggs]) + AC_MSG_RESULT([none found]) + +else + have_ssl=no +fi + +if test "$have_ssl" = yes; then + AC_MSG_CHECKING(for OpenSSL version) + dnl Check for SSL version + AC_CACHE_VAL(ac_cv_ssl_version, + [ + AC_LANG_SAVE + AC_LANG_C + + cat >conftest.$ac_ext < +#include + int main() { + +#ifndef OPENSSL_VERSION_NUMBER + printf("ssl_version=\\"error\\"\n"); +#else + if (OPENSSL_VERSION_NUMBER < 0x00906000) + printf("ssl_version=\\"old\\"\n"); + else + printf("ssl_version=\\"ok\\"\n"); +#endif + return (0); + } +EOF + + ac_compile='${CC-gcc} $CFLAGS -I$ac_ssl_includes conftest.$ac_ext -o conftest' + if AC_TRY_EVAL(ac_compile); then + + if eval `./conftest 2>&5`; then + if test $ssl_version = error; then + AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) + else + if test $ssl_version = old; then + AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) + have_ssl=no + fi + fi + ac_cv_ssl_version="ssl_version=$ssl_version" + else + AC_MSG_ERROR([Your system couldn't run a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + else + AC_MSG_ERROR([Your system couldn't link a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + AC_LANG_RESTORE + + ]) + + eval "$ac_cv_ssl_version" + AC_MSG_RESULT($ssl_version) +fi + +if test "$have_ssl" != yes; then + LIBSSL=""; +else + AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) + ac_cv_have_ssl="have_ssl=yes \ + ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" + + + ssl_libraries="$ac_ssl_libraries" + ssl_includes="$ac_ssl_includes" + + if test "$ac_ssl_rsaref" = yes; then + LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" + fi + + if test $ssl_version = "old"; then + AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) + fi +fi + +if test "$ssl_includes" = "/usr/include" || test "$ssl_includes" = "/usr/local/include" || test -z "$ssl_includes"; then + SSL_INCLUDES=""; +else + SSL_INCLUDES="-I$ssl_includes" +fi + +if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries"; then + SSL_LDFLAGS="" +else + SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" +fi + +AC_SUBST(SSL_INCLUDES) +AC_SUBST(SSL_LDFLAGS) +AC_SUBST(LIBSSL) +]) + +AC_DEFUN(KDE_CHECK_STRLCPY, +[ + AC_CHECK_STRLCPY + AC_CHECK_STRLCAT + AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(unsigned long) + + AC_MSG_CHECKING([sizeof(size_t) == sizeof(unsigned long)]) + AC_TRY_COMPILE(,[ + #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG + choke me + #endif + ],[AC_MSG_RESULT([yes])],[ + AC_MSG_RESULT([no]) + AC_MSG_ERROR([ + Apparently on your system our assumption sizeof(size_t) == sizeof(unsigned long) + does not apply. Please mail kde-devel@kde.org with a description of your system! + ]) + ]) +]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001 +## Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 1996 +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +## +## As a special exception to the GNU General Public License, if you +## distribute this file as part of a program that contains a +## configuration script generated by Autoconf, you may include it under +## the same distribution terms that you use for the rest of that program. + +# serial 47 AC_PROG_LIBTOOL + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool --silent' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([LT_AC_PROG_SED])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="[$]2" +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +AC_DIVERT_POP +])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-linux*) + # Test if the compiler is 64bit + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *"ELF 32"*) + LINUX_64_MODE="32" + ;; + *"ELF 64"*) + LINUX_64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one + AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, + [AC_TRY_LINK([], + [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); + DllMain (0, 0, 0);], + [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) + + case $host/$CC in + *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) + # old mingw systems require "-dll" to link a DLL, while more recent ones + # require "-mdll" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mdll" + AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, + [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) + CFLAGS="$SAVE_CFLAGS" ;; + *-*-cygwin* | *-*-pw32*) + # cygwin systems need to pass --dll to the linker, and not link + # crt.o which will require a WinMain@16 definition. + lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; + esac + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $3" + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + if (eval $ac_compile 2>conftest.err) && test -s $ac_outfile; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + CFLAGS="$save_CFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + testring="ABCD" + + case $host_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \ + = "XX$testring") >/dev/null 2>&1 && + new_result=`expr "X$testring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + testring=$testring$testring + done + testring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + ifelse([$1],[],[save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"], + [$1],[CXX],[save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -o out/conftest2.$ac_objext"], + [$1],[GCJ],[save_GCJFLAGS="$GCJFLAGS" + GCJFLAGS="$GCJFLAGS -o out/conftest2.$ac_objext"]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + # According to Tom Tromey, Ian Lance Taylor reported there are C compilers + # that will create temporary files in the current directory regardless of + # the output directory. Thus, making CWD read-only will cause this test + # to fail, enabling locking or at least warning the user not to do parallel + # builds. + chmod -w . + + if (eval $ac_compile 2>out/conftest.err) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + # Append any errors to the config.log. + cat out/conftest.err 1>&AS_MESSAGE_LOG_FD + else + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + ifelse([$1],[],[CFLAGS="$save_CFLAGS"], + [$1],[CXX],[CXXFLAGS="$save_CXXFLAGS"], + [$1],[GCJ],[GCJFLAGS="$save_GCJFLAGS"]) + chmod u+w . + $rm conftest* out/* + rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)"; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4* | aix5*) + version_type=linux + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}.so$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + sys_lib_search_path_spec="/lib /lib/w32api /usr/lib /usr/local/lib" + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://"` + if echo "$sys_lib_search_path_spec" | [egrep ';[C-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | sed -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | sed -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + if test "$host_cpu" = ia64; then + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + else + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + fi + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) version_type=irix ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + libsuff= + if test "x$LINUX_64_MODE" = x64; then + # Some platforms are per default 64-bit, so there's no /lib64 + if test -d /lib64; then + libsuff=64 + fi + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags=TAGS], + [include additional configurations @<:@CXX,GCJ@:>@])], + [tagnames="$withval"], + [tagnames="CXX,GCJ" + case $host_os in + mingw*|cygwin*) tagnames="$tagnames,RC" ;; + esac]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | sed -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + AC_LIBTOOL_LANG_CXX_CONFIG + ;; + + GCJ) + AC_LIBTOOL_LANG_GCJ_CONFIG + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + available_tags="$available_tags $tagname" + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the path to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$lt_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +])# AC_PROG_LD + + +# AC_PROG_LD_GNU +# -------------- +AC_DEFUN([AC_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$lt_cv_prog_gnu_ld +])# AC_PROG_LD_GNU + + +# AC_PROG_LD_RELOAD_FLAG +# ---------------------- +# find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], +[AC_CACHE_CHECK([for $LD option to reload object files], + lt_cv_ld_reload_flag, + [lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +])# AC_PROG_LD_RELOAD_FLAG + + +# AC_DEPLIBS_CHECK_METHOD +# ----------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], +[AC_CACHE_CHECK([how to recognise dependant libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[[012]]) + lt_cv_file_magic_test_file=`/System/Library/Frameworks/System.framework/System` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + if test "$host_cpu" = ia64; then + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + else + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + fi + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha* | hppa* | i*86 | ia64* | m68* | mips | mipsel | powerpc* | sparc* | s390* | sh* | x86_64* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the path to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + if ("$tmp_nm" -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ("$tmp_nm" -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# If this macro is not defined by Autoconf, define it here. +ifdef([AC_PROVIDE_IFELSE], + [], + [define([AC_PROVIDE_IFELSE], + [ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([AC_PROG_RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='main(){return(0);}' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C test sources. +ac_ext=cc + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int char *[]) { return(0); }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${CXX-"c++"} +set dummy $CC +compiler="[$]2" +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if eval "`$CC -print-prog-name=ld` --version 2>&1" | \ + egrep 'GNU ld' > /dev/null; then + with_gnu_ld=yes + + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + egrep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | egrep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux*) + if test $with_gnu_ld = no; then + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + else + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + fi + fi + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + else + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + fi + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case $host_os in + hpux9*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + ;; + *) + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + fi + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_os in + hpux9*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + ;; + *) + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + fi + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='templib=`echo $lib | sed -e "s/\.so\..*/\.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='templib=`echo $lib | sed -e "s/\.so\..*/\.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest.so 2>&1 | egrep "ld"`; rm -f libconftest.so; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | sed "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + # NetBSD uses g++ - do we need to do anything? + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='templib=`echo $lib | sed -e "s/\.so\..*/\.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | sed "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | egrep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='templib=`echo $lib | sed -e "s/\.so\..*/\.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | sed "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | egrep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | egrep "\-R|\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | egrep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $linker_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | egrep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $linker_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | egrep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# Figure out "hidden" C++ library dependencies from verbose +# compiler output whening linking a shared library. +cat > conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A sed program that does not truncate output. +SED=$lt_SED + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "$cfgfile" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments + _LT_AC_FILE_LTDLL_C + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments + _LT_AC_FILE_IMPGEN_C +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions -c conftest.$ac_ext], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[[ABCDGISTW]]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + cygwin* | mingw* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX, but not for PA HP-UX. + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + fi + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX, but not for PA HP-UX. + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + fi + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + if test "x$host_vendor" = xsni; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-LD' + else + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + fi + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -DPIC], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -DPIC" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | egrep '(GNU)' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + cygwin* | mingw* | pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an egrep regular expression of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left by newer dlltools. + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`head -1 $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; + else + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \[$]# in + 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + ;; + esac + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | egrep '(GNU)' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + esac + + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + _LT_AC_TAGVAR(archive_cmds, $1)='$CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring' + # We need to add '_' to the symbols in $export_symbols first + #_LT_AC_TAGVAR(archive_expsym_cmds, $1)="$_LT_AC_TAGVAR(archive_cmds, $1)"' && strip -s $export_symbols' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9* | hpux10* | hpux11*) + if test "$GCC" = yes; then + case $host_os in + hpux9*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + ;; + *) + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + esac + else + case $host_os in + hpux9*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + ;; + *) + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + ;; + esac + fi + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + else + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + fi + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + if test "x$host_vendor" = xsni; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + echo 'static int dummy;' > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac +fi +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_FILE_IMPGEN_C +# -------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_IMPGEN_C], [ +# /* impgen.c starts here */ +# /* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/sed$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + _max=0 + _count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for _sed in $_sed_list /usr/xpg4/bin/sed; do + test ! -f ${_sed} && break + cat /dev/null > "$tmp/sed.in" + _count=0 + echo $ECHO_N "0123456789$ECHO_C" >"$tmp/sed.in" + # Check for GNU sed and select it if it is found. + if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then + lt_cv_path_SED=${_sed} + break; + fi + while true; do + cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" + mv "$tmp/sed.tmp" "$tmp/sed.in" + cp "$tmp/sed.in" "$tmp/sed.nl" + echo >>"$tmp/sed.nl" + ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break + cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break + # 10000 chars as input seems more than enough + test $_count -gt 10 && break + _count=`expr $_count + 1` + if test $_count -gt $_max; then + _max=$_count + lt_cv_path_SED=$_sed + fi + done + done + rm -rf "$tmp" +]) +AC_MSG_RESULT([$SED]) +]) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..668f764 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,11308 @@ +# aclocal.m4 generated automatically by aclocal 1.5 + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu) +dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +dnl IMPORTANT NOTE: +dnl Please do not modify this file unless you expect your modifications to be +dnl carried into every other module in the repository. +dnl +dnl Single-module modifications are best placed in configure.in for kdelibs +dnl and kdebase or configure.in.in if present. + +dnl ------------------------------------------------------------------------ +dnl Forward compatibility macros (make autoconf 2.13 look like 2.50), +dnl thanks to Raja R Harinath. +dnl ------------------------------------------------------------------------ +dnl +ifdef([_AC_PATH_X_XMKMF],[], + [AC_DEFUN([_AC_PATH_X_XMKMF],[AC_PATH_X_XMKMF])]) +ifdef([AC_OUTPUT_SUBDIRS],[], + [AC_DEFUN([AC_OUTPUT_SUBDIRS],[subdirs=$1; _AC_OUTPUT_SUBDIRS])]) + +# KDE_PATH_X_DIRECT +dnl Internal subroutine of AC_PATH_X. +dnl Set ac_x_includes and/or ac_x_libraries. +AC_DEFUN(KDE_PATH_X_DIRECT, +[ +AC_REQUIRE([KDE_CHECK_LIB64]) + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +AC_TRY_CPP([#include <$x_direct_test_include>], +[# We can compile using X headers with no special include directory. +ac_x_includes=], +[# Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done]) +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +AC_TRY_LINK(, [${x_direct_test_function}()], +[LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries=], +[LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \ + /usr/X11/lib${kdelibsuff} \ + /usr/X11R6/lib${kdelibsuff} \ + /usr/X11R5/lib${kdelibsuff} \ + /usr/X11R4/lib${kdelibsuff} \ + \ + /usr/lib${kdelibsuff}/X11 \ + /usr/lib${kdelibsuff}/X11R6 \ + /usr/lib${kdelibsuff}/X11R5 \ + /usr/lib${kdelibsuff}/X11R4 \ + \ + /usr/local/X11/lib${kdelibsuff} \ + /usr/local/X11R6/lib${kdelibsuff} \ + /usr/local/X11R5/lib${kdelibsuff} \ + /usr/local/X11R4/lib${kdelibsuff} \ + \ + /usr/local/lib${kdelibsuff}/X11 \ + /usr/local/lib${kdelibsuff}/X11R6 \ + /usr/local/lib${kdelibsuff}/X11R5 \ + /usr/local/lib${kdelibsuff}/X11R4 \ + \ + /usr/X386/lib${kdelibsuff} \ + /usr/x386/lib${kdelibsuff} \ + /usr/XFree86/lib${kdelibsuff}/X11 \ + \ + /usr/lib${kdelibsuff} \ + /usr/local/lib${kdelibsuff} \ + /usr/unsupported/lib${kdelibsuff} \ + /usr/athena/lib${kdelibsuff} \ + /usr/local/x11r5/lib${kdelibsuff} \ + /usr/lpp/Xamples/lib${kdelibsuff} \ + /lib/usr/lib${kdelibsuff}/X11 \ + \ + /usr/openwin/lib${kdelibsuff} \ + /usr/openwin/share/lib${kdelibsuff} \ + ; \ +do +dnl Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done]) +fi # $ac_x_libraries = NO +]) + + +dnl ------------------------------------------------------------------------ +dnl Find a file (or one of more files in a list of dirs) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_FIND_FILE, +[ +$3=NO +for i in $2; +do + for j in $1; + do + echo "configure: __oline__: $i/$j" >&AC_FD_CC + if test -r "$i/$j"; then + echo "taking that" >&AC_FD_CC + $3=$i + break 2 + fi + done +done +]) + +dnl KDE_FIND_PATH(programm-name, variable-name, list of directories, +dnl if-not-found, test-parameter) +AC_DEFUN(KDE_FIND_PATH, +[ + AC_MSG_CHECKING([for $1]) + if test -n "$$2"; then + kde_cv_path="$$2"; + else + kde_cache=`echo $1 | sed 'y%./+-%__p_%'` + + AC_CACHE_VAL(kde_cv_path_$kde_cache, + [ + kde_cv_path="NONE" + dirs="$3" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + dirs="$dirs $dir" + done + IFS=$kde_save_IFS + + for dir in $dirs; do + if test -x "$dir/$1"; then + if test -n "$5" + then + evalstr="$dir/$1 $5 2>&1 " + if eval $evalstr; then + kde_cv_path="$dir/$1" + break + fi + else + kde_cv_path="$dir/$1" + break + fi + fi + done + + eval "kde_cv_path_$kde_cache=$kde_cv_path" + + ]) + + eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\"" + + fi + + if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then + AC_MSG_RESULT(not found) + $4 + else + AC_MSG_RESULT($kde_cv_path) + $2=$kde_cv_path + + fi +]) + +AC_DEFUN(KDE_MOC_ERROR_MESSAGE, +[ + AC_MSG_ERROR([No Qt meta object compiler (moc) found! +Please check whether you installed Qt correctly. +You need to have a running moc binary. +configure tried to run $ac_cv_path_moc and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable MOC to the right one before running +configure. +]) +]) + +AC_DEFUN(KDE_UIC_ERROR_MESSAGE, +[ + AC_MSG_WARN([No Qt ui compiler (uic) found! +Please check whether you installed Qt correctly. +You need to have a running uic binary. +configure tried to run $ac_cv_path_uic and the test didn't +succeed. If configure shouldn't have tried this one, set +the environment variable UIC to the right one before running +configure. +]) +]) + + +AC_DEFUN(KDE_CHECK_UIC_FLAG, +[ + AC_MSG_CHECKING([whether uic supports -$1 ]) + kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` + AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache, + [ + cat >conftest.ui < +EOT + ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null" + if AC_TRY_EVAL(ac_uic_testrun); then + eval "kde_cv_prog_uic_$kde_cache=yes" + else + eval "kde_cv_prog_uic_$kde_cache=no" + fi + rm -f conftest* + ]) + + if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then + AC_MSG_RESULT([yes]) + : + $3 + else + AC_MSG_RESULT([no]) + : + $4 + fi +]) + + +dnl ------------------------------------------------------------------------ +dnl Find the meta object compiler and the ui compiler in the PATH, +dnl in $QTDIR/bin, and some more usual places +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_PATH_QT_MOC_UIC, +[ + qt_bindirs="" + for dir in $kde_qt_dirs; do + qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc" + done + qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin" + if test ! "$ac_qt_bindir" = "NO"; then + qt_bindirs="$ac_qt_bindir $qt_bindirs" + fi + + KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE]) + if test -z "$UIC_NOT_NEEDED"; then + KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""]) + if test -z "$UIC_PATH" ; then + KDE_UIC_ERROR_MESSAGE + exit 1 + elif test $kde_qtver = 3; then + KDE_CHECK_UIC_FLAG(L,[/nonexistant],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no) + KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no) + + UIC=$UIC_PATH + if test x$ac_uic_supports_libpath = xyes; then + UIC="$UIC -L \$(kde_widgetdir)" + fi + if test x$ac_uic_supports_nounload = xyes; then + UIC="$UIC -nounload" + fi + fi + else + UIC="echo uic not available: " + fi + + AC_SUBST(MOC) + AC_SUBST(UIC) + + UIC_TR="i18n" + if test $kde_qtver = 3; then + UIC_TR="tr2i18n" + fi + + AC_SUBST(UIC_TR) +]) + +AC_DEFUN(KDE_1_CHECK_PATHS, +[ + KDE_1_CHECK_PATH_HEADERS + + KDE_TEST_RPATH= + + if test -n "$USE_RPATH"; then + + if test -n "$kde_libraries"; then + KDE_TEST_RPATH="-R $kde_libraries" + fi + + if test -n "$qt_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries" + fi + + if test -n "$x_libraries"; then + KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries" + fi + + KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH" + fi + +AC_MSG_CHECKING([for KDE libraries installed]) +ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5' + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + AC_MSG_RESULT(yes) +else + AC_MSG_ERROR([your system fails at linking a small KDE application! +Check, if your compiler is installed correctly and if you have used the +same compiler to compile Qt and kdelibs as you did use now. +For more details about this problem, look at the end of config.log.]) +fi + +if eval `KDEDIR= ./conftest 2>&5`; then + kde_result=done +else + kde_result=problems +fi + +KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log +kde_have_all_paths=yes + +KDE_SET_PATHS($kde_result) + +]) + +AC_DEFUN(KDE_SET_PATHS, +[ + kde_cv_all_paths="kde_have_all_paths=\"yes\" \ + kde_htmldir=\"$kde_htmldir\" \ + kde_appsdir=\"$kde_appsdir\" \ + kde_icondir=\"$kde_icondir\" \ + kde_sounddir=\"$kde_sounddir\" \ + kde_datadir=\"$kde_datadir\" \ + kde_locale=\"$kde_locale\" \ + kde_cgidir=\"$kde_cgidir\" \ + kde_confdir=\"$kde_confdir\" \ + kde_mimedir=\"$kde_mimedir\" \ + kde_toolbardir=\"$kde_toolbardir\" \ + kde_wallpaperdir=\"$kde_wallpaperdir\" \ + kde_templatesdir=\"$kde_templatesdir\" \ + kde_bindir=\"$kde_bindir\" \ + kde_servicesdir=\"$kde_servicesdir\" \ + kde_servicetypesdir=\"$kde_servicetypesdir\" \ + kde_moduledir=\"$kde_moduledir\" \ + kde_styledir=\"$kde_styledir\" \ + kde_widgetdir=\"$kde_widgetdir\" \ + kde_result=$1" +]) + +AC_DEFUN(KDE_SET_DEFAULT_PATHS, +[ +if test "$1" = "default"; then + + if test -z "$kde_htmldir"; then + kde_htmldir='\${prefix}/share/doc/HTML' + fi + if test -z "$kde_appsdir"; then + kde_appsdir='\${prefix}/share/applnk' + fi + if test -z "$kde_icondir"; then + kde_icondir='\${prefix}/share/icons' + fi + if test -z "$kde_sounddir"; then + kde_sounddir='\${prefix}/share/sounds' + fi + if test -z "$kde_datadir"; then + kde_datadir='\${prefix}/share/apps' + fi + if test -z "$kde_locale"; then + kde_locale='\${prefix}/share/locale' + fi + if test -z "$kde_cgidir"; then + kde_cgidir='\${exec_prefix}/cgi-bin' + fi + if test -z "$kde_confdir"; then + kde_confdir='\${prefix}/share/config' + fi + if test -z "$kde_mimedir"; then + kde_mimedir='\${prefix}/share/mimelnk' + fi + if test -z "$kde_toolbardir"; then + kde_toolbardir='\${prefix}/share/toolbar' + fi + if test -z "$kde_wallpaperdir"; then + kde_wallpaperdir='\${prefix}/share/wallpapers' + fi + if test -z "$kde_templatesdir"; then + kde_templatesdir='\${prefix}/share/templates' + fi + if test -z "$kde_bindir"; then + kde_bindir='\${exec_prefix}/bin' + fi + if test -z "$kde_servicesdir"; then + kde_servicesdir='\${prefix}/share/services' + fi + if test -z "$kde_servicetypesdir"; then + kde_servicetypesdir='\${prefix}/share/servicetypes' + fi + if test -z "$kde_moduledir"; then + if test "$kde_qtver" = "2"; then + kde_moduledir='\${libdir}/kde2' + else + kde_moduledir='\${libdir}/kde3' + fi + fi + if test -z "$kde_styledir"; then + kde_styledir='\${libdir}/kde3/plugins/styles' + fi + if test -z "$kde_widgetdir"; then + kde_widgetdir='\${libdir}/kde3/plugins/designer' + fi + + KDE_SET_PATHS(defaults) + +else + + if test $kde_qtver = 1; then + AC_MSG_RESULT([compiling]) + KDE_1_CHECK_PATHS + else + AC_MSG_ERROR([path checking not yet supported for KDE 2]) + fi + +fi +]) + +AC_DEFUN(KDE_CHECK_PATHS_FOR_COMPLETENESS, +[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" || + test -z "$kde_icondir" || test -z "$kde_sounddir" || + test -z "$kde_datadir" || test -z "$kde_locale" || + test -z "$kde_cgidir" || test -z "$kde_confdir" || + test -z "$kde_mimedir" || test -z "$kde_toolbardir" || + test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" || + test -z "$kde_bindir" || test -z "$kde_servicesdir" || + test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" || + test -z "$kde_styledir" || test -z "kde_widgetdir" + test "x$kde_have_all_paths" != "xyes"; then + kde_have_all_paths=no + fi +]) + +AC_DEFUN(KDE_MISSING_PROG_ERROR, +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed KDE correctly. +]) +]) + +AC_DEFUN(KDE_MISSING_ARTS_ERROR, +[ + AC_MSG_ERROR([The important program $1 was not found! +Please check whether you installed aRts correctly. +]) +]) + +AC_DEFUN(KDE_SUBST_PROGRAMS, +[ + + kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin" + test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs" + if test -n "$KDEDIRS"; then + kde_save_IFS=$IFS + IFS=: + for dir in $KDEDIRS; do + kde_default_bindirs="$dir/bin $kde_default_bindirs " + done + IFS=$kde_save_IFS + fi + kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_default_bindirs" + KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)]) + KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)]) + KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)]) + KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)]) + KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs]) + KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs]) + + if test -n "$MEINPROC" && test ! "$MEINPROC" = "compiled"; then + kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share" + test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs" + AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET) + if test "$KDE_XSL_STYLESHEET" = "NO"; then + KDE_XSL_STYLESHEET="" + else + KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl" + fi + fi + + DCOP_DEPENDENCIES='$(DCOPIDL)' + AC_SUBST(DCOPIDL) + AC_SUBST(DCOPIDL2CPP) + AC_SUBST(DCOP_DEPENDENCIES) + AC_SUBST(MCOPIDL) + AC_SUBST(ARTSCCONFIG) + AC_SUBST(KDECONFIG) + AC_SUBST(MEINPROC) + AC_SUBST(KDE_XSL_STYLESHEET) + + if test -x "$KDECONFIG"; then # it can be "compiled" + kde_libs_prefix=`$KDECONFIG --prefix` + if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then + AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs. + This means it has been moved since you installed it. + This won't work. Please recompile kdelibs for the new prefix. + ]) + fi + kde_libs_htmldir=`$KDECONFIG --install html --expandvars` + else + kde_libs_prefix='$(prefix)' + kde_libs_htmldir='$(kde_htmldir)' + fi + AC_SUBST(kde_libs_prefix) + AC_SUBST(kde_libs_htmldir) +])dnl + +AC_DEFUN(AC_CREATE_KFSSTND, +[ +AC_REQUIRE([AC_CHECK_RPATH]) + +AC_MSG_CHECKING([for KDE paths]) +kde_result="" +kde_cached_paths=yes +AC_CACHE_VAL(kde_cv_all_paths, +[ + KDE_SET_DEFAULT_PATHS($1) + kde_cached_paths=no +]) +eval "$kde_cv_all_paths" +KDE_CHECK_PATHS_FOR_COMPLETENESS +if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then + # wrong values were cached, may be, we can set better ones + kde_result= + kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir= + kde_datadir= kde_locale= kde_cgidir= kde_confdir= + kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir= + kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir= + kde_have_all_paths= + kde_styledir= + kde_widgetdir= + KDE_SET_DEFAULT_PATHS($1) + eval "$kde_cv_all_paths" + KDE_CHECK_PATHS_FOR_COMPLETENESS + kde_result="$kde_result (cache overridden)" +fi +if test "$kde_have_all_paths" = "no"; then + AC_MSG_ERROR([configure could not run a little KDE program to test the environment. +Since it had compiled and linked before, it must be a strange problem on your system. +Look at config.log for details. If you are not able to fix this, look at +http://www.kde.org/faq/installation.html or any www.kde.org mirror. +(If you're using an egcs version on Linux, you may update binutils!) +]) +else + rm -f conftest* + AC_MSG_RESULT($kde_result) +fi + +bindir=$kde_bindir + +KDE_SUBST_PROGRAMS + +]) + +AC_DEFUN(AC_SUBST_KFSSTND, +[ +AC_SUBST(kde_htmldir) +AC_SUBST(kde_appsdir) +AC_SUBST(kde_icondir) +AC_SUBST(kde_sounddir) +AC_SUBST(kde_datadir) +AC_SUBST(kde_locale) +AC_SUBST(kde_confdir) +AC_SUBST(kde_mimedir) +AC_SUBST(kde_wallpaperdir) +AC_SUBST(kde_bindir) +dnl for KDE 2 +AC_SUBST(kde_templatesdir) +AC_SUBST(kde_servicesdir) +AC_SUBST(kde_servicetypesdir) +AC_SUBST(kde_moduledir) +AC_SUBST(kde_styledir) +AC_SUBST(kde_widgetdir) +if test "$kde_qtver" = 1; then + kde_minidir="$kde_icondir/mini" +else +# for KDE 1 - this breaks KDE2 apps using minidir, but +# that's the plan ;-/ + kde_minidir="/dev/null" +fi +dnl AC_SUBST(kde_minidir) +dnl AC_SUBST(kde_cgidir) +dnl AC_SUBST(kde_toolbardir) +]) + +AC_DEFUN(KDE_MISC_TESTS, +[ + AC_LANG_C + dnl Checks for libraries. + AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD + AC_SUBST(LIBUTIL) + AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD + AC_SUBST(LIBCOMPAT) + kde_have_crypt= + AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes], + AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [ + AC_MSG_WARN([you have no crypt in either libcrypt or libc. +You should install libcrypt from another source or configure with PAM +support]) + kde_have_crypt=no + ])) + AC_SUBST(LIBCRYPT) + if test $kde_have_crypt = yes; then + AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function]) + fi + AC_CHECK_SOCKLEN_T + AC_LANG_C + AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"]) + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + AC_CHECK_LIB(dnet_stub, dnet_ntoa, + [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"]) + fi + AC_CHECK_FUNC(inet_ntoa) + if test $ac_cv_func_inet_ntoa = no; then + AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl") + fi + AC_CHECK_FUNC(connect) + if test $ac_cv_func_connect = no; then + AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", , + $X_EXTRA_LIBS) + fi + + AC_CHECK_FUNC(remove) + if test $ac_cv_func_remove = no; then + AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix") + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + AC_CHECK_FUNC(shmat, , + AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc")) + + # darwin needs this to initialize the environment + AC_CHECK_HEADERS(crt_externs.h) + AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])]) + + # more headers that need to be explicitly included on darwin + AC_CHECK_HEADERS(sys/types.h stdint.h) + + # darwin requires a poll emulation library + AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll") + + # CoreAudio framework + AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ + AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API]) + FRAMEWORK_COREAUDIO="-framework CoreAudio" + ]) + + AC_CHECK_RES_INIT + AC_SUBST(LIB_POLL) + AC_SUBST(FRAMEWORK_COREAUDIO) + LIBSOCKET="$X_EXTRA_LIBS" + AC_SUBST(LIBSOCKET) + AC_SUBST(X_EXTRA_LIBS) + AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4 + AC_SUBST(LIBUCB) + + case $host in dnl this *is* LynxOS specific + *-*-lynxos* ) + AC_MSG_CHECKING([LynxOS header file wrappers]) + [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"] + AC_MSG_RESULT(disabled) + AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS + ;; + esac + + KDE_CHECK_TYPES + KDE_CHECK_LIBDL + +AH_VERBATIM(_AIX_STRINGS_H_BZERO, +[ +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif +]) + +AC_CHECK_FUNCS([vsnprintf snprintf]) + +AH_VERBATIM(_TRU64,[ +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Find the header files and libraries for X-Windows. Extended the +dnl macro AC_PATH_X +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(K_PATH_X, +[ +AC_REQUIRE([KDE_MISC_TESTS])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_ARG_ENABLE( + embedded, + [ --enable-embedded link to Qt-embedded, don't use X], + kde_use_qt_emb=$enableval, + kde_use_qt_emb=no +) + +AC_ARG_ENABLE( + qtopia, + [ --enable-qtopia link to Qt-embedded, link to the Qtopia Environment], + kde_use_qt_emb_palm=$enableval, + kde_use_qt_emb_palm=no +) + +if test "$kde_use_qt_emb" = "no"; then + +AC_MSG_CHECKING(for X) +AC_LANG_SAVE +AC_LANG_C +AC_CACHE_VAL(kde_cv_have_x, +[# One or both of the vars are not set, and there is no cached value. +if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then + kde_x_includes=NO +else + kde_x_includes=$x_includes +fi +if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then + kde_x_libraries=NO +else + kde_x_libraries=$x_libraries +fi + +# below we use the standard autoconf calls +ac_x_libraries=$kde_x_libraries +ac_x_includes=$kde_x_includes + +KDE_PATH_X_DIRECT +dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries. +dnl Unfortunately, if compiling with the N32 ABI, this is not the correct +dnl location. The correct location is /usr/lib32 or an undefined value +dnl (the linker is smart enough to pick the correct default library). +dnl Things work just fine if you use just AC_PATH_X_DIRECT. +dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to +dnl /usr/openwin/include, which doesn't work. /usr/include does work, so +dnl x_includes should be left alone. +case "$host" in +mips-sgi-irix6*) + ;; +*-*-solaris*) + ;; +*) + _AC_PATH_X_XMKMF + if test -z "$ac_x_includes"; then + ac_x_includes="." + fi + if test -z "$ac_x_libraries"; then + ac_x_libraries="/usr/lib${kdelibsuff}" + fi +esac +#from now on we use our own again + +# when the user already gave --x-includes, we ignore +# what the standard autoconf macros told us. +if test "$kde_x_includes" = NO; then + kde_x_includes=$ac_x_includes +fi + +# for --x-libraries too +if test "$kde_x_libraries" = NO; then + kde_x_libraries=$ac_x_libraries +fi + +if test "$kde_x_includes" = NO; then + AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!]) +fi + +if test "$kde_x_libraries" = NO; then + AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!]) +fi + +# Record where we found X for the cache. +kde_cv_have_x="have_x=yes \ + kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries" +])dnl + +eval "$kde_cv_have_x" + +if test "$have_x" != yes; then + AC_MSG_RESULT($have_x) + no_x=yes +else + AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes]) +fi + +if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then + X_INCLUDES="" + x_includes="."; dnl better than nothing :- + else + x_includes=$kde_x_includes + X_INCLUDES="-I$x_includes" +fi + +if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE; then + X_LDFLAGS="" + x_libraries="/usr/lib"; dnl better than nothing :- + else + x_libraries=$kde_x_libraries + X_LDFLAGS="-L$x_libraries" +fi +all_includes="$X_INCLUDES" +all_libraries="$X_LDFLAGS" + +AC_SUBST(X_INCLUDES) +AC_SUBST(X_LDFLAGS) +AC_SUBST(x_libraries) +AC_SUBST(x_includes) + +# Check for libraries that X11R6 Xt/Xaw programs need. +ac_save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $X_LDFLAGS" +# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to +# check for ICE first), but we must link in the order -lSM -lICE or +# we get undefined symbols. So assume we have SM if we have ICE. +# These have to be linked with before -lX11, unlike the other +# libraries we check for below, so use a different variable. +# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. +AC_CHECK_LIB(ICE, IceConnectionNumber, + [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS) +AC_SUBST(LIBSM) +LDFLAGS="$ac_save_LDFLAGS" + +AC_SUBST(X_PRE_LIBS) + +LIB_X11='-lX11 $(LIBSOCKET)' +AC_SUBST(LIB_X11) + +AC_MSG_CHECKING(for libXext) +AC_CACHE_VAL(kde_cv_have_libXext, +[ +kde_ldflags_safe="$LDFLAGS" +kde_libs_safe="$LIBS" + +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +LIBS="-lXext -lX11 $LIBSOCKET" + +AC_TRY_LINK([ +#include +#ifdef STDC_HEADERS +# include +#endif +], +[ +printf("hello Xext\n"); +], +kde_cv_have_libXext=yes, +kde_cv_have_libXext=no + ) + +LDFLAGS=$kde_ldflags_safe +LIBS=$kde_libs_safe + ]) + +AC_MSG_RESULT($kde_cv_have_libXext) + +if test "$kde_cv_have_libXext" = "no"; then + AC_MSG_ERROR([We need a working libXext to proceed. Since configure +can't find it itself, we stop here assuming that make wouldn't find +them either.]) +fi + +AC_MSG_CHECKING(for Xinerama) + + AC_ARG_WITH(xinerama, + [ --with-xinerama enable support for Xinerama ], + [ + no_xinerama=no + ], [ + no_xinerama=yes + ] +) + +kde_save_LDFLAGS="$LDFLAGS" +kde_save_CFLAGS="$CFLAGS" +kde_save_LIBS="$LIBS" +LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS" +CFLAGS="$CFLAGS -I$x_includes" +LIBS="-lXinerama -lXext" + +if test "x$no_xinerama" = "xno"; then + + AC_CACHE_VAL(ac_cv_have_xinerama, + [ + AC_TRY_LINK([#include + #include ], + [XineramaIsActive(NULL);], + [ac_cv_have_xinerama="yes"], + [ac_cv_have_xinerama="no"]) + ]) +else + ac_cv_have_xinerama=no; +fi + +AC_MSG_RESULT($ac_cv_have_xinerama) + +LIBXINERAMA="" + +if test "$ac_cv_have_xinerama" = "yes"; then + AC_DEFINE(HAVE_XINERAMA, 1, [Define if you want Xinerama support]) + LIBXINERAMA="-lXinerama" +fi + +AC_SUBST(LIBXINERAMA) + +LDFLAGS="$kde_save_LDFLAGS" +CFLAGS="$kde_save_CFLAGS" +LIBS="$kde_save_LIBS" + +LIB_XEXT="-lXext" +QTE_NORTTI="" + +else + dnl We're using QT Embedded + CPPFLAGS=-DQWS + CXXFLAGS="$CXXFLAGS -fno-rtti" + QTE_NORTTI="-fno-rtti -DQWS" + X_PRE_LIBS="" + LIB_X11="" + LIB_XEXT="" + LIBSM="" + X_INCLUDES="" + X_LDFLAGS="" + x_includes="" + x_libraries="" + AC_SUBST(X_PRE_LIBS) + AC_SUBST(LIB_X11) + AC_SUBST(LIBSM) + AC_SUBST(X_INCLUDES) + AC_SUBST(X_LDFLAGS) + AC_SUBST(x_includes) + AC_SUBST(x_libraries) +fi +AC_SUBST(QTE_NORTTI) +AC_SUBST(LIB_XEXT) + + +AC_LANG_RESTORE + +]) + +AC_DEFUN(KDE_PRINT_QT_PROGRAM, +[ +AC_REQUIRE([KDE_USE_QT]) +cat > conftest.$ac_ext < +#include +EOF +if test "$kde_qtver" = "2"; then +cat >> conftest.$ac_ext < +#include +#include +EOF + +if test $kde_qtsubver -gt 0; then +cat >> conftest.$ac_ext <> conftest.$ac_ext < +#include +#include +EOF +fi + +echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext +cat >> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <> conftest.$ac_ext <&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC +fi + +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe" +export LD_LIBRARY_PATH +LIBRARY_PATH="$ac_LIBRARY_PATH" +export LIBRARY_PATH +AC_LANG_RESTORE +]) + +if test "$kde_cv_qt_direct" = "yes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the Qt headers and libraries. +dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed) +dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_PATH_QT_1_3, +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([KDE_USE_QT]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +dnl ------------------------------------------------------------------------ +dnl Add configure flag to enable linking to MT version of Qt library. +dnl ------------------------------------------------------------------------ + +AC_ARG_ENABLE( + mt, + [ --disable-mt link to non-threaded Qt (deprecated)], + kde_use_qt_mt=$enableval, + [ + if test $kde_qtver = 3; then + kde_use_qt_mt=yes + else + kde_use_qt_mt=no + fi + ] +) + +USING_QT_MT="" + +dnl ------------------------------------------------------------------------ +dnl If we not get --disable-qt-mt then adjust some vars for the host. +dnl ------------------------------------------------------------------------ + +KDE_MT_LDFLAGS= +KDE_MT_LIBS= +if test "x$kde_use_qt_mt" = "xyes"; then + KDE_CHECK_THREADING + if test "x$kde_use_threading" = "xyes"; then + CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS" + KDE_MT_LDFLAGS="$USE_THREADS" + KDE_MT_LIBS="$LIBPTHREAD" + else + kde_use_qt_mt=no + fi +fi +AC_SUBST(KDE_MT_LDFLAGS) +AC_SUBST(KDE_MT_LIBS) + +kde_qt_was_given=yes + +dnl ------------------------------------------------------------------------ +dnl If we haven't been told how to link to Qt, we work it out for ourselves. +dnl ------------------------------------------------------------------------ +if test -z "$LIBQT_GLOB"; then + if test "x$kde_use_qt_emb" = "xyes"; then + LIBQT_GLOB="libqte.*" + else + LIBQT_GLOB="libqt.*" + fi +fi + +if test -z "$LIBQT"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-embedded then adjust the Qt library name. +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + qtlib="qte" + else + qtlib="qt" + fi + + kde_int_qt="-l$qtlib" +else + kde_int_qt="$LIBQT" + kde_lib_qt_set=yes +fi + +if test -z "$LIBQPE"; then +dnl ------------------------------------------------------------ +dnl If we got --enable-palmtop then add -lqpe to the link line +dnl ------------------------------------------------------------ + if test "x$kde_use_qt_emb" = "xyes"; then + if test "x$kde_use_qt_emb_palm" = "xyes"; then + LIB_QPE="-lqpe" + else + LIB_QPE="" + fi + else + LIB_QPE="" + fi +fi + +dnl ------------------------------------------------------------------------ +dnl If we got --enable-qt-mt then adjust the Qt library name for the host. +dnl ------------------------------------------------------------------------ + +if test "x$kde_use_qt_mt" = "xyes"; then + if test -z "$LIBQT"; then + LIBQT="-l$qtlib-mt" + kde_int_qt="-l$qtlib-mt" + else + LIBQT="$qtlib-mt" + kde_int_qt="$qtlib-mt" + fi + LIBQT_GLOB="lib$qtlib-mt.*" + USING_QT_MT="using -mt" +else + LIBQT="-l$qtlib" +fi + +if test $kde_qtver != 1; then + + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([AC_FIND_JPEG]) + LIBQT="$LIBQT $LIBPNG $LIBJPEG" +fi + +if test $kde_qtver = 3; then + AC_REQUIRE([KDE_CHECK_LIBDL]) + LIBQT="$LIBQT $LIBDL" +fi + +AC_MSG_CHECKING([for Qt]) + +if test "x$kde_use_qt_emb" != "xyes"; then +LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET" +fi +ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO +qt_libraries="" +qt_includes="" +AC_ARG_WITH(qt-dir, + [ --with-qt-dir=DIR where the root of Qt is installed ], + [ ac_qt_includes="$withval"/include + ac_qt_libraries="$withval"/lib${kdelibsuff} + ac_qt_bindir="$withval"/bin + ]) + +AC_ARG_WITH(qt-includes, + [ --with-qt-includes=DIR where the Qt includes are. ], + [ + ac_qt_includes="$withval" + ]) + +kde_qt_libs_given=no + +AC_ARG_WITH(qt-libraries, + [ --with-qt-libraries=DIR where the Qt library is installed.], + [ ac_qt_libraries="$withval" + kde_qt_libs_given=yes + ]) + +AC_CACHE_VAL(ac_cv_have_qt, +[#try to guess Qt locations + +qt_incdirs="" +for dir in $kde_qt_dirs; do + qt_incdirs="$qt_incdirs $dir/include $dir" +done +qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 $x_includes" +if test ! "$ac_qt_includes" = "NO"; then + qt_incdirs="$ac_qt_includes $qt_incdirs" +fi + +if test "$kde_qtver" != "1"; then + kde_qt_header=qstyle.h +else + kde_qt_header=qglobal.h +fi + +AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir) +ac_qt_includes="$qt_incdir" + +qt_libdirs="" +for dir in $kde_qt_dirs; do + qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir" +done +qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries" +if test ! "$ac_qt_libraries" = "NO"; then + qt_libdir=$ac_qt_libraries +else + qt_libdirs="$ac_qt_libraries $qt_libdirs" + # if the Qt was given, the chance is too big that libqt.* doesn't exist + qt_libdir=NONE + for dir in $qt_libdirs; do + try="ls -1 $dir/${LIBQT_GLOB}" + if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done +fi + +ac_qt_libraries="$qt_libdir" + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +ac_cxxflags_safe="$CXXFLAGS" +ac_ldflags_safe="$LDFLAGS" +ac_libs_safe="$LIBS" + +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" +LIBS="$LIBS $LIBQT $KDE_MT_LIBS" + +KDE_PRINT_QT_PROGRAM + +if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* +else + echo "configure: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ac_qt_libraries="NO" +fi +rm -f conftest* +CXXFLAGS="$ac_cxxflags_safe" +LDFLAGS="$ac_ldflags_safe" +LIBS="$ac_libs_safe" + +AC_LANG_RESTORE +if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then + ac_cv_have_qt="have_qt=no" + ac_qt_notfound="" + missing_qt_mt="" + if test "$ac_qt_includes" = NO; then + if test "$ac_qt_libraries" = NO; then + ac_qt_notfound="(headers and libraries)"; + else + ac_qt_notfound="(headers)"; + fi + else + if test "x$kde_use_qt_mt" = "xyes"; then + missing_qt_mt=" +Make sure that you have compiled Qt with thread support!" + ac_qt_notfound="(library $qtlib-mt)"; + else + ac_qt_notfound="(library $qtlib)"; + fi + fi + + AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation! +For more details about this problem, look at the end of config.log.$missing_qt_mt]) +else + have_qt="yes" +fi +]) + +eval "$ac_cv_have_qt" + +if test "$have_qt" != yes; then + AC_MSG_RESULT([$have_qt]); +else + ac_cv_have_qt="have_qt=yes \ + ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries" + AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT]) + + qt_libraries="$ac_qt_libraries" + qt_includes="$ac_qt_includes" +fi + +if test ! "$kde_qt_libs_given" = "yes"; then +KDE_CHECK_QT_DIRECT(qt_libraries= ,[]) +fi + +AC_SUBST(qt_libraries) +AC_SUBST(qt_includes) + +if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then + QT_INCLUDES="" +else + QT_INCLUDES="-I$qt_includes" + all_includes="$QT_INCLUDES $all_includes" +fi + +if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then + QT_LDFLAGS="" +else + QT_LDFLAGS="-L$qt_libraries" + all_libraries="$all_libraries $QT_LDFLAGS" +fi +test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS" + +AC_SUBST(QT_INCLUDES) +AC_SUBST(QT_LDFLAGS) +AC_PATH_QT_MOC_UIC + +KDE_CHECK_QT_JPEG + +if test "x$kde_use_qt_emb" != "xyes"; then +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBPNG) -lXext $(LIB_X11) $(LIBSM)' +else +LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBPNG)' +fi +test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS" + +AC_SUBST(LIB_QT) +AC_SUBST(LIB_QPE) + +AC_SUBST(kde_qtver) +]) + +AC_DEFUN(AC_PATH_QT, +[ +AC_PATH_QT_1_3 +]) + +AC_DEFUN(KDE_CHECK_UIC_PLUGINS, +[ +AC_REQUIRE([AC_PATH_QT_MOC_UIC]) + +if test x$ac_uic_supports_libpath = xyes; then + +AC_MSG_CHECKING([if UIC has KDE plugins available]) +AC_CACHE_VAL(kde_cv_uic_plugins, +[ +cat > actest.ui << EOF + +NewConnectionDialog + + + + testInput + + + + +EOF + + + +kde_cv_uic_plugins=no +kde_line="$UIC_PATH -L $kde_widgetdir" +if test x$ac_uic_supports_nounload = xyes; then + kde_line="$kde_line -nounload" +fi +kde_line="$kde_line -impl actest.h actest.ui > actest.cpp" +if AC_TRY_EVAL(kde_line); then + if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then + kde_cv_uic_plugins=yes + fi +fi +rm -f actest.ui actest.cpp +]) + +if test "$kde_cv_uic_plugins" = yes; then + AC_MSG_RESULT([yes]) +else + AC_MSG_ERROR([not found - you need to install kdelibs first.]) +fi +fi +]) + +AC_DEFUN(KDE_CHECK_FINAL, +[ + AC_ARG_ENABLE(final, [ --enable-final build size optimized apps (experimental - needs lots of memory)], + kde_use_final=$enableval, kde_use_final=no) + + KDE_COMPILER_REPO + if test "x$kde_use_final" = "xyes"; then + KDE_USE_FINAL_TRUE="" + KDE_USE_FINAL_FALSE="#" + else + KDE_USE_FINAL_TRUE="#" + KDE_USE_FINAL_FALSE="" + fi + AC_SUBST(KDE_USE_FINAL_TRUE) + AC_SUBST(KDE_USE_FINAL_FALSE) + + AC_ARG_ENABLE(closure, [ --disable-closure don't delay template instantiation], + kde_use_closure=$enableval, kde_use_closure=yes) + + if test "x$kde_use_closure" = "xyes"; then + KDE_USE_CLOSURE_TRUE="" + KDE_USE_CLOSURE_FALSE="#" +# CXXFLAGS="$CXXFLAGS $REPO" + else + KDE_USE_CLOSURE_TRUE="#" + KDE_USE_CLOSURE_FALSE="" + fi + AC_SUBST(KDE_USE_CLOSURE_TRUE) + AC_SUBST(KDE_USE_CLOSURE_FALSE) +]) + +dnl ------------------------------------------------------------------------ +dnl Now, the same with KDE +dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed) +dnl and $(kde_includes) will be the kdehdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_BASE_PATH_KDE, +[ +AC_PREREQ([2.13]) +AC_REQUIRE([AC_PATH_QT])dnl +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_CHECK_RPATH +AC_MSG_CHECKING([for KDE]) + +if test "${prefix}" != NONE; then + kde_includes=${prefix}/include + ac_kde_includes=$prefix/include + + if test "${exec_prefix}" != NONE; then + kde_libraries=${libdir} + ac_kde_libraries=$libdir + if test "$ac_kde_libraries" = '${exec_prefix}/lib'${kdelibsuff}; then + ac_kde_libraries=$exec_prefix/lib${kdelibsuff} + fi + else + kde_libraries=${prefix}/lib${kdelibsuff} + ac_kde_libraries=$prefix/lib${kdelibsuff} + fi +else + ac_kde_includes= + ac_kde_libraries= + kde_libraries="" + kde_includes="" +fi + +AC_CACHE_VAL(ac_cv_have_kde, +[#try to guess kde locations + +if test "$kde_qtver" = 1; then + kde_check_header="ksock.h" + kde_check_lib="libkdecore.la" +else + kde_check_header="ksharedptr.h" + kde_check_lib="libkio.la" +fi + +if test -z "$1"; then + +kde_incdirs="/usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes" +test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs" +kde_incdirs="$ac_kde_includes $kde_incdirs" +AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir) +ac_kde_includes="$kde_incdir" + +if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then + AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE headers installed. This will fail. +So, check this please and use another prefix!]) +fi + +kde_libdirs="/usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}" +test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs" +kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs" +AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir) +ac_kde_libraries="$kde_libdir" + +kde_widgetdir=NO +dnl this might be somewhere else +AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir) + +if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then +AC_MSG_ERROR([ +in the prefix, you've chosen, are no KDE libraries installed. This will fail. +So, check this please and use another prefix!]) +fi + +if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then +AC_MSG_ERROR([ +I can't find the designer plugins. These are required and should have been installed +by kdelibs]) +fi + +if test -n "$kde_widgetdir"; then + kde_widgetdir="$kde_widgetdir/kde3/plugins/designer" +fi + + +if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then + ac_cv_have_kde="have_kde=no" +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" +fi + +else dnl test -z $1 + + ac_cv_have_kde="have_kde=no" + +fi +])dnl + +eval "$ac_cv_have_kde" + +if test "$have_kde" != "yes"; then + if test "${prefix}" = NONE; then + ac_kde_prefix="$ac_default_prefix" + else + ac_kde_prefix="$prefix" + fi + if test "$exec_prefix" = NONE; then + ac_kde_exec_prefix="$ac_kde_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix]) + else + ac_kde_exec_prefix="$exec_prefix" + AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix]) + fi + + kde_libraries="${libdir}" + kde_includes=${ac_kde_prefix}/include + +else + ac_cv_have_kde="have_kde=yes \ + ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries" + AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes]) + + kde_libraries="$ac_kde_libraries" + kde_includes="$ac_kde_includes" +fi +AC_SUBST(kde_libraries) +AC_SUBST(kde_includes) + +if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then + KDE_INCLUDES="" +else + KDE_INCLUDES="-I$kde_includes" + all_includes="$KDE_INCLUDES $all_includes" +fi + +KDE_LDFLAGS="-L$kde_libraries" +if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then + all_libraries="$all_libraries $KDE_LDFLAGS" +fi + +AC_SUBST(KDE_LDFLAGS) +AC_SUBST(KDE_INCLUDES) + +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +all_libraries="$all_libraries $USER_LDFLAGS" +all_includes="$all_includes $USER_INCLUDES" +AC_SUBST(all_includes) +AC_SUBST(all_libraries) + +if test -z "$1"; then +KDE_CHECK_UIC_PLUGINS +fi + +ac_kde_libraries="$kde_libdir" + +AC_SUBST(AUTODIRS) + + +]) + +AC_DEFUN(KDE_CHECK_EXTRA_LIBS, +[ +AC_MSG_CHECKING(for extra includes) +AC_ARG_WITH(extra-includes, [ --with-extra-includes=DIR + adds non standard include paths], + kde_use_extra_includes="$withval", + kde_use_extra_includes=NONE +) +kde_extra_includes= +if test -n "$kde_use_extra_includes" && \ + test "$kde_use_extra_includes" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_includes; do + kde_extra_includes="$kde_extra_includes $dir" + USER_INCLUDES="$USER_INCLUDES -I$dir" + done + IFS=$ac_save_ifs + kde_use_extra_includes="added" +else + kde_use_extra_includes="no" +fi +AC_SUBST(USER_INCLUDES) + +AC_MSG_RESULT($kde_use_extra_includes) + +kde_extra_libs= +AC_MSG_CHECKING(for extra libs) +AC_ARG_WITH(extra-libs, [ --with-extra-libs=DIR adds non standard library paths], + kde_use_extra_libs=$withval, + kde_use_extra_libs=NONE +) +if test -n "$kde_use_extra_libs" && \ + test "$kde_use_extra_libs" != "NONE"; then + + ac_save_ifs=$IFS + IFS=':' + for dir in $kde_use_extra_libs; do + kde_extra_libs="$kde_extra_libs $dir" + KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir" + USER_LDFLAGS="$USER_LDFLAGS -L$dir" + done + IFS=$ac_save_ifs + kde_use_extra_libs="added" +else + kde_use_extra_libs="no" +fi + +AC_SUBST(USER_LDFLAGS) + +AC_MSG_RESULT($kde_use_extra_libs) + +]) + +AC_DEFUN(KDE_1_CHECK_PATH_HEADERS, +[ + AC_MSG_CHECKING([for KDE headers installed]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS +cat > conftest.$ac_ext < +#endif +#include +#include "confdefs.h" +#include + +int main() { + printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data()); + printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data()); + printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data()); + printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data()); + printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data()); + printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data()); + printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data()); + printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data()); + printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data()); + printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data()); + printf("kde_wallpaperdir=\\"%s\\"\n", + KApplication::kde_wallpaperdir().data()); + printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data()); + printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data()); + printf("kde_servicesdir=\\"/tmp/dummy\\"\n"); + printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n"); + printf("kde_moduledir=\\"/tmp/dummy\\"\n"); + printf("kde_styledir=\\"/tmp/dummy\\"\n"); + printf("kde_widgetdir=\\"/tmp/dummy\\"\n"); + return 0; + } +EOF + + ac_compile='${CXX-g++} -c $CXXFLAGS $all_includes $CPPFLAGS conftest.$ac_ext' + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + else + AC_MSG_ERROR([your system is not able to compile a small KDE application! +Check, if you installed the KDE header files correctly. +For more details about this problem, look at the end of config.log.]) + fi + + AC_LANG_RESTORE +]) + +AC_DEFUN(KDE_CHECK_KDEQTADDON, +[ +AC_MSG_CHECKING(for kde-qt-addon) +AC_CACHE_VAL(kde_cv_have_kdeqtaddon, +[ + kde_ldflags_safe="$LDFLAGS" + kde_libs_safe="$LIBS" + kde_cxxflags_safe="$CXXFLAGS" + + LIBS="-lkde-qt-addon $LIBQT $LIBS" + CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes" + LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS" + + AC_TRY_LINK([ + #include + ], + [ + QDomDocument doc; + ], + kde_cv_have_kdeqtaddon=yes, + kde_cv_have_kdeqtaddon=no + ) + + LDFLAGS=$kde_ldflags_safe + LIBS=$kde_libs_safe + CXXFLAGS=$kde_cxxflags_safe +]) + +AC_MSG_RESULT($kde_cv_have_kdeqtaddon) + +if test "$kde_cv_have_kdeqtaddon" = "no"; then + AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first. +It is a separate package (and CVS module) named kde-qt-addon.]) +fi +]) + +AC_DEFUN(KDE_CHECK_KIMGIO, +[ + AC_REQUIRE([AC_BASE_PATH_KDE]) + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + AC_REQUIRE([AC_FIND_TIFF]) + AC_REQUIRE([AC_FIND_JPEG]) + AC_REQUIRE([AC_FIND_PNG]) + AC_REQUIRE([KDE_CREATE_LIBS_ALIASES]) + + if test "$1" = "existance"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + kde_save_LIBS="$LIBS" + LIBS="$LIBS $all_libraries $LIBJPEG $LIBTIFF $LIBPNG $LIBQT -lm" + AC_CHECK_LIB(kimgio, kimgioRegister, [ + LIBKIMGIO_EXISTS=yes],LIBKIMGIO_EXISTS=no) + LIBS="$kde_save_LIBS" + AC_LANG_RESTORE + else + LIBKIMGIO_EXISTS=yes + fi + + if test "$LIBKIMGIO_EXISTS" = "yes"; then + LIB_KIMGIO='-lkimgio' + else + LIB_KIMGIO='' + fi + AC_SUBST(LIB_KIMGIO) +]) + +AC_DEFUN(KDE_CREATE_LIBS_ALIASES, +[ + AC_REQUIRE([KDE_MISC_TESTS]) + AC_REQUIRE([KDE_CHECK_LIBDL]) + AC_REQUIRE([K_PATH_X]) + +if test $kde_qtver = 3; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KABC, "-lkabc") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +# these are for backward compatibility + AC_SUBST(LIB_KSYCOCA, "-lkio") + AC_SUBST(LIB_KFILE, "-lkio") +elif test $kde_qtver = 2; then + AC_SUBST(LIB_KDECORE, "-lkdecore") + AC_SUBST(LIB_KDEUI, "-lkdeui") + AC_SUBST(LIB_KIO, "-lkio") + AC_SUBST(LIB_KSYCOCA, "-lksycoca") + AC_SUBST(LIB_SMB, "-lsmb") + AC_SUBST(LIB_KFILE, "-lkfile") + AC_SUBST(LIB_KAB, "-lkab") + AC_SUBST(LIB_KHTML, "-lkhtml") + AC_SUBST(LIB_KSPELL, "-lkspell") + AC_SUBST(LIB_KPARTS, "-lkparts") + AC_SUBST(LIB_KDEPRINT, "-lkdeprint") +else + AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)") + AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)") + AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)") + AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)") + AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)") +fi +]) + +AC_DEFUN(AC_PATH_KDE, +[ + AC_BASE_PATH_KDE + AC_ARG_ENABLE(path-check, [ --disable-path-check don't try to find out, where to install], + [ + if test "$enableval" = "no"; + then ac_use_path_checking="default" + else ac_use_path_checking="" + fi + ], + [ + if test "$kde_qtver" = 1; + then ac_use_path_checking="" + else ac_use_path_checking="default" + fi + ] + ) + + AC_CREATE_KFSSTND($ac_use_path_checking) + + AC_SUBST_KFSSTND + KDE_CREATE_LIBS_ALIASES +]) + +dnl KDE_CHECK_FUNC_EXT(, [headers], [sample-use], [C prototype], [autoheader define], [call if found]) +AC_DEFUN(KDE_CHECK_FUNC_EXT, +[ +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(kde_cv_func_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +save_CXXFLAGS="$CXXFLAGS" +kde_safe_LIBS="$LIBS" +LIBS="$LIBS $X_EXTRA_LIBS" +if test "$GXX" = "yes"; then + CXXFLAGS="$CXXFLAGS -pedantic-errors" +fi +AC_TRY_COMPILE([ +$2 +], +[ +$3 +], +kde_cv_func_$1=yes, +kde_cv_func_$1=no) +CXXFLAGS="$save_CXXFLAGS" +LIBS=$kde_safe_LIBS +AC_LANG_RESTORE +]) + +AC_MSG_RESULT($kde_cv_func_$1) + +AC_MSG_CHECKING([if $1 needs custom prototype]) +AC_CACHE_VAL(kde_cv_proto_$1, +[ +if test "x$kde_cv_func_$1" = xyes; then + kde_cv_proto_$1=no +else + case "$1" in + setenv|unsetenv|usleep|getdomainname|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat) + kde_cv_proto_$1="yes - in libkdefakes" + ;; + *) + kde_cv_proto_$1=unknown + ;; + esac +fi + +if test "x$kde_cv_proto_$1" = xunknown; then + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + kde_safe_libs=$LIBS + LIBS="$LIBS $X_EXTRA_LIBS" + AC_TRY_LINK([ +$2 + +extern "C" $4; +], +[ +$3 +], +[ kde_cv_func_$1=yes + kde_cv_proto_$1=yes ], + [kde_cv_proto_$1="$1 unavailable"] +) +LIBS=$kde_safe_libs +AC_LANG_RESTORE +fi +]) +AC_MSG_RESULT($kde_cv_proto_$1) + +if test "x$kde_cv_func_$1" = xyes; then + AC_DEFINE(HAVE_$5, 1, [Define if you have $1]) + $6 +fi +if test "x$kde_cv_proto_$1" = xno; then + AC_DEFINE(HAVE_$5_PROTO, 1, + [Define if you have the $1 prototype]) +fi + +AH_VERBATIM([_HAVE_$5_PROTO], +[ +#if !defined(HAVE_$5_PROTO) +#ifdef __cplusplus +extern "C" +#endif +$4; +#endif +]) +]) + +AC_DEFUN(AC_CHECK_SETENV, +[ + KDE_CHECK_FUNC_EXT(setenv, [ +#include +], + [setenv("VAR", "VALUE", 1);], + [int setenv (const char *, const char *, int)], + [SETENV]) +]) + +AC_DEFUN(AC_CHECK_UNSETENV, +[ + KDE_CHECK_FUNC_EXT(unsetenv, [ +#include +], + [unsetenv("VAR");], + [void unsetenv (const char *)], + [UNSETENV]) +]) + +AC_DEFUN(AC_CHECK_GETDOMAINNAME, +[ + KDE_CHECK_FUNC_EXT(getdomainname, [ +#include +#include +], + [ +char buffer[200]; +getdomainname(buffer, 200); +], + [int getdomainname (char *, unsigned int)], + [GETDOMAINNAME]) +]) + +AC_DEFUN(AC_CHECK_GETHOSTNAME, +[ + KDE_CHECK_FUNC_EXT(gethostname, [ +#include +#include +], + [ +char buffer[200]; +gethostname(buffer, 200); +], + [int gethostname (char *, unsigned int)], + [GETHOSTNAME]) +]) + +AC_DEFUN(AC_CHECK_USLEEP, +[ + KDE_CHECK_FUNC_EXT(usleep, [ +#include +], + [ +usleep(200); +], + [int usleep (unsigned int)], + [USLEEP]) +]) + + +AC_DEFUN(AC_CHECK_RANDOM, +[ + KDE_CHECK_FUNC_EXT(random, [ +#include +], + [ +random(); +], + [long int random(void)], + [RANDOM]) + + KDE_CHECK_FUNC_EXT(srandom, [ +#include +], + [ +srandom(27); +], + [void srandom(unsigned int)], + [SRANDOM]) + +]) + +AC_DEFUN(AC_CHECK_INITGROUPS, +[ + KDE_CHECK_FUNC_EXT(initgroups, [ +#include +#include +#include +], + [ +char buffer[200]; +initgroups(buffer, 27); +], + [int initgroups(const char *, gid_t)], + [INITGROUPS]) +]) + +AC_DEFUN(AC_CHECK_MKSTEMP, +[ + KDE_CHECK_FUNC_EXT(mkstemp, [ +#include +], + [ +mkstemp("/tmp/aaaXXXXXX"); +], + [int mkstemp(char *)], + [MKSTEMP]) +]) + +AC_DEFUN(AC_CHECK_MKSTEMPS, +[ + KDE_CHECK_FUNC_EXT(mkstemps, [ +#include +#include +], + [ +mkstemps("/tmp/aaaXXXXXX", 6); +], + [int mkstemps(char *, int)], + [MKSTEMPS]) +]) + +AC_DEFUN(AC_CHECK_RES_INIT, +[ + AC_MSG_CHECKING([if res_init needs -lresolv]) + kde_libs_safe="$LIBS" + LIBS="$LIBS $X_EXTRA_LIBS -lresolv" + AC_TRY_LINK( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + LIBRESOLV="-lresolv" + AC_MSG_RESULT(yes) + X_EXTRA_LIBS="$X_EXTRA_LIBS $LIBRESOLV" + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) + LIBS=$kde_libs_safe + AC_SUBST(LIBRESOLV) + + AC_MSG_CHECKING([if res_init is available]) + AC_TRY_COMPILE( + [ +#include +#include +#include +#include + ], + [ + res_init(); + ], + [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function]) + ], + [ AC_MSG_RESULT(no) ] + ) +]) + +AC_DEFUN(AC_CHECK_STRLCPY, +[ + KDE_CHECK_FUNC_EXT(strlcpy, [ +#include +], +[ char buf[20]; + strlcpy(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcpy(char*, const char*, unsigned long)], + [STRLCPY]) +]) + +AC_DEFUN(AC_CHECK_STRLCAT, +[ + KDE_CHECK_FUNC_EXT(strlcat, [ +#include +], +[ char buf[20]; + buf[0]='\0'; + strlcat(buf, "KDE function test", sizeof(buf)); +], + [unsigned long strlcat(char*, const char*, unsigned long)], + [STRLCAT]) +]) + +AC_DEFUN(AC_FIND_GIF, + [AC_MSG_CHECKING([for giflib]) +AC_CACHE_VAL(ac_cv_lib_gif, +[ac_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes"; then +LIBS="$all_libraries -lgif -lX11 $LIBSOCKET" +else +LIBS="$all_libraries -lgif" +fi +AC_TRY_LINK(dnl +[ +#ifdef __cplusplus +extern "C" { +#endif +int GifLastError(void); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [return GifLastError();], + eval "ac_cv_lib_gif=yes", + eval "ac_cv_lib_gif=no") +LIBS="$ac_save_LIBS" +])dnl +if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif]) +else + AC_MSG_ERROR(You need giflib30. Please install the kdesupport package) +fi +]) + +AC_DEFUN(KDE_FIND_JPEG_HELPER, +[ +AC_MSG_CHECKING([for libjpeg$2]) +AC_CACHE_VAL(ac_cv_lib_jpeg_$1, +[ +AC_LANG_C +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[/* Override any gcc2 internal prototype to avoid an error. */ +struct jpeg_decompress_struct; +typedef struct jpeg_decompress_struct * j_decompress_ptr; +typedef int size_t; +#ifdef __cplusplus +extern "C" { +#endif + void jpeg_CreateDecompress(j_decompress_ptr cinfo, + int version, size_t structsize); +#ifdef __cplusplus +} +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +], + [jpeg_CreateDecompress(0L, 0, 0);], + eval "ac_cv_lib_jpeg_$1=-ljpeg$2", + eval "ac_cv_lib_jpeg_$1=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then + LIBJPEG="$ac_cv_lib_jpeg_$1" + AC_MSG_RESULT($ac_cv_lib_jpeg_$1) +else + AC_MSG_RESULT(no) + $3 +fi + +]) + +AC_DEFUN(AC_FIND_JPEG, +[ +dnl first look for libraries +KDE_FIND_JPEG_HELPER(6b, 6b, + KDE_FIND_JPEG_HELPER(normal, [], + [ + LIBJPEG= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h +dnl requires system dependent includes loaded before it) +jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes" +AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir) +test "x$jpeg_incdir" = xNO && jpeg_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no jpeg support in khtml) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then + AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg]) +else + if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then + AC_MSG_WARN([ +There is an installation error in jpeg support. You seem to have only one +of either the headers _or_ the libraries installed. You may need to either +provide correct --with-extra-... options, or the development package of +libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/ +Disabling JPEG support. +]) + else + AC_MSG_WARN([libjpeg not found. disable JPEG support.]) + fi + jpeg_incdir= + LIBJPEG= +fi + +AC_SUBST(LIBJPEG) +AH_VERBATIM(_AC_CHECK_JPEG, +[/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif +]) +]) + +AC_DEFUN(KDE_CHECK_QT_JPEG, +[ +AC_MSG_CHECKING([if Qt needs $LIBJPEG]) +AC_CACHE_VAL(kde_cv_qt_jpeg, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS $LIBQT" +LIBS=`echo $LIBS | sed "s/$LIBJPEG//"` +ac_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[#include ], + [ + int argc; + char** argv; + QApplication app(argc, argv);], + eval "kde_cv_qt_jpeg=no", + eval "kde_cv_qt_jpeg=yes") +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then + AC_MSG_RESULT(yes) + LIBJPEG_QT='$(LIBJPEG)' +else + AC_MSG_RESULT(no) + LIBJPEG_QT= +fi + +]) + +AC_DEFUN(AC_FIND_ZLIB, +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for libz]) +AC_CACHE_VAL(ac_cv_lib_z, +[ +AC_LANG_C +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#include +], + [return (zlibVersion() == ZLIB_VERSION); ], + eval "ac_cv_lib_z='-lz'", + eval "ac_cv_lib_z=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if test ! "$ac_cv_lib_z" = no; then + AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz]) + LIBZ="$ac_cv_lib_z" + AC_SUBST(LIBZ) + AC_MSG_RESULT($ac_cv_lib_z) +else + AC_MSG_ERROR(not found. Check your installation and look into config.log) + LIBZ="" + AC_SUBST(LIBZ) +fi +]) + +AC_DEFUN(KDE_TRY_TIFFLIB, +[ +AC_MSG_CHECKING([for libtiff $1]) + +AC_CACHE_VAL(kde_cv_libtiff_$1, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes"; then +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm" +else +LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm" +fi +kde_save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES" + +AC_TRY_LINK(dnl +[ +#include +], + [return (TIFFOpen( "", "r") == 0); ], +[ + kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ" +], [ + kde_cv_libtiff_$1=no +]) + +LIBS="$kde_save_LIBS" +CXXFLAGS="$kde_save_CXXFLAGS" +AC_LANG_RESTORE +]) + +if test "$kde_cv_libtiff_$1" = "no"; then + AC_MSG_RESULT(no) + LIBTIFF="" + $3 +else + LIBTIFF="$kde_cv_libtiff_$1" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff]) + $2 +fi + +]) + +AC_DEFUN(AC_FIND_TIFF, +[ +AC_REQUIRE([K_PATH_X]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + +KDE_TRY_TIFFLIB(tiff, [], + KDE_TRY_TIFFLIB(tiff34)) + +AC_SUBST(LIBTIFF) +]) + + +AC_DEFUN(AC_FIND_PNG, +[ +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_REQUIRE([AC_FIND_ZLIB]) +AC_MSG_CHECKING([for libpng]) +AC_CACHE_VAL(ac_cv_lib_png, +[ +kde_save_LIBS="$LIBS" +if test "x$kde_use_qt_emb" != "xyes"; then +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET" +else +LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm" +fi +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_LANG_C +AC_TRY_LINK(dnl + [ + #include + ], + [ + png_structp png_ptr = png_create_read_struct( /* image ptr */ + PNG_LIBPNG_VER_STRING, 0, 0, 0 ); + return( png_ptr != 0 ); + ], + eval "ac_cv_lib_png='-lpng $LIBZ -lm'", + eval "ac_cv_lib_png=no" +) +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then + AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng]) + LIBPNG="$ac_cv_lib_png" + AC_SUBST(LIBPNG) + AC_MSG_RESULT($ac_cv_lib_png) +else + AC_MSG_RESULT(no) + LIBPNG="" + AC_SUBST(LIBPNG) +fi +]) + +AC_DEFUN(AC_CHECK_BOOL, +[ + AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool]) +]) + +AC_DEFUN(AC_CHECK_GNU_EXTENSIONS, +[ +AC_MSG_CHECKING(if you need GNU extensions) +AC_CACHE_VAL(ac_cv_gnu_extensions, +[ +cat > conftest.c << EOF +#include + +#ifdef __GNU_LIBRARY__ +yes +#endif +EOF + +if (eval "$ac_cpp conftest.c") 2>&5 | + egrep "yes" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_gnu_extensions=yes +else + ac_cv_gnu_extensions=no +fi +]) + +AC_MSG_RESULT($ac_cv_gnu_extensions) +if test "$ac_cv_gnu_extensions" = "yes"; then + AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions]) +fi +]) + +AC_DEFUN(KDE_CHECK_COMPILER_FLAG, +[ +AC_MSG_CHECKING(whether $CXX supports -$1) +kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'` +AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -$1" + AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], []) + CXXFLAGS="$save_CXXFLAGS" + AC_LANG_RESTORE +]) +if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then + AC_MSG_RESULT(yes) + : + $2 +else + AC_MSG_RESULT(no) + : + $3 +fi +]) + +dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables +dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever]) +dnl it's all white-space separated +AC_DEFUN(AC_REMOVE_FORBIDDEN, +[ __val=$$1 + __forbid=" $2 " + if test -n "$__val"; then + __new="" + ac_save_IFS=$IFS + IFS=" " + for i in $__val; do + case "$__forbid" in + *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;; + *) # Careful to not add spaces, where there were none, because otherwise + # libtool gets confused, if we change e.g. CXX + if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;; + esac + done + IFS=$ac_save_IFS + $1=$__new + fi +]) + +dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given +AC_DEFUN(AC_VALIDIFY_CXXFLAGS, +[dnl +if test "x$kde_use_qt_emb" != "xyes"; then + AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath]) +else + AC_REMOVE_FORBIDDEN(CXX, [-rpath]) + AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath]) +fi +]) + +AC_DEFUN(AC_CHECK_COMPILERS, +[ + AC_ARG_ENABLE(debug,[ --enable-debug[=ARG] enables debug symbols (yes|no|full) [default=no]], + [ + case $enableval in + yes) + kde_use_debug_code="yes" + kde_use_debug_define=no + ;; + full) + kde_use_debug_code="full" + kde_use_debug_define=no + ;; + *) + kde_use_debug_code="no" + kde_use_debug_define=yes + ;; + esac + ], + [kde_use_debug_code="no" + kde_use_debug_define=no + ]) + + dnl Just for configure --help + AC_ARG_ENABLE(dummyoption,[ --disable-debug disables debug output and debug symbols [default=no]],[],[]) + + AC_ARG_ENABLE(strict,[ --enable-strict compiles with strict compiler options (may not work!)], + [ + if test $enableval = "no"; then + kde_use_strict_options="no" + else + kde_use_strict_options="yes" + fi + ], [kde_use_strict_options="no"]) + + AC_ARG_ENABLE(warnings,[ --disable-warnings disables compilation with -Wall and similiar], + [ + if test $enableval = "no"; then + kde_use_warnings="no" + else + kde_use_warnings="yes" + fi + ], [kde_use_warnings="yes"]) + + dnl enable warnings for debug build + if test "$kde_use_debug_code" != "no"; then + kde_use_warnings=yes + fi + + AC_ARG_ENABLE(profile,[ --enable-profile creates profiling infos [default=no]], + [kde_use_profiling=$enableval], + [kde_use_profiling="no"] + ) + + dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS + CFLAGS=" $CFLAGS" + + AC_PROG_CC + + AC_PROG_CPP + + if test "$GCC" = "yes"; then + if test "$kde_use_debug_code" != "no"; then + if test $kde_use_debug_code = "full"; then + CFLAGS="-g3 $CFLAGS" + else + CFLAGS="-g -O2 $CFLAGS" + fi + else + CFLAGS="-O2 $CFLAGS" + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CFLAGS="-DNDEBUG $CFLAGS" + fi + + + case "$host" in + *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";; + *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";; + esac + + if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then + LDFLAGS="" + fi + + CXXFLAGS=" $CXXFLAGS" + + AC_PROG_CXX + + if test "$GXX" = "yes" || test "$CXX" = "KCC"; then + if test "$kde_use_debug_code" != "no"; then + if test "$CXX" = "KCC"; then + CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings $CXXFLAGS" + else + if test "$kde_use_debug_code" = "full"; then + CXXFLAGS="-g3 $CXXFLAGS" + else + CXXFLAGS="-g -O2 $CXXFLAGS" + fi + fi + KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"]) + + dnl convenience compiler flags + KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""]) + AC_SUBST(WOVERLOADED_VIRTUAL) + else + if test "$CXX" = "KCC"; then + CXXFLAGS="+K3 $CXXFLAGS" + else + CXXFLAGS="-O2 $CXXFLAGS" + fi + fi + fi + + if test "$kde_use_debug_define" = "yes"; then + CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS" + fi + + if test "$kde_use_profiling" = "yes"; then + KDE_CHECK_COMPILER_FLAG(pg, + [ + CFLAGS="-pg $CFLAGS" + CXXFLAGS="-pg $CXXFLAGS" + ]) + fi + + if test "$kde_use_warnings" = "yes"; then + if test "$GCC" = "yes"; then + case $host in + *-*-linux-gnu) + CFLAGS="-ansi -W -Wall -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS" + CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion $CXXFLAGS" + ;; + esac + CXXFLAGS="-Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings $CXXFLAGS" + KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"]) + KDE_CHECK_COMPILER_FLAG(Wnon-virtual-dtor,[CXXFLAGS="-Wnon-virtual-dtor $CXXFLAGS"]) + fi + fi + + if test "$GCC" = "yes" && test "$kde_use_strict_options" = "yes"; then + CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS" + fi + + if test "$GXX" = "yes"; then + KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"]) + KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"]) + KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= ) + fi + if test "$CXX" = "KCC"; then + dnl unfortunately we currently cannot disable exception support in KCC + dnl because doing so is binary incompatible and Qt by default links with exceptions :-( + dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"]) + dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= ) + + AC_ARG_ENABLE(pch,[ --enable-pch enables precompiled header support (currently only KCC) [default=no]], + [ + kde_use_pch=$enableval + ],[kde_use_pch=no]) + + if test "$kde_use_pch" = "yes"; then + dnl TODO: support --pch-dir! + KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"]) + dnl the below works (but the dir must exist), but it's + dnl useless for a whole package. + dnl The are precompiled headers for each source file, so when compiling + dnl from scratch, it doesn't make a difference, and they take up + dnl around ~5Mb _per_ sourcefile. + dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp, + dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"]) + fi + dnl this flag controls inlining. by default KCC inlines in optimisation mode + dnl all implementations that are defined inside the class {} declaration. + dnl because of templates-compatibility with broken gcc compilers, this + dnl can cause excessive inlining. This flag limits it to a sane level + KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"]) + KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"]) + KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"]) + KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"]) + dnl Some source files are shared between multiple executables + dnl (or libraries) and some of those need template instantiations. + dnl In that case KCC needs to compile those sources with + dnl --one_instantiation_per_object. To make it easy for us we compile + dnl _all_ objects with that flag (--one_per is a shorthand). + KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"]) + fi + AC_SUBST(USE_EXCEPTIONS) + dnl obsolete macro - provided to keep things going + USE_RTTI= + AC_SUBST(USE_RTTI) + + case "$host" in + *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;; + *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";; + *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";; + *-*-solaris*) + if test "$GXX" = yes; then + libstdcpp=`$CXX -print-file-name=libstdc++.so` + if test ! -f $libstdcpp; then + AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so]) + fi + fi + ;; + esac + + AC_VALIDIFY_CXXFLAGS + + AC_PROG_CXXCPP + + if test "$GCC" = yes; then + NOOPT_CXXFLAGS=-O0 + NOOPT_CFLAGS=-O0 + fi + + AC_SUBST(NOOPT_CXXFLAGS) + AC_SUBST(NOOPT_CFLAGS) + + KDE_CHECK_FINAL + + ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), []) +]) + +AC_DEFUN(KDE_ADD_DEPENDENCIES, +[ + [A]M_DEPENDENCIES(CC) + [A]M_DEPENDENCIES(CXX) +]) + +dnl just a wrapper to clean up configure.in +AC_DEFUN(KDE_PROG_LIBTOOL, +[ +AC_REQUIRE([AC_CHECK_COMPILERS]) +AC_REQUIRE([AC_ENABLE_SHARED]) +AC_REQUIRE([AC_ENABLE_STATIC]) + +AC_REQUIRE([AC_LIBTOOL_DLOPEN]) +AC_REQUIRE([KDE_CHECK_LIB64]) + +AC_LANG_SAVE +AC_LANG_C +AC_OBJEXT +AC_EXEEXT +AC_LANG_RESTORE + +AM_PROG_LIBTOOL +AC_LIBTOOL_CXX + +LIBTOOL_SHELL="/bin/sh ./libtool" +# LIBTOOL="$LIBTOOL --silent" +KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)" +AC_SUBST(KDE_PLUGIN) + +AC_ARG_ENABLE(objprelink, [ --enable-objprelink prelink apps using objprelink (obsolete)], + kde_use_objprelink=$enableval, kde_use_objprelink=no) + if test "x$kde_use_objprelink" = "xyes"; then + AC_MSG_WARN([ +------------------------------------------------------------ +Configuration option --enable-objprelink is no longer useful. +See http:://objprelink.sourceforge.net for details: +1- Recent binutils are fast enough to do without objprelink. +2- Newer versions of objprelink do not need this option. +------------------------------------------------------------ +]) + fi +]) + +AC_DEFUN(KDE_CHECK_LIB64, +[ + kdelibsuff=none + AC_ARG_ENABLE(libsuffix, + AC_HELP_STRING([--enable-libsuffix], + [/lib directory suffix (64,32,none)]), + kdelibsuff=$enableval) + if test "$kdelibsuff" = "none"; then + if test -d /lib64 ; then + kdelibsuff=64 + else + kdelibsuff= + fi + fi + if test -z "$kdelibsuff"; then + AC_MSG_RESULT([not using lib directory suffix]) + AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories) + else + if test "$libdir" = '${exec_prefix}/lib'; then + libdir="$libdir${kdelibsuff}" + AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms + fi + AC_DEFINE_UNQUOTED(KDELIBSUFF, ["\"${kdelibsuff}\""], Suffix for lib directories) + AC_MSG_RESULT([using lib directory suffix $kdelibsuff]) + fi +]) + +AC_DEFUN(KDE_CHECK_TYPES, +[ AC_CHECK_SIZEOF(int, 4)dnl + AC_CHECK_SIZEOF(long, 4)dnl + AC_CHECK_SIZEOF(char *, 4)dnl + AC_CHECK_SIZEOF(char, 1)dnl +])dnl + +AC_DEFUN(KDE_DO_IT_ALL, +[ +AC_CANONICAL_SYSTEM +AC_ARG_PROGRAM +AM_INIT_AUTOMAKE($1, $2) +AM_DISABLE_LIBRARIES +AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) +AC_CHECK_COMPILERS +KDE_PROG_LIBTOOL +AM_KDE_WITH_NLS +AC_PATH_KDE +]) + +AC_DEFUN(AC_CHECK_RPATH, +[ +AC_MSG_CHECKING(for rpath) +AC_ARG_ENABLE(rpath, + [ --disable-rpath do not use the rpath feature of ld], + USE_RPATH=$enableval, USE_RPATH=yes) + +if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then + + KDE_RPATH="-R \$(kde_libraries)" + + if test -n "$qt_libraries"; then + KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)" + fi + dnl $x_libraries is set to /usr/lib in case + if test -n "$X_LDFLAGS"; then + KDE_RPATH="$KDE_RPATH -R \$(x_libraries)" + fi + if test -n "$KDE_EXTRA_RPATH"; then + KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)" + fi +fi +AC_SUBST(KDE_EXTRA_RPATH) +AC_SUBST(KDE_RPATH) +AC_MSG_RESULT($USE_RPATH) +]) + +dnl Check for the type of the third argument of getsockname +AC_DEFUN(AC_CHECK_SOCKLEN_T, [ + AC_MSG_CHECKING(for socklen_t) + AC_CACHE_VAL(ac_cv_socklen_t, [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ +#include +#include + ],[ +socklen_t a=0; +getsockname(0,(struct sockaddr*)0, &a); + ], + ac_cv_socklen_t=socklen_t, + AC_TRY_COMPILE([ +#include +#include + ],[ +int a=0; +getsockname(0,(struct sockaddr*)0, &a); + ], + ac_cv_socklen_t=int, + ac_cv_socklen_t=size_t + ) + ) + AC_LANG_RESTORE + ]) + + AC_MSG_RESULT($ac_cv_socklen_t) + if test "$ac_cv_socklen_t" != "socklen_t"; then + AC_DEFINE_UNQUOTED(socklen_t, $ac_cv_socklen_t, + [Define the real type of socklen_t]) + fi + AC_DEFINE_UNQUOTED(ksize_t, socklen_t, [Compatibility define]) + +]) + +dnl This is a merge of some macros out of the gettext aclocal.m4 +dnl since we don't need anything, I took the things we need +dnl the copyright for them is: +dnl > +dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. +dnl This Makefile.in is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. +dnl > +dnl for this file it is relicensed under LGPL + +AC_DEFUN(AM_KDE_WITH_NLS, + [ + dnl If we use NLS figure out what method + + AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt, + [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then + AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + MSGFMT=$GMSGFMT + AC_SUBST(GMSGFMT) + AC_SUBST(MSGFMT) + + AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext programs is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + AC_SUBST(XGETTEXT) + + ]) + +# Search path for a program which passes the given test. +# Ulrich Drepper , 1996. + +# serial 1 +# Stephan Kulow: I appended a _KDE against name conflicts + +dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN(AM_PATH_PROG_WITH_TEST_KDE, +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test -n "[$]$1"; then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + + +# Check whether LC_MESSAGES is available in . +# Ulrich Drepper , 1995. + +# serial 1 + +AC_DEFUN(AM_LC_MESSAGES, + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES]) + fi + fi]) + +dnl From Jim Meyering. +dnl FIXME: migrate into libit. + +AC_DEFUN([AM_FUNC_OBSTACK], +[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack, + [AC_TRY_LINK([#include "obstack.h"], + [struct obstack *mem;obstack_free(mem,(char *) 0)], + am_cv_func_obstack=yes, + am_cv_func_obstack=no)]) + if test $am_cv_func_obstack = yes; then + AC_DEFINE(HAVE_OBSTACK) + else + LIBOBJS="$LIBOBJS obstack.o" + fi +]) + +dnl From Jim Meyering. Use this if you use the GNU error.[ch]. +dnl FIXME: Migrate into libit + +AC_DEFUN([AM_FUNC_ERROR_AT_LINE], +[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line, + [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");], + am_cv_lib_error_at_line=yes, + am_cv_lib_error_at_line=no)]) + if test $am_cv_lib_error_at_line = no; then + LIBOBJS="$LIBOBJS error.o" + fi + AC_SUBST(LIBOBJS)dnl +]) + +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995. + +# serial 1 +# Stephan Kulow: I put a KDE in it to avoid name conflicts + +AC_DEFUN(AM_KDE_GNU_GETTEXT, + [AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([AM_KDE_WITH_NLS])dnl + AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h]) + AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \ +__argz_count __argz_stringify __argz_next]) + + AC_MSG_CHECKING(for stpcpy) + AC_CACHE_VAL(kde_cv_func_stpcpy, + [ + kde_safe_cxxflags=$CXXFLAGS + CXXFLAGS="-Wmissing-prototypes -Werror" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + #include + ], + [ + char buffer[200]; + stpcpy(buffer, buffer); + ], + kde_cv_func_stpcpy=yes, + kde_cv_func_stpcpy=no) + AC_LANG_RESTORE + CXXFLAGS=$kde_safe_cxxflags + ]) + AC_MSG_RESULT($kde_cv_func_stpcpy) + if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then + AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy]) + fi + + AM_LC_MESSAGES + + if test "x$CATOBJEXT" != "x"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for lang in ${LINGUAS=$ALL_LINGUAS}; do + case "$ALL_LINGUAS" in + *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; + esac + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + ]) + +AC_DEFUN(AC_HAVE_XPM, + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$XPM_LDFLAGS" && XPM_LDFLAGS= + test -z "$XPM_INCLUDE" && XPM_INCLUDE= + + AC_ARG_WITH(xpm, [ --without-xpm disable color pixmap XPM tests], + xpm_test=$withval, xpm_test="yes") + if test "x$xpm_test" = xno; then + ac_cv_have_xpm=no + else + AC_MSG_CHECKING(for XPM) + AC_CACHE_VAL(ac_cv_have_xpm, + [ + AC_LANG_C + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + if test "x$kde_use_qt_emb" != "xyes"; then + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET" + else + LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET" + fi + CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES" + test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS" + AC_TRY_LINK([#include ],[], + ac_cv_have_xpm="yes",ac_cv_have_xpm="no") + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + ])dnl + + if test "$ac_cv_have_xpm" = no; then + AC_MSG_RESULT(no) + XPM_LDFLAGS="" + XPMINC="" + $2 + else + AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support]) + if test "$XPM_LDFLAGS" = ""; then + XPMLIB='-lXpm $(LIB_X11)' + else + XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)' + fi + if test "$XPM_INCLUDE" = ""; then + XPMINC="" + else + XPMINC="-I$XPM_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(XPMINC) + AC_SUBST(XPMLIB) +]) + +AC_DEFUN(AC_HAVE_DPMS, + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS= + test -z "$DPMS_INCLUDE" && DPMS_INCLUDE= + DPMS_LIB= + + AC_ARG_WITH(dpms, [ --without-dpms disable DPMS power saving], + dpms_test=$withval, dpms_test="yes") + if test "x$dpms_test" = xno; then + ac_cv_have_dpms=no + else + AC_MSG_CHECKING(for DPMS) + dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms. + dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms". + AC_CACHE_VAL(ac_cv_have_dpms, + [ + if test "x$kde_use_qt_emb" = "xyes"; then + AC_MSG_RESULT(no) + ac_cv_have_dpms="no" + else + AC_LANG_C + ac_save_ldflags="$LDFLAGS" + ac_save_cflags="$CFLAGS" + ac_save_libs="$LIBS" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries -lX11 -lXext $LIBSOCKET" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + ac_cv_have_dpms="yes", [ + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries -lX11 -lXext $LIBSOCKET" + LIBS="$LIBS -lXdpms" + CFLAGS="$CFLAGS $X_INCLUDES" + test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS" + AC_TRY_LINK([ + #include + #include + #include + #include + int foo_test_dpms() + { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[], + [ + ac_cv_have_dpms="-lXdpms" + ],ac_cv_have_dpms="no") + ]) + LDFLAGS="$ac_save_ldflags" + CFLAGS="$ac_save_cflags" + LIBS="$ac_save_libs" + fi + ])dnl + + if test "$ac_cv_have_dpms" = no; then + AC_MSG_RESULT(no) + DPMS_LDFLAGS="" + DPMSINC="" + $2 + else + AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support]) + if test "$ac_cv_have_dpms" = "-lXdpms"; then + DPMS_LIB="-lXdpms" + fi + if test "$DPMS_LDFLAGS" = ""; then + DPMSLIB="$DPMS_LIB "'$(LIB_X11)' + else + DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)' + fi + if test "$DPMS_INCLUDE" = ""; then + DPMSINC="" + else + DPMSINC="-I$DPMS_INCLUDE" + fi + AC_MSG_RESULT(yes) + $1 + fi + fi + AC_SUBST(DPMSINC) + AC_SUBST(DPMSLIB) +]) + +AC_DEFUN(AC_HAVE_GL, + [AC_REQUIRE_CPP()dnl + AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) + + test -z "$GL_LDFLAGS" && GL_LDFLAGS= + test -z "$GL_INCLUDE" && GL_INCLUDE= + + AC_ARG_WITH(gl, [ --without-gl disable 3D GL modes], + gl_test=$withval, gl_test="yes") + if test "x$kde_use_qt_emb" = "xyes"; then + # GL and Qt Embedded is a no-go for now. + ac_cv_have_gl=no + elif test "x$gl_test" = xno; then + ac_cv_have_gl=no + else + AC_MSG_CHECKING(for GL) + AC_CACHE_VAL(ac_cv_have_gl, + [ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_ldflags="$LDFLAGS" + ac_save_cxxflags="$CXXFLAGS" + LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries -lMesaGL -lMesaGLU" + test "x$kde_use_qt_emb" != xyes && LDFLAGS="$LDFLAGS -lX11" + LDFLAGS="$LDFLAGS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$CFLAGS $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="mesa", ac_cv_have_gl="no") + if test "x$ac_cv_have_gl" = "xno"; then + LDFLAGS="$ac_save_ldflags $X_LDFLAGS $GL_LDFLAGS $all_libraries -lGLU -lGL" + test "x$kde_use_qt_emb" != xyes && LDFLAGS="$LDFLAGS -lX11" + LDFLAGS="$LDFLAGS $LIB_XEXT -lm $LIBSOCKET" + CXXFLAGS="$ac_save_cflags $X_INCLUDES" + test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS" + AC_TRY_LINK([#include +#include +], [], + ac_cv_have_gl="yes", ac_cv_have_gl="no") + fi + AC_LANG_RESTORE + LDFLAGS="$ac_save_ldflags" + CXXFLAGS="$ac_save_cxxflags" + ])dnl + + if test "$ac_cv_have_gl" = "no"; then + AC_MSG_RESULT(no) + GL_LDFLAGS="" + GLINC="" + $2 + else + AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)]) + if test "$GL_LDFLAGS" = ""; then + if test "$ac_cv_have_gl" = "mesa"; then + GLLIB='-lMesaGLU -lMesaGL $(LIB_X11)' + else + GLLIB='-lGLU -lGL $(LIB_X11)' + fi + else + if test "$ac_cv_have_gl" = "mesa"; then + GLLIB="$GL_LDFLAGS -lMesaGLU -lMesaGL "'$(LIB_X11)' + else + GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)' + fi + fi + if test "$GL_INCLUDE" = ""; then + GLINC="" + else + GLINC="-I$GL_INCLUDE" + fi + AC_MSG_RESULT($ac_cv_have_gl) + $1 + fi + fi + AC_SUBST(GLINC) + AC_SUBST(GLLIB) +]) + + + dnl shadow password and PAM magic - maintained by ossi@kde.org + +AC_DEFUN(KDE_PAM, [ + AC_REQUIRE([KDE_CHECK_LIBDL]) + + AC_ARG_WITH(pam, + [ --with-pam[=ARG] enable support for PAM: ARG=[yes|no|service name]], + [ if test "x$withval" = "xyes"; then + use_pam=yes + pam_service=kde + elif test "x$withval" = "xno"; then + use_pam=no + else + use_pam=yes + pam_service=$withval + fi + ac_cv_path_pam="use_pam=$use_pam pam_service=$pam_service" + ], [ + AC_CACHE_VAL(ac_cv_path_pam, + [ use_pam=no + AC_CHECK_LIB(pam, pam_start, + [ AC_CHECK_HEADER(security/pam_appl.h, + [ use_pam=yes + pam_service=kde ]) + ], , $LIBDL) + ac_cv_path_pam="use_pam=$use_pam pam_service=$pam_service" + ]) + ]) + eval "$ac_cv_path_pam" + + AC_MSG_CHECKING(for PAM) + if test "x$use_pam" = xno; then + AC_MSG_RESULT(no) + PAMLIBS="" + else + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)]) + PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL" + + dnl test whether struct pam_message is const (Linux) or not (Sun) + AC_MSG_CHECKING(for const pam_message) + AC_EGREP_HEADER([struct pam_message], security/pam_appl.h, + [ AC_EGREP_HEADER([const struct pam_message], security/pam_appl.h, + [AC_MSG_RESULT([const: Linux-type PAM])], + [AC_MSG_RESULT([nonconst: Sun-type PAM]) + AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])] + )], + [AC_MSG_RESULT([not found - assume const, Linux-type PAM])]) + fi + + AC_SUBST(PAMLIBS) +]) + +dnl DEF_PAM_SERVICE(arg name, full name, define name) +AC_DEFUN(DEF_PAM_SERVICE, [ + AC_ARG_WITH($1-pam, + [ --with-$1-pam=[val] override PAM service from --with-pam for $2], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$withval" + else + AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected. +You may want to enforce it by using --with-pam.]) + fi + ], + [ if test "x$use_pam" = xyes; then + $3_PAM_SERVICE="$pam_service" + fi + ]) + if test -n "$$3_PAM_SERVICE"; then + AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE]) + AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2]) + fi + AC_SUBST($3_PAM_SERVICE) +]) + +AC_DEFUN(KDE_SHADOWPASSWD, [ + AC_REQUIRE([KDE_PAM]) + + AC_CHECK_LIB(shadow, getspent, + [ LIBSHADOW="-lshadow" + ac_use_shadow=yes + ], + [ dnl for UnixWare + AC_CHECK_LIB(gen, getspent, + [ LIBGEN="-lgen" + ac_use_shadow=yes + ], + [ AC_CHECK_FUNC(getspent, + [ ac_use_shadow=yes ], + [ ac_use_shadow=no ]) + ]) + ]) + AC_SUBST(LIBSHADOW) + AC_SUBST(LIBGEN) + + AC_MSG_CHECKING([for shadow passwords]) + + AC_ARG_WITH(shadow, + [ --with-shadow If you want shadow password support ], + [ if test "x$withval" != "xno"; then + use_shadow=yes + else + use_shadow=no + fi + ], [ + use_shadow="$ac_use_shadow" + ]) + + if test "x$use_shadow" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords]) + else + AC_MSG_RESULT(no) + LIBSHADOW= + LIBGEN= + fi + + dnl finally make the relevant binaries setuid root, if we have shadow passwds. + dnl this still applies, if we could use it indirectly through pam. + if test "x$use_shadow" = xyes || + ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then + case $host in + *-*-freebsd* | *-*-netbsd* | *-*-openbsd*) + SETUIDFLAGS="-m 4755 -o root";; + *) + SETUIDFLAGS="-m 4755";; + esac + fi + AC_SUBST(SETUIDFLAGS) + +]) + +AC_DEFUN(KDE_PASSWDLIBS, [ + AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT + AC_REQUIRE([KDE_PAM]) + AC_REQUIRE([KDE_SHADOWPASSWD]) + + if test "x$use_pam" = "xyes"; then + PASSWDLIBS="$PAMLIBS" + else + PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN" + fi + + dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but + dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires + dnl root to read, so kcheckpass needs to be root (even when using pam, since pam + dnl may need to read /etc/master.passwd). + case $host in + *-*-freebsd*) + SETUIDFLAGS="-m 4755 -o root" + ;; + *) + ;; + esac + + AC_SUBST(PASSWDLIBS) +]) + +AC_DEFUN(KDE_CHECK_LIBDL, +[ +AC_CHECK_LIB(dl, dlopen, [ +LIBDL="-ldl" +ac_cv_have_dlfcn=yes +]) + +AC_CHECK_LIB(dld, shl_unload, [ +LIBDL="-ldld" +ac_cv_have_shload=yes +]) + +AC_SUBST(LIBDL) +]) + +AC_DEFUN(KDE_CHECK_DLOPEN, +[ +KDE_CHECK_LIBDL +AC_CHECK_HEADERS(dlfcn.h dl.h) +if test "$ac_cv_header_dlfcn_h" = "no"; then + ac_cv_have_dlfcn=no +fi + +if test "$ac_cv_header_dl_h" = "no"; then + ac_cv_have_shload=no +fi + +dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE +dnl (MM) +AC_ARG_ENABLE(dlopen, +[ --disable-dlopen link statically [default=no]] , +enable_dlopen=$enableval, +enable_dlopen=yes) + +# override the user's opinion, if we know it better ;) +if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then + enable_dlopen=no +fi + +if test "$ac_cv_have_dlfcn" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn]) +fi + +if test "$ac_cv_have_shload" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload]) +fi + +if test "$enable_dlopen" = no ; then + test -n "$1" && eval $1 +else + test -n "$2" && eval $2 +fi + +]) + +AC_DEFUN(KDE_CHECK_DYNAMIC_LOADING, +[ +KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no) +KDE_PROG_LIBTOOL +AC_MSG_CHECKING([dynamic loading]) +eval "`egrep '^build_libtool_libs=' libtool`" +if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then + dynamic_loading=yes + AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING) +else + dynamic_loading=no +fi +AC_MSG_RESULT($dynamic_loading) +if test "$dynamic_loading" = "yes"; then + $1 +else + $2 +fi +]) + +AC_DEFUN(KDE_ADD_INCLUDES, +[ +if test -z "$1"; then + test_include="Pix.h" +else + test_include="$1" +fi + +AC_MSG_CHECKING([for libg++ ($test_include)]) + +AC_CACHE_VAL(kde_cv_libgpp_includes, +[ +kde_cv_libgpp_includes=no + + for ac_dir in \ + \ + /usr/include/g++ \ + /usr/include \ + /usr/unsupported/include \ + /opt/include \ + $extra_include \ + ; \ + do + if test -r "$ac_dir/$test_include"; then + kde_cv_libgpp_includes=$ac_dir + break + fi + done +]) + +AC_MSG_RESULT($kde_cv_libgpp_includes) +if test "$kde_cv_libgpp_includes" != "no"; then + all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES" +fi +]) +]) + + +AC_DEFUN(KDE_CHECK_MICO, +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_MISC_TESTS]) +AC_MSG_CHECKING(for MICO) + +if test -z "$MICODIR"; then + kde_micodir=/usr/local + else + kde_micodir="$MICODIR" +fi + +AC_ARG_WITH(micodir, + [ --with-micodir=micodir where mico is installed ], + kde_micodir=$withval, + kde_micodir=$kde_micodir +) + +AC_CACHE_VAL(kde_cv_mico_incdir, +[ + mico_incdirs="$kde_micodir/include /usr/include /usr/local/include /usr/local/include /opt/local/include $kde_extra_includes" +AC_FIND_FILE(CORBA.h, $mico_incdirs, kde_cv_mico_incdir) + +]) +kde_micodir=`echo $kde_cv_mico_incdir | sed -e 's#/include##'` + +if test ! -r $kde_micodir/include/CORBA.h; then + AC_MSG_ERROR([No CORBA.h found, specify another micodir]) +fi + +AC_MSG_RESULT($kde_micodir) + +MICO_INCLUDES=-I$kde_micodir/include +AC_SUBST(MICO_INCLUDES) +MICO_LDFLAGS=-L$kde_micodir/lib +AC_SUBST(MICO_LDFLAGS) +micodir=$kde_micodir +AC_SUBST(micodir) + +AC_MSG_CHECKING([for MICO version]) +AC_CACHE_VAL(kde_cv_mico_version, +[ +AC_LANG_C +cat >conftest.$ac_ext < +#include +int main() { + + printf("MICO_VERSION=%s\n",MICO_VERSION); + return (0); +} +EOF +ac_compile='${CC-gcc} $CFLAGS $MICO_INCLUDES conftest.$ac_ext -o conftest' +if AC_TRY_EVAL(ac_compile); then + if eval `./conftest 2>&5`; then + kde_cv_mico_version=$MICO_VERSION + else + AC_MSG_ERROR([your system is not able to execute a small application to + find MICO version! Check $kde_micodir/include/mico/version.h]) + fi +else + AC_MSG_ERROR([your system is not able to compile a small application to + find MICO version! Check $kde_micodir/include/mico/version.h]) +fi +]) + +dnl installed MICO version +mico_v_maj=`echo $kde_cv_mico_version | sed -e 's/^\(.*\)\..*\..*$/\1/'` +mico_v_mid=`echo $kde_cv_mico_version | sed -e 's/^.*\.\(.*\)\..*$/\1/'` +mico_v_min=`echo $kde_cv_mico_version | sed -e 's/^.*\..*\.\(.*\)$/\1/'` + +if test "x$1" = "x"; then + req_version="2.3.0" +else + req_version=$1 +fi + +dnl required MICO version +req_v_maj=`echo $req_version | sed -e 's/^\(.*\)\..*\..*$/\1/'` +req_v_mid=`echo $req_version | sed -e 's/^.*\.\(.*\)\..*$/\1/'` +req_v_min=`echo $req_version | sed -e 's/^.*\..*\.\(.*\)$/\1/'` + +if test "$mico_v_maj" -lt "$req_v_maj" || \ + ( test "$mico_v_maj" -eq "$req_v_maj" && \ + test "$mico_v_mid" -lt "$req_v_mid" ) || \ + ( test "$mico_v_mid" -eq "$req_v_mid" && \ + test "$mico_v_min" -lt "$req_v_min" ) + +then + AC_MSG_ERROR([found MICO version $kde_cv_mico_version but version $req_version \ +at least is required. You should upgrade MICO.]) +else + AC_MSG_RESULT([$kde_cv_mico_version (minimum version $req_version, ok)]) +fi + +LIBMICO="-lmico$kde_cv_mico_version $LIBCRYPT $LIBSOCKET $LIBDL" +AC_SUBST(LIBMICO) +if test -z "$IDL"; then + IDL='$(kde_bindir)/cuteidl' +fi +AC_SUBST(IDL) +IDL_DEPENDENCIES='$(kde_includes)/CUTE.h' +AC_SUBST(IDL_DEPENDENCIES) + +idldir="\$(includedir)/idl" +AC_SUBST(idldir) + +]) + +AC_DEFUN(KDE_CHECK_MINI_STL, +[ +AC_REQUIRE([KDE_CHECK_MICO]) + +AC_MSG_CHECKING(if we use mico's mini-STL) +AC_CACHE_VAL(kde_cv_have_mini_stl, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +kde_save_cxxflags="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $MICO_INCLUDES" +AC_TRY_COMPILE( +[ +#include +], +[ +#ifdef HAVE_MINI_STL +#error "nothing" +#endif +], +kde_cv_have_mini_stl=no, +kde_cv_have_mini_stl=yes) +CXXFLAGS="$kde_save_cxxflags" +AC_LANG_RESTORE +]) + +if test "x$kde_cv_have_mini_stl" = "xyes"; then + AC_MSG_RESULT(yes) + $1 +else + AC_MSG_RESULT(no) + $2 +fi +]) + +]) + + +AC_DEFUN(KDE_CHECK_LIBPTHREAD, +[ +AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"] ) +AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN(KDE_CHECK_PTHREAD_OPTION, +[ + AC_ARG_ENABLE(kernel-threads, [ --enable-kernel-threads Enable the use of the LinuxThreads port on FreeBSD/i386 only.], + kde_use_kernthreads=$enableval, kde_use_kernthreads=no) + + if test "$kde_use_kernthreads" = "yes"; then + ac_save_CXXFLAGS="$CXXFLAGS" + ac_save_CFLAGS="$CFLAGS" + CXXFLAGS="-I/usr/local/include/pthread/linuxthreads $CXXFLAGS" + CFLAGS="-I/usr/local/include/pthread/linuxthreads $CFLAGS" + AC_CHECK_HEADERS(pthread/linuxthreads/pthread.h) + CXXFLAGS="$ac_save_CXXFLAGS" + CFLAGS="$ac_save_CFLAGS" + if test "$ac_cv_header_pthread_linuxthreads_pthread_h" = "no"; then + kde_use_kernthreads=no + else + dnl Add proper -I and -l statements + AC_CHECK_LIB(lthread, pthread_join, [LIBPTHREAD="-llthread -llgcc_r"]) dnl for FreeBSD + if test "x$LIBPTHREAD" = "x"; then + kde_use_kernthreads=no + else + USE_THREADS="-D_THREAD_SAFE -I/usr/local/include/pthread/linuxthreads" + fi + fi + else + USE_THREADS="" + if test -z "$LIBPTHREAD"; then + KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-pthread"] ) + fi + fi + + AH_VERBATIM(__svr_define, [ +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif +]) + case $host_os in + solaris*) + KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"]) + CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4" + ;; + freebsd*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + ;; + aix*) + CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" + LIBPTHREAD="$LIBPTHREAD -lc_r" + ;; + linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" + if test "$CXX" = "KCC"; then + CXXFLAGS="$CXXFLAGS --thread_safe" + NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe" + fi + ;; + *) + ;; + esac + AC_SUBST(USE_THREADS) + AC_SUBST(LIBPTHREAD) +]) + +AC_DEFUN(KDE_CHECK_THREADING, +[ + AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) + AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION]) + dnl default is yes if libpthread is found and no if no libpthread is available + if test -z "$LIBPTHREAD"; then + if test -z "$USE_THREADS"; then + kde_check_threading_default=no + else + kde_check_threading_default=yes + fi + else + kde_check_threading_default=yes + fi + AC_ARG_ENABLE(threading, [ --disable-threading disables threading even if libpthread found ], + kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default) + if test "x$kde_use_threading" = "xyes"; then + AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)]) + fi +]) + +AC_DEFUN(KDE_TRY_LINK_PYTHON, +[ +if test "$kde_python_link_found" = no; then + +if test "$1" = normal; then + AC_MSG_CHECKING(if a Python application links) +else + AC_MSG_CHECKING(if Python depends on $2) +fi + +AC_CACHE_VAL(kde_cv_try_link_python_$1, +[ +AC_LANG_SAVE +AC_LANG_C +kde_save_cflags="$CFLAGS" +CFLAGS="$CFLAGS $PYTHONINC" +kde_save_libs="$LIBS" +LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET" +kde_save_ldflags="$LDFLAGS" +LDFLAGS="$LDFLAGS $PYTHONLIB" + +AC_TRY_LINK( +[ +#include +],[ + PySys_SetArgv(1, 0); +], + [kde_cv_try_link_python_$1=yes], + [kde_cv_try_link_python_$1=no] +) +CFLAGS="$kde_save_cflags" +LIBS="$kde_save_libs" +LDFLAGS="$kde_save_ldflags" +]) + +if test "$kde_cv_try_link_python_$1" = "yes"; then + AC_MSG_RESULT(yes) + kde_python_link_found=yes + if test ! "$1" = normal; then + LIBPYTHON="$LIBPYTHON $2" + fi + $3 +else + AC_MSG_RESULT(no) + $4 +fi +AC_LANG_RESTORE + +fi + +]) + +AC_DEFUN(KDE_CHECK_PYTHON_DIR, +[ +AC_MSG_CHECKING([for Python directory]) + +AC_CACHE_VAL(kde_cv_pythondir, +[ + if test -z "$PYTHONDIR"; then + kde_cv_pythondir=/usr/local + else + kde_cv_pythondir="$PYTHONDIR" + fi +]) + +AC_ARG_WITH(pythondir, +[ --with-pythondir=pythondir use python installed in pythondir ], +[ + ac_python_dir=$withval +], ac_python_dir=$kde_cv_pythondir +) + +AC_MSG_RESULT($ac_python_dir) +]) + +AC_DEFUN(KDE_CHECK_PYTHON_INTERN, +[ +AC_REQUIRE([KDE_CHECK_LIBDL]) +AC_REQUIRE([KDE_CHECK_LIBPTHREAD]) +AC_REQUIRE([KDE_CHECK_PYTHON_DIR]) + +if test -z "$1"; then + version="1.5" +else + version="$1" +fi + +AC_MSG_CHECKING([for Python$version]) + +python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes" +AC_FIND_FILE(Python.h, $python_incdirs, python_incdir) +if test ! -r $python_incdir/Python.h; then + AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir) + python_incdir=$python_incdir/python$version + if test ! -r $python_incdir/Python.h; then + python_incdir=no + fi +fi + +PYTHONINC=-I$python_incdir + +python_libdirs="$ac_python_dir/lib /usr/lib /usr/local /usr/lib $kde_extra_libs" +AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir) +if test ! -r $python_libdir/libpython$version.a; then + AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir) + python_libdir=$python_libdir/python$version/config + if test ! -r $python_libdir/libpython$version.a; then + python_libdir=no + fi +fi + +PYTHONLIB=-L$python_libdir +kde_orig_LIBPYTHON=$LIBPYTHON +if test -z "$LIBPYTHON"; then + LIBPYTHON=-lpython$version +fi + +python_libdirs="$ac_python_dir/lib /usr/lib /usr/local /usr/lib $kde_extra_libs" +AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir) +python_moddir=$python_moddir/python$version +if test ! -r $python_moddir/copy.py; then + python_moddir=no +fi + +PYTHONMODDIR=$python_moddir + +AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir) + +if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then + LIBPYTHON=$kde_orig_LIBPYTHON + test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB="" + test "x$PYTHONINC" = "x-Ino" && PYTHONINC="" + $2 +else + dnl Note: this test is very weak + kde_python_link_found=no + KDE_TRY_LINK_PYTHON(normal) + KDE_TRY_LINK_PYTHON(m, -lm) + KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD) + KDE_TRY_LINK_PYTHON(tcl, -ltcl) + KDE_TRY_LINK_PYTHON(db2, -ldb2) + KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil]) + KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm]) + KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [], + [AC_MSG_WARN([it seems, Python depends on another library. + Pleae set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this + and contact the authors to let them know about this problem]) + ]) + + LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET" + AC_SUBST(PYTHONINC) + AC_SUBST(PYTHONLIB) + AC_SUBST(LIBPYTHON) + AC_SUBST(PYTHONMODDIR) + AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python]) +fi + +]) + + +AC_DEFUN(KDE_CHECK_PYTHON, +[ + KDE_CHECK_PYTHON_INTERN("2.2", + [KDE_CHECK_PYTHON_INTERN("2.1", + [KDE_CHECK_PYTHON_INTERN("2.0", [ KDE_CHECK_PYTHON_INTERN($1, $2) ]) + ])]) +]) + +AC_DEFUN(KDE_CHECK_STL_SGI, +[ + AC_MSG_CHECKING([if STL implementation is SGI like]) + AC_CACHE_VAL(kde_cv_stl_type_sgi, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hallo Welt."; + astring.erase(0, 6); // now astring is "Welt" + return 0; +], kde_cv_stl_type_sgi=yes, + kde_cv_stl_type_sgi=no) +]) + + AC_MSG_RESULT($kde_cv_stl_type_sgi) + + if test "$kde_cv_stl_type_sgi" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI]) + fi +]) + +AC_DEFUN(KDE_CHECK_STL_HP, +[ + AC_MSG_CHECKING([if STL implementation is HP like]) + AC_CACHE_VAL(kde_cv_stl_type_hp, + [ + AC_TRY_COMPILE([ +#include +using namespace std; +],[ + string astring="Hello World"; + astring.remove(0, 6); // now astring is "World" + return 0; +], kde_cv_stl_type_hp=yes, + kde_cv_stl_type_hp=no) +]) + AC_MSG_RESULT($kde_cv_stl_type_hp) + + if test "$kde_cv_stl_type_hp" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_HP_STL, 1, [Define if you have a STL implementation by HP]) + fi +]) + +AC_DEFUN(KDE_CHECK_STL, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`" + KDE_CHECK_STL_SGI + + if test "$kde_cv_stl_type_sgi" = "no"; then + KDE_CHECK_STL_HP + + if test "$kde_cv_stl_type_hp" = "no"; then + AC_MSG_ERROR("no known STL type found - did you forget to install libstdc++[-devel] ?") + fi + fi + + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE +]) + +AC_DEFUN(AC_FIND_QIMGIO, + [AC_REQUIRE([AC_FIND_JPEG]) +AC_REQUIRE([KDE_CHECK_EXTRA_LIBS]) +AC_MSG_CHECKING([for qimgio]) +AC_CACHE_VAL(ac_cv_lib_qimgio, +[ +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +ac_save_LIBS="$LIBS" +ac_save_CXXFLAGS="$CXXFLAGS" +LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT" +CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes" +AC_TRY_RUN(dnl +[ +#include +#include +int main() { + QString t = "hallo"; + t.fill('t'); + qInitImageIO(); +} +], + ac_cv_lib_qimgio=yes, + ac_cv_lib_qimgio=no, + ac_cv_lib_qimgio=no) +LIBS="$ac_save_LIBS" +CXXFLAGS="$ac_save_CXXFLAGS" +AC_LANG_RESTORE +])dnl +if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then + LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG" + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available]) + AC_SUBST(LIBQIMGIO) +else + AC_MSG_RESULT(not found) +fi +]) + +AC_DEFUN(KDE_CHECK_ANSI, +[ +]) + +AC_DEFUN(KDE_CHECK_INSURE, +[ + AC_ARG_ENABLE(insure, [ --enable-insure use insure++ for debugging [default=no]], + [ + if test $enableval = "no"; dnl + then ac_use_insure="no" + else ac_use_insure="yes" + fi + ], [ac_use_insure="no"]) + + AC_MSG_CHECKING(if we will use Insure++ to debug) + AC_MSG_RESULT($ac_use_insure) + if test "$ac_use_insure" = "yes"; dnl + then CC="insure"; CXX="insure"; dnl CFLAGS="$CLAGS -fno-rtti -fno-exceptions "???? + fi +]) + +AC_DEFUN(AM_DISABLE_LIBRARIES, +[ + AC_PROVIDE([AM_ENABLE_STATIC]) + AC_PROVIDE([AM_ENABLE_SHARED]) + enable_static=no + enable_shared=yes +]) + + +AC_DEFUN(AC_CHECK_UTMP_FILE, +[ + AC_MSG_CHECKING([for utmp file]) + + AC_CACHE_VAL(kde_cv_utmp_file, + [ + kde_cv_utmp_file=no + + for ac_file in \ + \ + /var/run/utmp \ + /var/adm/utmp \ + /etc/utmp \ + ; \ + do + if test -r "$ac_file"; then + kde_cv_utmp_file=$ac_file + break + fi + done + ]) + + if test "$kde_cv_utmp_file" != "no"; then + AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries]) + $1 + AC_MSG_RESULT($kde_cv_utmp_file) + else + $2 + AC_MSG_RESULT([non found]) + fi +]) + + +AC_DEFUN(KDE_CREATE_SUBDIRSLIST, +[ + +DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin" + +if test ! -s $srcdir/subdirs; then + dnl Note: Makefile.common creates subdirs, so this is just a fallback + TOPSUBDIRS="" + files=`cd $srcdir && ls -1` + dirs=`for i in $files; do if test -d $i; then echo $i; fi; done` + for i in $dirs; do + echo $i >> $srcdir/subdirs + done +fi + +if test -s $srcdir/inst-apps; then + ac_topsubdirs="`cat $srcdir/inst-apps`" +else + ac_topsubdirs="`cat $srcdir/subdirs`" +fi + +for i in $ac_topsubdirs; do + AC_MSG_CHECKING([if $i should be compiled]) + if test -d $srcdir/$i; then + install_it="yes" + for j in $DO_NOT_COMPILE; do + if test $i = $j; then + install_it="no" + fi + done + else + install_it="no" + fi + AC_MSG_RESULT($install_it) + vari=`echo $i | sed -e 's,[[-+.]],_,g'` + if test $install_it = "yes"; then + TOPSUBDIRS="$TOPSUBDIRS $i" + eval "$vari""_SUBDIR_included=yes" + else + eval "$vari""_SUBDIR_included=no" + fi +done + +AC_SUBST(TOPSUBDIRS) +]) + +AC_DEFUN(KDE_CHECK_NAMESPACES, +[ +AC_MSG_CHECKING(whether C++ compiler supports namespaces) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE([ +], +[ +namespace Foo { + extern int i; + namespace Bar { + extern int i; + } +} + +int Foo::i = 0; +int Foo::Bar::i = 1; +],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_NAMESPACES) +], [ +AC_MSG_RESULT(no) +]) +AC_LANG_RESTORE +]) + +AC_DEFUN(KDE_CHECK_NEWLIBS, +[ + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_CHECK_S_ISSOCK, +[ +AC_MSG_CHECKING(for S_ISSOCK) +AC_CACHE_VAL(ac_cv_have_s_issock, +[ +AC_LANG_SAVE +AC_LANG_C +AC_TRY_LINK( +[ +#include +], +[ +struct stat buff; +int b = S_ISSOCK( buff.st_mode ); +], +ac_cv_have_s_issock=yes, +ac_cv_have_s_issock=no) +AC_LANG_RESTORE +]) +AC_MSG_RESULT($ac_cv_have_s_issock) +if test "$ac_cv_have_s_issock" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.]) +fi + +AH_VERBATIM(_ISSOCK, +[ +#ifndef HAVE_S_ISSOCK +#define HAVE_S_ISSOCK +#define S_ISSOCK(mode) (1==0) +#endif +]) + +]) + +dnl ------------------------------------------------------------------------ +dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(AC_CHECK_KDEMAXPATHLEN, +[ +AC_MSG_CHECKING(for MAXPATHLEN) +AC_CACHE_VAL(ac_cv_maxpathlen, +[ +AC_LANG_C +cat > conftest.$ac_ext < +#endif +#include +#include +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +KDE_HELLO MAXPATHLEN + +EOF + +ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out" + +if AC_TRY_EVAL(ac_try) && test -s conftest.out; then + ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out` +else + ac_cv_maxpathlen=1024 +fi + +rm conftest.* + +]) +AC_MSG_RESULT($ac_cv_maxpathlen) +AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] ) +]) + +dnl ------------------------------------------------------------------------- +dnl See if the compiler supports a template repository bero@redhat.de +dnl ------------------------------------------------------------------------- +AC_DEFUN(KDE_COMPILER_REPO, +[ + REPO="" + NOREPO="" + + KDE_CHECK_COMPILER_FLAG(frepo, + [ + REPO="-frepo" + NOREPO="-fno-repo" + ]) + + if test -z "$REPO"; then + KDE_CHECK_COMPILER_FLAG(instances=explicit, + [ + REPO="-instances=explicit" + NOREPO="-instances=extern" + ]) + fi + + if test -n "$REPO"; then + AC_DEFINE_UNQUOTED(HAVE_TEMPLATE_REPOSITORY, 1, + [C++ compiler supports template repository]) + $1 + fi + + AC_SUBST(REPO) + AC_SUBST(NOREPO) +]) + +AC_DEFUN(KDE_CHECK_HEADER, +[ + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADER($1, $2, $3) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN(KDE_CHECK_HEADERS, +[ + AH_CHECK_HEADERS([$1]) + AC_LANG_SAVE + kde_safe_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $all_includes" + AC_LANG_CPLUSPLUS + AC_CHECK_HEADERS([$1], [$2], [$3], [$4]) + CPPFLAGS=$kde_safe_cppflags + AC_LANG_RESTORE +]) + +AC_DEFUN(KDE_FAST_CONFIGURE, +[ + dnl makes configure fast (needs perl) + AC_ARG_ENABLE(fast-perl, [ --disable-fast-perl disable fast Makefile generation (needs perl)], + with_fast_perl=$enableval, with_fast_perl=yes) +]) + +AC_DEFUN(KDE_CONF_FILES, +[ + val= + if test -f $srcdir/configure.files ; then + val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files` + fi + CONF_FILES= + if test -n "$val" ; then + for i in $val ; do + CONF_FILES="$CONF_FILES $i" + done + fi + AC_SUBST(CONF_FILES) +])dnl + +AC_DEFUN(KDE_SET_PREFIX, +[ + unset CDPATH + dnl make $KDEDIR the default for the installation + AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde}) + + if test "x$prefix" = "xNONE"; then + prefix=$ac_default_prefix + ac_configure_args="$ac_configure_args --prefix=$prefix" + fi + # And delete superflous '/' to make compares easier + prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'` + KDE_FAST_CONFIGURE + KDE_CONF_FILES +]) + +pushdef([AC_PROG_INSTALL], +[ + dnl our own version, testing for a -p flag + popdef([AC_PROG_INSTALL]) + dnl as AC_PROG_INSTALL works as it works we first have + dnl to save if the user didn't specify INSTALL, as the + dnl autoconf one overwrites INSTALL and we have no chance to find + dnl out afterwards + test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL + test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM + test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT + AC_PROG_INSTALL + + if test -z "$kde_save_INSTALL_given" ; then + # OK, user hasn't given any INSTALL, autoconf found one for us + # now we test, if it supports the -p flag + AC_MSG_CHECKING(for -p flag to install) + rm -f confinst.$$.* > /dev/null 2>&1 + echo "Testtest" > confinst.$$.orig + ac_res=no + if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then + if test -f confinst.$$.new ; then + # OK, -p seems to do no harm to install + INSTALL="${INSTALL} -p" + ac_res=yes + fi + fi + rm -f confinst.$$.* + AC_MSG_RESULT($ac_res) + fi + dnl the following tries to resolve some signs and wonders coming up + dnl with different autoconf/automake versions + dnl e.g.: + dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s + dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS) + dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s + dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has + dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the + dnl install-@DIR@PROGRAMS targets to explicitly use that flag + dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as + dnl INSTALL_SCRIPT, which breaks with automake <= 1.4 + dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure + dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from + dnl automake (due to broken Makefile.am or whatever) to install programs, + dnl and so does not see the -s flag in automake > 1.4 + dnl to clean up that mess we: + dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG + dnl which cleans KDE's program with automake > 1.4; + dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems + dnl with automake<=1.4 + dnl note that dues to this sometimes two '-s' flags are used (if KDE + dnl properly uses install-@DIR@PROGRAMS, but I don't care + dnl + dnl And to all this comes, that I even can't write in comments variable + dnl names used by automake, because it is so stupid to think I wanted to + dnl _use_ them, therefor I have written A_M_... instead of AM_ + dnl hmm, I wanted to say something ... ahh yes: Arghhh. + + if test -z "$kde_save_INSTALL_PROGRAM_given" ; then + INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' + fi + if test -z "$kde_save_INSTALL_SCRIPT_given" ; then + INSTALL_SCRIPT='${INSTALL}' + fi +])dnl + +AC_DEFUN(KDE_LANG_CPLUSPLUS, +[AC_LANG_CPLUSPLUS +ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC' +pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS]) +]) + +pushdef([AC_LANG_CPLUSPLUS], +[popdef([AC_LANG_CPLUSPLUS]) +KDE_LANG_CPLUSPLUS +]) + +AC_DEFUN(KDE_CHECK_LONG_LONG, +[ +AC_MSG_CHECKING(for long long) +AC_CACHE_VAL(kde_cv_c_long_long, +[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_LINK([], [ + long long foo = 0; + foo = foo+1; + ], + kde_cv_c_long_long=yes, kde_cv_c_long_long=no) + AC_LANG_RESTORE +]) +AC_MSG_RESULT($kde_cv_c_long_long) +if test "$kde_cv_c_long_long" = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype]) +fi +]) + +AC_DEFUN(KDE_CHECK_LIB, +[ + kde_save_LDFLAGS="$LDFLAGS" + dnl AC_CHECK_LIB modifies LIBS, so save it here + kde_save_LIBS="$LIBS" + LDFLAGS="$LDFLAGS $all_libraries" + case $host_os in + aix*) LDFLAGS="-brtl $LDFLAGS" + test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS" + ;; + esac + AC_CHECK_LIB($1, $2, $3, $4, $5) + LDFLAGS="$kde_save_LDFLAGS" + LIBS="$kde_save_LIBS" +]) + +AC_DEFUN(KDE_JAVA_PREFIX, +[ + dir=`dirname "$1"` + base=`basename "$1"` + list=`ls -1 $dir 2> /dev/null` + for entry in $list; do + if test -d $dir/$entry/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/bin" + ;; + esac + elif test -d $dir/$entry/jre/bin; then + case $entry in + $base) + javadirs="$javadirs $dir/$entry/jre/bin" + ;; + esac + fi + done +]) + +dnl KDE_CHEC_JAVA_DIR(onlyjre) +AC_DEFUN(KDE_CHECK_JAVA_DIR, +[ + +AC_ARG_WITH(java, +[ --with-java=javadir use java installed in javadir, --without-java disables ], +[ ac_java_dir=$withval +], ac_java_dir="" +) + +AC_MSG_CHECKING([for Java]) + +dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH +if test "x$ac_java_dir" = "xno"; then + kde_java_bindir=no + kde_java_includedir=no + kde_java_libjvmdir=no + kde_java_libhpidir=no +else + if test "x$ac_java_dir" = "x"; then + + + dnl No option set -> look in $PATH + KDE_JAVA_PREFIX(/usr/j2se) + KDE_JAVA_PREFIX(/usr/j*dk*) + KDE_JAVA_PREFIX(/usr/lib/j*dk*) + KDE_JAVA_PREFIX(/opt/j*sdk*) + KDE_JAVA_PREFIX(/usr/lib/java*) + KDE_JAVA_PREFIX(/usr/java*) + KDE_JAVA_PREFIX(/usr/lib/SunJava2*) + KDE_JAVA_PREFIX(/usr/lib/SunJava*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava2*) + KDE_JAVA_PREFIX(/usr/lib/IBMJava*) + KDE_JAVA_PREFIX(/opt/java*) + + kde_cv_path="NONE" + kde_save_IFS=$IFS + IFS=':' + for dir in $PATH; do + javadirs="$javadirs $dir" + done + IFS=$kde_save_IFS + jredirs= + + for dir in $javadirs; do + if test ! -d $dir; then break; fi + if test -x "$dir/java"; then + libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + if test ! -f $libjvmdir/libjvm.so; then continue; fi + jredirs="$jredirs $dir" + fi + done + + JAVAC= + JAVA= + kde_java_bindir=no + for dir in $jredirs; do + JAVA="$dir/java" + kde_java_bindir=$dir + if test -x "$dir/javac"; then + JAVAC="$dir/javac" + break + fi + done + + if test -n "$JAVAC"; then + dnl this substitution might not work - well, we test for jni.h below + kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'` + else + kde_java_includedir=no + fi + else + dnl config option set + kde_java_bindir=$ac_java_dir/bin + if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then + kde_java_includedir=no + else + kde_java_includedir=$ac_java_dir/include + fi + fi +fi + +dnl At this point kde_java_bindir and kde_java_includedir are either set or "no" +if test "x$kde_java_bindir" != "xno"; then + + dnl Look for libjvm.so + kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1` + dnl Look for libhpi.so and avoid green threads + kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1` + + dnl Now check everything's fine under there + dnl the include dir is our flag for having the JDK + if test -d "$kde_java_includedir"; then + if test ! -x "$kde_java_bindir/javac"; then + AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.]) + fi + if test ! -x "$kde_java_bindir/javah"; then + AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -x "$kde_java_bindir/jar"; then + AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + if test ! -r "$kde_java_includedir/jni.h"; then + AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.]) + fi + + jni_includes="-I$kde_java_includedir" + dnl Strange thing, jni.h requires jni_md.h which is under genunix here.. + dnl and under linux here.. + test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux" + test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris" + test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix" + + else + JAVAC= + jni_includes= + fi + + if test ! -r "$kde_java_libjvmdir/libjvm.so"; then + AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.]) + fi + + if test ! -x "$kde_java_bindir/java"; then + AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.]) + fi + + if test ! -r "$kde_java_libhpidir/libhpi.so"; then + AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.]) + fi + + if test -n "$jni_includes"; then + dnl Check for JNI version + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cxxflags_safe="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS $all_includes $jni_includes" + + AC_TRY_COMPILE([ + #include + ], + [ + #ifndef JNI_VERSION_1_2 + Syntax Error + #endif + ],[ kde_jni_works=yes ], + [ kde_jni_works=no ]) + + if test $kde_jni_works = no; then + AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h. + You need to have Java Development Kit (JDK) version 1.2. + + Use --with-java to specify another location. + Use --without-java to configure without java support. + Or download a newer JDK and try again. + See e.g. http://java.sun.com/products/jdk/1.2 ]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + AC_LANG_RESTORE + + dnl All tests ok, inform and subst the variables + + JAVAC=$kde_java_bindir/javac + JAVAH=$kde_java_bindir/javah + JAR=$kde_java_bindir/jar + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi" + AC_MSG_RESULT([java JDK in $kde_java_bindir]) + + else + AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is]) + AC_MSG_RESULT([java JRE in $kde_java_bindir]) + fi +else # no + AC_MSG_RESULT([none found]) +fi + +AC_SUBST(JAVAC) +AC_SUBST(JAVAH) +AC_SUBST(JAR) +AC_SUBST(JVMLIBS) +AC_SUBST(jni_includes) + +# for backward compat +kde_cv_java_includedir=$kde_java_includedir +kde_cv_java_bindir=$kde_java_bindir +]) + +dnl this is a redefinition of autoconf 2.5x's AC_FOREACH. +dnl When the argument list becomes big, as in KDE for AC_OUTPUT in +dnl big packages, m4_foreach is dog-slow. So use our own version of +dnl it. (matz@kde.org) +m4_define([mm_foreach], +[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])]) +m4_define([mm_car], [[$1]]) +m4_define([mm_car2], [[$@]]) +m4_define([_mm_foreach], +[m4_if(m4_quote($2), [], [], + [m4_define([$1], [mm_car($2)])$3[]_mm_foreach([$1], + mm_car2(m4_shift($2)), + [$3])])]) +m4_define([AC_FOREACH], +[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])]) + +AC_DEFUN(KDE_NEED_FLEX, +[ +kde_libs_safe=$LIBS +LIBS="$LIBS $USER_LDFLAGS" +AM_PROG_LEX +LIBS=$kde_libs_safe +if test -z "$LEXLIB"; then + AC_MSG_ERROR([You need to have flex installed.]) +fi +AC_SUBST(LEXLIB) +]) + +AC_DEFUN(AC_PATH_QTOPIA, +[ + dnl TODO: use AC_CACHE_VAL + + if test -z "$1"; then + qtopia_minver_maj=1 + qtopia_minver_min=5 + qtopia_minver_pat=0 + else + qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"` + qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"` + qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"` + fi + + qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat" + qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat" + + AC_REQUIRE([AC_PATH_QT]) + + AC_MSG_CHECKING([for Qtopia]) + + LIB_QTOPIA="-lqpe" + AC_SUBST(LIB_QTOPIA) + + kde_qtopia_dirs="$QPEDIR /opt/Qtopia" + + ac_qtopia_incdir=NO + + AC_ARG_WITH(qtopia-dir, + [ --with-qtopia-dir=DIR where the root of Qtopia is installed ], + [ ac_qtopia_incdir="$withval"/include] ) + + qtopia_incdirs="" + for dir in $kde_qtopia_dirs; do + qtopia_incdirs="$qtopia_incdirs $dir/include" + done + + if test ! "$ac_qtopia_incdir" = "NO"; then + qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs" + fi + + qtopia_incdir="" + AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir) + ac_qtopia_incdir="$qtopia_incdir" + + if test -z "$qtopia_incdir"; then + AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.]) + fi + + qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`; + qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`; + qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`; + + qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat" + qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat" + if test "$qtopia_ver" -lt "$qtopia_minver"; then + AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr +is required.]) + fi + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + ac_cxxflags_safe="$CXXFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes" + LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS" + LIBS="$LIBS $LIB_QTOPIA $LIBQT" + + cat > conftest.$ac_ext < +#include + +int main( int argc, char **argv ) +{ + QPEApplication app( argc, argv ); + return 0; +} +EOF + + if AC_TRY_EVAL(ac_link) && test -s conftest; then + rm -f conftest* + else + rm -f conftest* + AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at +the end of config.log]) + fi + + CXXFLAGS="$ac_cxxflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + QTOPIA_INCLUDES="-I$qtopia_incdir" + AC_SUBST(QTOPIA_INCLUDES) + + AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir]) +]) + + +AC_DEFUN(KDE_INIT_DOXYGEN, +[ +AC_MSG_CHECKING([for Qt docs]) +kde_qtdir= +if test "${with_qt_dir+set}" = set; then + kde_qtdir="$with_qt_dir" +fi + +AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc], QTDOCDIR) +AC_MSG_RESULT($QTDOCDIR) + +AC_SUBST(QTDOCDIR) + +KDE_FIND_PATH(dot, DOT, [], []) +if test -n "$DOT"; then + KDE_HAVE_DOT="YES" +else + KDE_HAVE_DOT="NO" +fi +AC_SUBST(KDE_HAVE_DOT) +KDE_FIND_PATH(doxygen, DOXYGEN, [], []) +AC_SUBST(DOXYGEN) + +DOXYGEN_PROJECT_NAME="$1" +DOXYGEN_PROJECT_NUMBER="$2" +AC_SUBST(DOXYGEN_PROJECT_NAME) +AC_SUBST(DOXYGEN_PROJECT_NUMBER) + +KDE_HAS_DOXYGEN=no +if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then + KDE_HAS_DOXYGEN=yes +fi +AC_SUBST(KDE_HAS_DOXYGEN) + +]) + + +AC_DEFUN(AC_FIND_BZIP2, +[ +AC_MSG_CHECKING([for bzDecompress in libbz2]) +AC_CACHE_VAL(ac_cv_lib_bzip2, +[ +AC_LANG_C +kde_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET" +kde_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK(dnl +[ +#define BZ_NO_STDIO +#include +], + [ bz_stream s; (void) bzDecompress(&s); ], + eval "ac_cv_lib_bzip2='-lbz2'", + eval "ac_cv_lib_bzip2=no") +LIBS="$kde_save_LIBS" +CFLAGS="$kde_save_CFLAGS" +])dnl +AC_MSG_RESULT($ac_cv_lib_bzip2) + +if test ! "$ac_cv_lib_bzip2" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2" + AC_SUBST(LIBBZ2) + +else + + cxx_shared_flags= + KDE_CHECK_COMPILER_FLAG(shared, [ + cxx_shared_flag="-shared" + ]) + + AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2]) + AC_CACHE_VAL(ac_cv_lib_bzip2_prefix, + [ + AC_LANG_C + kde_save_LIBS="$LIBS" + LIBS="$all_libraries $USER_LDFLAGS $cxx_shared_flag -lbz2 $LIBSOCKET" + kde_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" + + AC_TRY_LINK(dnl + [ + #define BZ_NO_STDIO + #include + ], + [ bz_stream s; (void) BZ2_bzDecompress(&s); ], + eval "ac_cv_lib_bzip2_prefix='-lbz2'", + eval "ac_cv_lib_bzip2_prefix=no") + LIBS="$kde_save_LIBS" + CFLAGS="$kde_save_CFLAGS" + ])dnl + + AC_MSG_RESULT($ac_cv_lib_bzip2_prefix) + + + + if test ! "$ac_cv_lib_bzip2_prefix" = no; then + BZIP2DIR=bzip2 + + LIBBZ2="$ac_cv_lib_bzip2_prefix" + AC_SUBST(LIBBZ2) + + AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix]) + dnl else, we just ignore this + fi + +fi +AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR") +]) + +dnl ------------------------------------------------------------------------ +dnl Try to find the SSL headers and libraries. +dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed) +dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed) +dnl ------------------------------------------------------------------------ +dnl +AC_DEFUN(KDE_CHECK_SSL, +[ +LIBSSL="-lssl -lcrypto" +AC_REQUIRE([KDE_CHECK_LIB64]) + +ac_ssl_includes=NO ac_ssl_libraries=NO +ssl_libraries="" +ssl_includes="" +AC_ARG_WITH(ssl-dir, + [ --with-ssl-dir=DIR where the root of OpenSSL is installed], + [ ac_ssl_includes="$withval"/include + ac_ssl_libraries="$withval"/lib$kdelibsuff + ]) + +want_ssl=yes +AC_ARG_WITH(ssl, + [ --without-ssl disable SSL checks], + [want_ssl=$withval]) + +if test $want_ssl = yes; then + +AC_MSG_CHECKING(for OpenSSL) + +AC_CACHE_VAL(ac_cv_have_ssl, +[#try to guess OpenSSL locations + + ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes" + ssl_incdirs="$ac_ssl_includes $ssl_incdirs" + AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir) + ac_ssl_includes="$ssl_incdir" + + ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs" + if test ! "$ac_ssl_libraries" = "NO"; then + ssl_libdirs="$ac_ssl_libraries $ssl_libdirs" + fi + + test=NONE + ssl_libdir=NONE + for dir in $ssl_libdirs; do + try="ls -1 $dir/libssl*" + if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi + done + + ac_ssl_libraries="$ssl_libdir" + + AC_LANG_SAVE + AC_LANG_C + + ac_cflags_safe="$CFLAGS" + ac_ldflags_safe="$LDFLAGS" + ac_libs_safe="$LIBS" + + CFLAGS="$CFLAGS -I$ssl_incdir $all_includes" + LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries" + LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref" + + AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();, + ac_ssl_rsaref="yes" + , + ac_ssl_rsaref="no" + ) + + CFLAGS="$ac_cflags_safe" + LDFLAGS="$ac_ldflags_safe" + LIBS="$ac_libs_safe" + + AC_LANG_RESTORE + + if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then + have_ssl=no + else + have_ssl=yes; + fi + + ]) + + eval "$ac_cv_have_ssl" + + AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes]) + + AC_MSG_CHECKING([whether OpenSSL uses rsaref]) + AC_MSG_RESULT($ac_ssl_rsaref) + + AC_MSG_CHECKING([for easter eggs]) + AC_MSG_RESULT([none found]) + +else + have_ssl=no +fi + +if test "$have_ssl" = yes; then + AC_MSG_CHECKING(for OpenSSL version) + dnl Check for SSL version + AC_CACHE_VAL(ac_cv_ssl_version, + [ + AC_LANG_SAVE + AC_LANG_C + + cat >conftest.$ac_ext < +#include + int main() { + +#ifndef OPENSSL_VERSION_NUMBER + printf("ssl_version=\\"error\\"\n"); +#else + if (OPENSSL_VERSION_NUMBER < 0x00906000) + printf("ssl_version=\\"old\\"\n"); + else + printf("ssl_version=\\"ok\\"\n"); +#endif + return (0); + } +EOF + + ac_compile='${CC-gcc} $CFLAGS -I$ac_ssl_includes conftest.$ac_ext -o conftest' + if AC_TRY_EVAL(ac_compile); then + + if eval `./conftest 2>&5`; then + if test $ssl_version = error; then + AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !]) + else + if test $ssl_version = old; then + AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.]) + have_ssl=no + fi + fi + ac_cv_ssl_version="ssl_version=$ssl_version" + else + AC_MSG_ERROR([Your system couldn't run a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + else + AC_MSG_ERROR([Your system couldn't link a small SSL test program. + Check config.log, and if you can't figure it out, send a mail to + David Faure , attaching your config.log]) + fi + + AC_LANG_RESTORE + + ]) + + eval "$ac_cv_ssl_version" + AC_MSG_RESULT($ssl_version) +fi + +if test "$have_ssl" != yes; then + LIBSSL=""; +else + AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL]) + ac_cv_have_ssl="have_ssl=yes \ + ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref" + + + ssl_libraries="$ac_ssl_libraries" + ssl_includes="$ac_ssl_includes" + + if test "$ac_ssl_rsaref" = yes; then + LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref" + fi + + if test $ssl_version = "old"; then + AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6]) + fi +fi + +if test "$ssl_includes" = "/usr/include" || test "$ssl_includes" = "/usr/local/include" || test -z "$ssl_includes"; then + SSL_INCLUDES=""; +else + SSL_INCLUDES="-I$ssl_includes" +fi + +if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries"; then + SSL_LDFLAGS="" +else + SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries" +fi + +AC_SUBST(SSL_INCLUDES) +AC_SUBST(SSL_LDFLAGS) +AC_SUBST(LIBSSL) +]) + +AC_DEFUN(KDE_CHECK_STRLCPY, +[ + AC_CHECK_STRLCPY + AC_CHECK_STRLCAT + AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(unsigned long) + + AC_MSG_CHECKING([sizeof(size_t) == sizeof(unsigned long)]) + AC_TRY_COMPILE(,[ + #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG + choke me + #endif + ],[AC_MSG_RESULT([yes])],[ + AC_MSG_RESULT([no]) + AC_MSG_ERROR([ + Apparently on your system our assumption sizeof(size_t) == sizeof(unsigned long) + does not apply. Please mail kde-devel@kde.org with a description of your system! + ]) + ]) +]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +# serial 47 AC_PROG_LIBTOOL + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool --silent' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([LT_AC_PROG_SED])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="[$]2" +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +AC_DIVERT_POP +])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-linux*) + # Test if the compiler is 64bit + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *"ELF 32"*) + LINUX_64_MODE="32" + ;; + *"ELF 64"*) + LINUX_64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one + AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, + [AC_TRY_LINK([], + [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); + DllMain (0, 0, 0);], + [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) + + case $host/$CC in + *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) + # old mingw systems require "-dll" to link a DLL, while more recent ones + # require "-mdll" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mdll" + AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, + [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) + CFLAGS="$SAVE_CFLAGS" ;; + *-*-cygwin* | *-*-pw32*) + # cygwin systems need to pass --dll to the linker, and not link + # crt.o which will require a WinMain@16 definition. + lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; + esac + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $3" + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + if (eval $ac_compile 2>conftest.err) && test -s $ac_outfile; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + CFLAGS="$save_CFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + testring="ABCD" + + case $host_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \ + = "XX$testring") >/dev/null 2>&1 && + new_result=`expr "X$testring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + testring=$testring$testring + done + testring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + ifelse([$1],[],[save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"], + [$1],[CXX],[save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -o out/conftest2.$ac_objext"], + [$1],[GCJ],[save_GCJFLAGS="$GCJFLAGS" + GCJFLAGS="$GCJFLAGS -o out/conftest2.$ac_objext"]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + # According to Tom Tromey, Ian Lance Taylor reported there are C compilers + # that will create temporary files in the current directory regardless of + # the output directory. Thus, making CWD read-only will cause this test + # to fail, enabling locking or at least warning the user not to do parallel + # builds. + chmod -w . + + if (eval $ac_compile 2>out/conftest.err) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + # Append any errors to the config.log. + cat out/conftest.err 1>&AS_MESSAGE_LOG_FD + else + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + ifelse([$1],[],[CFLAGS="$save_CFLAGS"], + [$1],[CXX],[CXXFLAGS="$save_CXXFLAGS"], + [$1],[GCJ],[GCJFLAGS="$save_GCJFLAGS"]) + chmod u+w . + $rm conftest* out/* + rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)"; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4* | aix5*) + version_type=linux + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}.so$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + sys_lib_search_path_spec="/lib /lib/w32api /usr/lib /usr/local/lib" + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://"` + if echo "$sys_lib_search_path_spec" | [egrep ';[C-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | sed -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | sed -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + if test "$host_cpu" = ia64; then + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + else + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + fi + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) version_type=irix ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + libsuff= + if test "x$LINUX_64_MODE" = x64; then + # Some platforms are per default 64-bit, so there's no /lib64 + if test -d /lib64; then + libsuff=64 + fi + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags=TAGS], + [include additional configurations @<:@CXX,GCJ@:>@])], + [tagnames="$withval"], + [tagnames="CXX,GCJ" + case $host_os in + mingw*|cygwin*) tagnames="$tagnames,RC" ;; + esac]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | sed -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + AC_LIBTOOL_LANG_CXX_CONFIG + ;; + + GCJ) + AC_LIBTOOL_LANG_GCJ_CONFIG + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + available_tags="$available_tags $tagname" + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the path to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$lt_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +])# AC_PROG_LD + + +# AC_PROG_LD_GNU +# -------------- +AC_DEFUN([AC_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$lt_cv_prog_gnu_ld +])# AC_PROG_LD_GNU + + +# AC_PROG_LD_RELOAD_FLAG +# ---------------------- +# find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], +[AC_CACHE_CHECK([for $LD option to reload object files], + lt_cv_ld_reload_flag, + [lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +])# AC_PROG_LD_RELOAD_FLAG + + +# AC_DEPLIBS_CHECK_METHOD +# ----------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], +[AC_CACHE_CHECK([how to recognise dependant libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[[012]]) + lt_cv_file_magic_test_file=`/System/Library/Frameworks/System.framework/System` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + if test "$host_cpu" = ia64; then + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + else + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + fi + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha* | hppa* | i*86 | ia64* | m68* | mips | mipsel | powerpc* | sparc* | s390* | sh* | x86_64* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the path to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + if ("$tmp_nm" -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ("$tmp_nm" -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# If this macro is not defined by Autoconf, define it here. +ifdef([AC_PROVIDE_IFELSE], + [], + [define([AC_PROVIDE_IFELSE], + [ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([AC_PROG_RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='main(){return(0);}' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C test sources. +ac_ext=cc + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int char *[]) { return(0); }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${CXX-"c++"} +set dummy $CC +compiler="[$]2" +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if eval "`$CC -print-prog-name=ld` --version 2>&1" | \ + egrep 'GNU ld' > /dev/null; then + with_gnu_ld=yes + + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + egrep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | egrep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux*) + if test $with_gnu_ld = no; then + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + else + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + fi + fi + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + else + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + fi + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case $host_os in + hpux9*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + ;; + *) + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + fi + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_os in + hpux9*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + ;; + *) + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + fi + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='templib=`echo $lib | sed -e "s/\.so\..*/\.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='templib=`echo $lib | sed -e "s/\.so\..*/\.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest.so 2>&1 | egrep "ld"`; rm -f libconftest.so; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | sed "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + # NetBSD uses g++ - do we need to do anything? + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='templib=`echo $lib | sed -e "s/\.so\..*/\.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | sed "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | egrep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='templib=`echo $lib | sed -e "s/\.so\..*/\.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | sed "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | egrep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | egrep "\-R|\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | egrep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $linker_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | egrep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $linker_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | egrep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# Figure out "hidden" C++ library dependencies from verbose +# compiler output whening linking a shared library. +cat > conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A sed program that does not truncate output. +SED=$lt_SED + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "$cfgfile" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments + _LT_AC_FILE_LTDLL_C + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments + _LT_AC_FILE_IMPGEN_C +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions -c conftest.$ac_ext], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[[ABCDGISTW]]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + cygwin* | mingw* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX, but not for PA HP-UX. + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + fi + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX, but not for PA HP-UX. + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + fi + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + if test "x$host_vendor" = xsni; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-LD' + else + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + fi + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -DPIC], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) -DPIC" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | egrep '(GNU)' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + cygwin* | mingw* | pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an egrep regular expression of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left by newer dlltools. + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`head -1 $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; + else + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \[$]# in + 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + ;; + esac + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | egrep '(GNU)' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + + # KDE requires run time linking. Make it the default. + aix_use_runtimelinking=yes + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='-qmkshrobj ${wl}-G' + else + shared_flag='-qmkshrobj' + fi + fi + fi + + # Let the compiler handle the export list. + _LT_AC_TAGVAR(always_export_symbols, $1)=no + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + esac + + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + _LT_AC_TAGVAR(archive_cmds, $1)='$CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring' + # We need to add '_' to the symbols in $export_symbols first + #_LT_AC_TAGVAR(archive_expsym_cmds, $1)="$_LT_AC_TAGVAR(archive_cmds, $1)"' && strip -s $export_symbols' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9* | hpux10* | hpux11*) + if test "$GCC" = yes; then + case $host_os in + hpux9*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + ;; + *) + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + esac + else + case $host_os in + hpux9*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + ;; + *) + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + ;; + esac + fi + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + else + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + fi + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + if test "x$host_vendor" = xsni; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + echo 'static int dummy;' > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac +fi +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_FILE_IMPGEN_C +# -------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_IMPGEN_C], [ +# /* impgen.c starts here */ +# /* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/sed$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + _max=0 + _count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for _sed in $_sed_list /usr/xpg4/bin/sed; do + test ! -f ${_sed} && break + cat /dev/null > "$tmp/sed.in" + _count=0 + echo $ECHO_N "0123456789$ECHO_C" >"$tmp/sed.in" + # Check for GNU sed and select it if it is found. + if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then + lt_cv_path_SED=${_sed} + break; + fi + while true; do + cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" + mv "$tmp/sed.tmp" "$tmp/sed.in" + cp "$tmp/sed.in" "$tmp/sed.nl" + echo >>"$tmp/sed.nl" + ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break + cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break + # 10000 chars as input seems more than enough + test $_count -gt 10 && break + _count=`expr $_count + 1` + if test $_count -gt $_max; then + _max=$_count + lt_cv_path_SED=$_sed + fi + done + done + rm -rf "$tmp" +]) +AC_MSG_RESULT([$SED]) +]) + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 5 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# We require 2.13 because we rely on SHELL being computed by configure. +AC_PREREQ([2.13]) + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED. +# The purpose of this macro is to provide the user with a means to +# check macros which are provided without letting her know how the +# information is coded. +# If this macro is not defined by Autoconf, define it here. +ifdef([AC_PROVIDE_IFELSE], + [], + [define([AC_PROVIDE_IFELSE], + [ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AM_INIT_AUTOMAKE(PACKAGE,VERSION, [NO-DEFINE]) +# ---------------------------------------------- +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`CDPATH=:; cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first]) +fi + +# Define the identity of the package. +PACKAGE=$1 +AC_SUBST(PACKAGE)dnl +VERSION=$2 +AC_SUBST(VERSION)dnl +ifelse([$3],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +ifdef([m4_pattern_allow], + [m4_pattern_allow([^AM_[A-Z]+FLAGS])])dnl + +# Autoconf 2.50 always computes EXEEXT. However we need to be +# compatible with 2.13, for now. So we always define EXEEXT, but we +# don't compute it. +AC_SUBST(EXEEXT) +# Similar for OBJEXT -- only we only use OBJEXT if the user actually +# requests that it be used. This is a bit dumb. +: ${OBJEXT=o} +AC_SUBST(OBJEXT) + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl +AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_PROVIDE_IFELSE([AC_PROG_][CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_][CC], + defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_][CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_][CXX], + defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) + +# +# Check to make sure that the build environment is sane. +# + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + + +# serial 2 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + am_backtick='`' + AC_MSG_WARN([${am_backtick}missing' script is too old or missing]) +fi +]) + +# AM_AUX_DIR_EXPAND + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ +# expand $ac_aux_dir to an absolute path +am_aux_dir=`CDPATH=:; cd $ac_aux_dir && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# serial 4 -*- Autoconf -*- + + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# --------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX" or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'] + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +$1DEPMODE="depmode=$am_cv_$1_dependencies_compiler_type" +AC_SUBST([$1DEPMODE]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[rm -f .deps 2>/dev/null +mkdir .deps 2>/dev/null +if test -d .deps; then + DEPDIR=.deps +else + # MS-DOS does not allow filenames that begin with a dot. + DEPDIR=_deps +fi +rmdir .deps 2>/dev/null +AC_SUBST(DEPDIR) +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +pushdef([subst], defn([AC_SUBST])) +subst(AMDEPBACKSLASH) +popdef([subst]) +]) + +# Generate code to set up dependency tracking. +# This macro should only be invoked once -- use via AC_REQUIRE. +# Usage: +# AM_OUTPUT_DEPENDENCY_COMMANDS + +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],[ +AC_OUTPUT_COMMANDS([ +test x"$AMDEP_TRUE" != x"" || +for mf in $CONFIG_FILES; do + case "$mf" in + Makefile|GNUmakefile) dirpart=.;; + */Makefile|*/GNUmakefile) dirpart=`echo "$mf" | sed -e 's|/[^/]*$||'`;; + *) continue;; + esac + grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`echo "$file" | sed -e 's|/[^/]*$||'` + $ac_aux_dir/mkinstalldirs "$dirpart/$fdir" > /dev/null 2>&1 + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +], [AMDEP_TRUE="$AMDEP_TRUE" +ac_aux_dir="$ac_aux_dir"])]) + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +doit: + @echo done +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include='#' +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote='"' + _am_result=BSD + fi +fi +AC_SUBST(am__include) +AC_SUBST(am__quote) +AC_MSG_RESULT($_am_result) +rm -f confinc confmf +]) + +# serial 3 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +# +# FIXME: Once using 2.50, use this: +# m4_match([$1], [^TRUE\|FALSE$], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], + [errprint(__file__:__line__: [$0: invalid condition: $1 +])dnl +m4exit(1)])dnl +ifelse([$1], [FALSE], + [errprint(__file__:__line__: [$0: invalid condition: $1 +])dnl +m4exit(1)])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi]) + + +# AM_PROG_LEX +# Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT +AC_DEFUN([AM_PROG_LEX], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +AC_CHECK_PROGS(LEX, flex lex, [${am_missing_run}flex]) +AC_PROG_LEX +AC_DECL_YYTEXT]) + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +# serial 3 + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. We must strip everything past the first ":", +# and everything past the last "/". + +AC_PREREQ([2.12]) + +AC_DEFUN([AM_CONFIG_HEADER], +[ifdef([AC_FOREACH],dnl + [dnl init our file count if it isn't already + m4_ifndef([_AM_Config_Header_Index], m4_define([_AM_Config_Header_Index], [0])) + dnl prepare to store our destination file list for use in config.status + AC_FOREACH([_AM_File], [$1], + [m4_pushdef([_AM_Dest], m4_patsubst(_AM_File, [:.*])) + m4_define([_AM_Config_Header_Index], m4_incr(_AM_Config_Header_Index)) + dnl and add it to the list of files AC keeps track of, along + dnl with our hook + AC_CONFIG_HEADERS(_AM_File, +dnl COMMANDS, [, INIT-CMDS] +[# update the timestamp +echo timestamp >"AS_ESCAPE(_AM_DIRNAME(]_AM_Dest[))/stamp-h]_AM_Config_Header_Index[" +][$2]m4_ifval([$3], [, [$3]]))dnl AC_CONFIG_HEADERS + m4_popdef([_AM_Dest])])],dnl +[AC_CONFIG_HEADER([$1]) + AC_OUTPUT_COMMANDS( + ifelse(patsubst([$1], [[^ ]], []), + [], + [test -z "$CONFIG_HEADERS" || echo timestamp >dnl + patsubst([$1], [^\([^:]*/\)?.*], [\1])stamp-h]),dnl +[am_indx=1 +for am_file in $1; do + case " \$CONFIG_HEADERS " in + *" \$am_file "*) + am_dir=\`echo \$am_file |sed 's%:.*%%;s%[^/]*\$%%'\` + if test -n "\$am_dir"; then + am_tmpdir=\`echo \$am_dir |sed 's%^\(/*\).*\$%\1%'\` + for am_subdir in \`echo \$am_dir |sed 's%/% %'\`; do + am_tmpdir=\$am_tmpdir\$am_subdir/ + if test ! -d \$am_tmpdir; then + mkdir \$am_tmpdir + fi + done + fi + echo timestamp > "\$am_dir"stamp-h\$am_indx + ;; + esac + am_indx=\`expr \$am_indx + 1\` +done]) +])]) # AM_CONFIG_HEADER + +# _AM_DIRNAME(PATH) +# ----------------- +# Like AS_DIRNAME, only do it during macro expansion +AC_DEFUN([_AM_DIRNAME], + [m4_if(m4_regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1, + m4_if(m4_regexp([$1], [^//\([^/]\|$\)]), -1, + m4_if(m4_regexp([$1], [^/.*]), -1, + [.], + m4_patsubst([$1], [^\(/\).*], [\1])), + m4_patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])), + m4_patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl +]) # _AM_DIRNAME + diff --git a/config.guess b/config.guess new file mode 100644 index 0000000..0f0fe71 --- /dev/null +++ b/config.guess @@ -0,0 +1,1516 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2007-03-06' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:[3456]*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T | authenticamd) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa:Linux:*:*) + echo xtensa-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..16dc24f --- /dev/null +++ b/config.h.in @@ -0,0 +1,169 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define if you have the CoreAudio API */ +#undef HAVE_COREAUDIO + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRT_EXTERNS_H + +/* Defines if your system has the crypt function */ +#undef HAVE_CRYPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if you have libjpeg */ +#undef HAVE_LIBJPEG + +/* Define if you have libpng */ +#undef HAVE_LIBPNG + +/* Define if you have a working libpthread (will enable threaded code) */ +#undef HAVE_LIBPTHREAD + +/* Define if you have libz */ +#undef HAVE_LIBZ + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define if your system needs _NSGetEnviron to set up the environment */ +#undef HAVE_NSGETENVIRON + +/* Define to 1 if you have the header file. + */ +#undef HAVE_PTHREAD_LINUXTHREADS_PTHREAD_H + +/* Define if you have the res_init function */ +#undef HAVE_RES_INIT + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* C++ compiler supports template repository */ +#undef HAVE_TEMPLATE_REPOSITORY + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define if you want Xinerama support */ +#undef HAVE_XINERAMA + +/* Suffix for lib directories */ +#undef KDELIBSUFF + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of a `char', as computed by sizeof. */ +#undef SIZEOF_CHAR + +/* The size of a `char *', as computed by sizeof. */ +#undef SIZEOF_CHAR_P + +/* The size of a `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of a `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* + * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system + * headers and I'm too lazy to write a configure test as long as only + * unixware is related + */ +#ifdef _UNIXWARE +#define HAVE_BOOLEAN +#endif + + + +/* + * AIX defines FD_SET in terms of bzero, but fails to include + * that defines bzero. + */ + +#if defined(_AIX) +#include +#endif + + + +/* + * On HP-UX, the declaration of vsnprintf() is needed every time ! + */ + +#if !defined(HAVE_VSNPRINTF) || defined(hpux) +#if __STDC__ +#include +#include +#else +#include +#endif +#ifdef __cplusplus +extern "C" +#endif +int vsnprintf(char *str, size_t n, char const *fmt, va_list ap); +#ifdef __cplusplus +extern "C" +#endif +int snprintf(char *str, size_t n, char const *fmt, ...); +#endif + + + +#if defined(__SVR4) && !defined(__svr4__) +#define __svr4__ 1 +#endif + + +/* Compatibility define */ +#undef ksize_t + +/* Define the real type of socklen_t */ +#undef socklen_t diff --git a/config.log b/config.log new file mode 100644 index 0000000..f7d53bc --- /dev/null +++ b/config.log @@ -0,0 +1,300 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by configure, which was +generated by GNU Autoconf 2.57. Invocation command line was + + $ ./configure --host=x86_64-linux-gnu --build=x86_64-linux-gnu --enable-libsuffix --disable-debug --disable-rpath --sysconfdir=/etc --includedir=/opt/kde3/include/kde --infodir=/opt/kde3/share/info --mandir=/opt/kde3/share/man --with-qt-dir=/usr/share/qt3 --prefix=/opt/kde3 --with-extra-libs=/opt/kde3/lib + +## --------- ## +## Platform. ## +## --------- ## + +hostname = argus4 +uname -m = x86_64 +uname -r = 2.6.31-16-generic +uname -s = Linux +uname -v = #53-Ubuntu SMP Tue Dec 8 04:02:15 UTC 2009 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /opt/kde3/bin +PATH: /opt/kde3/games +PATH: /opt/kde3/bin +PATH: /home/eldarion/bin +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin +PATH: /usr/games + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:1509: checking build system type +configure:1527: result: x86_64-pc-linux-gnu +configure:1535: checking host system type +configure:1549: result: x86_64-pc-linux-gnu +configure:1557: checking target system type +configure:1571: result: x86_64-pc-linux-gnu +configure:1616: checking for a BSD-compatible install +configure:1670: result: /usr/bin/install -c +configure:1685: checking for -p flag to install +configure:1698: result: yes +configure:1709: checking whether build environment is sane + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-pc-linux-gnu +ac_cv_build_alias=x86_64-linux-gnu +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set=set +ac_cv_env_CFLAGS_value='-Wall -g -O2' +ac_cv_env_CPPFLAGS_set=set +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXCPP_set= +ac_cv_env_CXXCPP_value= +ac_cv_env_CXXFLAGS_set=set +ac_cv_env_CXXFLAGS_value='-g -O2' +ac_cv_env_CXX_set= +ac_cv_env_CXX_value= +ac_cv_env_LDFLAGS_set=set +ac_cv_env_LDFLAGS_value=-Wl,-Bsymbolic-functions +ac_cv_env_build_alias_set=set +ac_cv_env_build_alias_value=x86_64-linux-gnu +ac_cv_env_host_alias_set=set +ac_cv_env_host_alias_value=x86_64-linux-gnu +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_host=x86_64-pc-linux-gnu +ac_cv_host_alias=x86_64-linux-gnu +ac_cv_path_install='/usr/bin/install -c' +ac_cv_target=x86_64-pc-linux-gnu +ac_cv_target_alias=x86_64-linux-gnu + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +ACLOCAL='' +AMDEPBACKSLASH='' +AMDEP_FALSE='' +AMDEP_TRUE='' +AMTAR='' +ARTSCCONFIG='' +AUTOCONF='' +AUTODIRS='' +AUTOHEADER='' +AUTOMAKE='' +AWK='' +CC='' +CCDEPMODE='' +CFLAGS='-Wall -g -O2' +CONF_FILES='' +CPP='' +CPPFLAGS='' +CXX='' +CXXCPP='' +CXXDEPMODE='' +CXXFLAGS='-g -O2' +DCOPIDL2CPP='' +DCOPIDL='' +DCOP_DEPENDENCIES='' +DEFS='' +DEPDIR='' +ECHO='echo' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='' +EXEEXT='' +FRAMEWORK_COREAUDIO='' +GMSGFMT='' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_STRIP_PROGRAM='' +KDECONFIG='' +KDE_EXTRA_RPATH='' +KDE_INCLUDES='' +KDE_LDFLAGS='' +KDE_MT_LDFLAGS='' +KDE_MT_LIBS='' +KDE_PLUGIN='' +KDE_RPATH='' +KDE_USE_CLOSURE_FALSE='' +KDE_USE_CLOSURE_TRUE='' +KDE_USE_FINAL_FALSE='' +KDE_USE_FINAL_TRUE='' +KDE_XSL_STYLESHEET='' +LDFLAGS='-Wl,-Bsymbolic-functions' +LIBCOMPAT='' +LIBCRYPT='' +LIBDL='' +LIBJPEG='' +LIBOBJS='' +LIBPNG='' +LIBPTHREAD='' +LIBRESOLV='' +LIBS='' +LIBSM='' +LIBSOCKET='' +LIBTOOL='' +LIBUCB='' +LIBUTIL='' +LIBXINERAMA='' +LIBZ='' +LIB_KAB='' +LIB_KABC='' +LIB_KDECORE='' +LIB_KDEPRINT='' +LIB_KDEUI='' +LIB_KFILE='' +LIB_KFM='' +LIB_KHTML='' +LIB_KIO='' +LIB_KPARTS='' +LIB_KSPELL='' +LIB_KSYCOCA='' +LIB_POLL='' +LIB_QPE='' +LIB_QT='' +LIB_SMB='' +LIB_X11='' +LIB_XEXT='' +LN_S='' +LTLIBOBJS='' +MAKEINFO='' +MCOPIDL='' +MEINPROC='' +MOC='' +MSGFMT='' +NOOPT_CFLAGS='' +NOOPT_CXXFLAGS='' +NOREPO='' +OBJEXT='' +PACKAGE='' +PACKAGE_BUGREPORT='' +PACKAGE_NAME='' +PACKAGE_STRING='' +PACKAGE_TARNAME='' +PACKAGE_VERSION='' +PATH_SEPARATOR=':' +QTE_NORTTI='' +QT_INCLUDES='' +QT_LDFLAGS='' +RANLIB='' +REPO='' +SET_MAKE='' +SHELL='/bin/bash' +STRIP='' +TOPSUBDIRS='' +UIC='' +UIC_TR='' +USER_INCLUDES='' +USER_LDFLAGS='' +USE_EXCEPTIONS='' +USE_RTTI='' +USE_THREADS='' +VERSION='' +WOVERLOADED_VIRTUAL='' +XGETTEXT='' +X_EXTRA_LIBS='' +X_INCLUDES='' +X_LDFLAGS='' +X_PRE_LIBS='' +ac_ct_CC='' +ac_ct_CXX='' +ac_ct_RANLIB='' +ac_ct_STRIP='' +all_includes='' +all_libraries='' +am__include='' +am__quote='' +bindir='${exec_prefix}/bin' +build='x86_64-pc-linux-gnu' +build_alias='x86_64-linux-gnu' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='pc' +datadir='${prefix}/share' +exec_prefix='NONE' +host='x86_64-pc-linux-gnu' +host_alias='x86_64-linux-gnu' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='pc' +includedir='/opt/kde3/include/kde' +infodir='/opt/kde3/share/info' +install_sh='' +kde_appsdir='' +kde_bindir='' +kde_confdir='/etc/kde3' +kde_datadir='' +kde_htmldir='/usr/share/doc/kde/HTML' +kde_icondir='' +kde_includes='' +kde_libraries='' +kde_libs_htmldir='' +kde_libs_prefix='' +kde_locale='' +kde_mimedir='' +kde_moduledir='' +kde_qtver='' +kde_servicesdir='' +kde_servicetypesdir='' +kde_sounddir='' +kde_styledir='' +kde_templatesdir='' +kde_wallpaperdir='' +kde_widgetdir='' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localstatedir='${prefix}/var' +mandir='/opt/kde3/share/man' +oldincludedir='/usr/include' +prefix='/opt/kde3' +program_transform_name='s,x,x,' +qt_includes='' +qt_libraries='' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sysconfdir='/etc' +target='x86_64-pc-linux-gnu' +target_alias='' +target_cpu='x86_64' +target_os='linux-gnu' +target_vendor='pc' +x_includes='NONE' +x_libraries='NONE' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +#define PACKAGE_BUGREPORT "" +#define PACKAGE_NAME "" +#define PACKAGE_STRING "" +#define PACKAGE_TARNAME "" +#define PACKAGE_VERSION "" + +configure: caught signal 2 +configure: exit 1 diff --git a/config.sub b/config.sub new file mode 100644 index 0000000..5defff6 --- /dev/null +++ b/config.sub @@ -0,0 +1,1622 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, +# Inc. + +timestamp='2007-01-18' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | score \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure.files b/configure.files new file mode 100644 index 0000000..030bce8 --- /dev/null +++ b/configure.files @@ -0,0 +1,2 @@ +./admin/configure.in.min +configure.in.in diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..7efc923 --- /dev/null +++ b/configure.in @@ -0,0 +1,85 @@ +dnl This file is part of the KDE libraries/packages +dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org) + +dnl This file is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. + +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. + +dnl You should have received a copy of the GNU Library General Public License +dnl along with this library; see the file COPYING.LIB. If not, write to +dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +dnl Boston, MA 02110-1301, USA. + +# Original Author was Kalle@kde.org +# I lifted it in some mater. (Stephan Kulow) +# I used much code from Janos Farkas + +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(acinclude.m4) dnl a source file from your sub dir + +dnl This is so we can use kde-common +AC_CONFIG_AUX_DIR(admin) + +dnl This ksh/zsh feature conflicts with `cd blah ; pwd` +unset CDPATH + +dnl Checking host/target/build systems, for make, install etc. +AC_CANONICAL_SYSTEM +dnl Perform program name transformation +AC_ARG_PROGRAM + +dnl Automake doc recommends to do this only here. (Janos) +AM_INIT_AUTOMAKE(knights, 0.6) dnl searches for some needed programs + +KDE_SET_PREFIX + +dnl generate the config header +AM_CONFIG_HEADER(config.h) dnl at the distribution this done + +dnl Checks for programs. +AC_CHECK_COMPILERS +AC_ENABLE_SHARED(yes) +AC_ENABLE_STATIC(no) +KDE_PROG_LIBTOOL + +dnl for NLS support. Call them in this order! +dnl WITH_NLS is for the po files +AM_KDE_WITH_NLS + +KDE_USE_QT(3.0.0) +AC_PATH_KDE +#MIN_CONFIG(3.0.0) + +dnl PACKAGE set before +AC_PREREQ(2.5) + +KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(meinproc)]) +AC_SUBST(MEINPROC) + +KDE_CREATE_SUBDIRSLIST +AC_CONFIG_FILES([ Makefile ]) +AC_CONFIG_FILES([ admin/Makefile ]) +AC_CONFIG_FILES([ doc/Makefile ]) +AC_CONFIG_FILES([ knights/Makefile ]) +AC_CONFIG_FILES([ media/Makefile ]) +AC_CONFIG_FILES([ po/Makefile ]) +AC_OUTPUT +if test "$all_tests" = "bad"; then + if test ! "$cache_file" = "/dev/null"; then + echo "" + echo "Please remove the file $cache_file after changing your setup" + echo "so that configure will find the changes next time." + echo "" + fi +else + echo "" + echo "Good - your configure finished. Start make now" + echo "" +fi diff --git a/configure.in.in b/configure.in.in new file mode 100644 index 0000000..8c278ce --- /dev/null +++ b/configure.in.in @@ -0,0 +1,8 @@ +#MIN_CONFIG(3.0.0) + +AM_INIT_AUTOMAKE(knights,0.6) +AC_PREREQ(2.5) + +KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(meinproc)]) +AC_SUBST(MEINPROC) + diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..c2914d0 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,118 @@ +####### kdevelop will overwrite this part!!! (begin)########## + + +EXTRA_DIST = help_en.docbook help_fr.docbook + +####### kdevelop will overwrite this part!!! (end)############ + +MAINTAINERCLEANFILES = ./*.html +CLEANFILES = core *~ .deps/* doc/*~ *.orig changes.docbook +DISTCLEANFILES = Makefile.in Makefile + +LANGUAGES = en fr de et it fi es ru +SUFFIXES = .docbook .po .pot +SGMLDIR=$(kde_datadir)/ksgmltools2 +DOCDIR = $(DESTDIR)${kde_htmldir} +XML2POT = xml2pot +PO2XML = po2xml +MSGMERGE = msgmerge + + +help_en.pot: help_en.docbook + $(XML2POT) help_en.docbook > help_en.pot + +# --- translated docbook online help --- + +help_fr.po: help_en.pot + $(MSGMERGE) -o help_fr.po help_fr.po help_en.pot + +help_fr.docbook: help_en.docbook help_en.pot + ${MAKE} help_fr.po + @echo "converting french help" + @ $(PO2XML) help_en.docbook help_fr.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ French\ /g \ + > help_fr.docbook + +help_de.po: help_en.pot + $(MSGMERGE) -o help_de.po help_de.po help_en.pot + +help_de.docbook: help_en.docbook help_en.pot + ${MAKE} help_de.po + @echo "converting german help" + @ $(PO2XML) help_en.docbook help_de.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ German\ /g \ + > help_de.docbook + +help_et.po: help_en.pot + $(MSGMERGE) -o help_et.po help_et.po help_en.pot + +help_et.docbook: help_en.docbook help_en.pot + ${MAKE} help_et.po + @echo "converting estonian help" + @ $(PO2XML) help_en.docbook help_et.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Estonian\ /g \ + > help_de.docbook + +help_it.po: help_en.pot + $(MSGMERGE) -o help_it.po help_it.po help_en.pot + +help_it.docbook: help_en.docbook help_en.pot + ${MAKE} help_it.po + @echo "converting italian help" + @ $(PO2XML) help_en.docbook help_it.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Italian\ /g \ + > help_it.docbook + +help_fi.po: help_en.pot + $(MSGMERGE) -o help_fi.po help_fi.po help_en.pot + +help_fi.docbook: help_en.docbook help_en.pot + ${MAKE} help_fi.po + @echo "converting finnish help" + @ $(PO2XML) help_en.docbook help_fi.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Finnish\ /g \ + > help_fi.docbook + +help_es.po: help_en.pot + $(MSGMERGE) -o help_es.po help_es.po help_en.pot + +help_es.docbook: help_en.docbook help_en.pot + ${MAKE} help_es.po + @echo "converting spanish help" + @ $(PO2XML) help_en.docbook help_es.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Spanish\ /g \ + > help_es.docbook + +help_ru.po: help_en.pot + $(MSGMERGE) -o help_ru.po help_ru.po help_en.pot + +help_ru.docbook: help_en.docbook help_en.pot + ${MAKE} help_ru.po + @echo "converting russian help" + @ $(PO2XML) help_en.docbook help_ru.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Russian\ /g \ + > help_ru.docbook + +# --- --- + +install-data-local: + echo installing docs in $(DOCDIR) + for lang in ${LANGUAGES}; do \ + { \ + $(mkinstalldirs) ${DOCDIR}/$${lang}/$(PACKAGE); \ + $(INSTALL_DATA) help_$${lang}.docbook ${DOCDIR}/$${lang}/$(PACKAGE)/index.docbook; \ + if test ! -e ${DOCDIR}/$${lang}/$(PACKAGE)/common ; then \ + rm -f ${DOCDIR}/$${lang}/$(PACKAGE)/common ; fi ; \ + ( cd ${DOCDIR}/$${lang}/${PACKAGE} ; ln -sf ../common . ) ; \ + }; done + cd ${DOCDIR} ; \ + if test ! -e default/$(PACKAGE) -a -e default ; then ln -sf ../en/$(PACKAGE) default; fi; + +uninstall-local: + for lang in ${LANGUAGES}; do { \ + rm -R -f ${DOCDIR}/$${lang}/${PACKAGE} ; \ + rmdir -p --ignore-fail-on-non-empty $(DOCDIR)/$$lang >/dev/null 2>&1; \ + if test -L ${DOCDIR}/default/$(PACKAGE); then rm -f ${DOCDIR}/default/$(PACKAGE); fi; \ + }; done + +all: diff --git a/doc/Makefile.in.backup b/doc/Makefile.in.backup new file mode 100644 index 0000000..3334f07 --- /dev/null +++ b/doc/Makefile.in.backup @@ -0,0 +1,533 @@ +# Makefile.in generated automatically by automake 1.5 from Makefile.am. +# KDE tags expanded automatically by am_edit - $Revision: 1.7 $ +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +####### kdevelop will overwrite this part!!! (begin)########## + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_alias = @build_alias@ +build_triplet = @build@ +host_alias = @host_alias@ +host_triplet = @host@ +target_alias = @target_alias@ +target_triplet = @target@ +AMTAR = @AMTAR@ +ARTSCCONFIG = @ARTSCCONFIG@ +AS = @AS@ +AUTODIRS = @AUTODIRS@ +AWK = @AWK@ +CC = @CC@ +CONF_FILES = @CONF_FILES@ +CPP = @CPP@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +DCOPIDL = @DCOPIDL@ +DCOPIDL2CPP = @DCOPIDL2CPP@ +DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOXYGEN = @DOXYGEN@ +DOXYGEN_PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ +DOXYGEN_PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@ +DPMSINC = @DPMSINC@ +DPMSLIB = @DPMSLIB@ +ECHO = @ECHO@ +EXEEXT = @EXEEXT@ +FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ +GCJ = @GCJ@ +GCJFLAGS = @GCJFLAGS@ +GLINC = @GLINC@ +GLLIB = @GLLIB@ +GMSGFMT = @GMSGFMT@ +IDL = @IDL@ +IDL_DEPENDENCIES = @IDL_DEPENDENCIES@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JAR = @JAR@ +JAVAC = @JAVAC@ +JAVAH = @JAVAH@ +JVMLIBS = @JVMLIBS@ +KDECONFIG = @KDECONFIG@ +KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ +KDE_HAS_DOXYGEN = @KDE_HAS_DOXYGEN@ +KDE_HAVE_DOT = @KDE_HAVE_DOT@ +KDE_INCLUDES = @KDE_INCLUDES@ +KDE_LDFLAGS = @KDE_LDFLAGS@ +KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ +KDE_MT_LIBS = @KDE_MT_LIBS@ +KDE_PLUGIN = @KDE_PLUGIN@ +KDE_RPATH = @KDE_RPATH@ +KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ +KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ +KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ +KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ +KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LIBBZ2 = @LIBBZ2@ +LIBCOMPAT = @LIBCOMPAT@ +LIBCRYPT = @LIBCRYPT@ +LIBDL = @LIBDL@ +LIBGEN = @LIBGEN@ +LIBJPEG = @LIBJPEG@ +LIBMICO = @LIBMICO@ +LIBOBJS = @LIBOBJS@ +LIBPNG = @LIBPNG@ +LIBPTHREAD = @LIBPTHREAD@ +LIBPYTHON = @LIBPYTHON@ +LIBQIMGIO = @LIBQIMGIO@ +LIBRESOLV = @LIBRESOLV@ +LIBSHADOW = @LIBSHADOW@ +LIBSM = @LIBSM@ +LIBSOCKET = @LIBSOCKET@ +LIBSSL = @LIBSSL@ +LIBTIFF = @LIBTIFF@ +LIBTOOL = @LIBTOOL@ +LIBUCB = @LIBUCB@ +LIBUTIL = @LIBUTIL@ +LIBXINERAMA = @LIBXINERAMA@ +LIBZ = @LIBZ@ +LIB_KAB = @LIB_KAB@ +LIB_KABC = @LIB_KABC@ +LIB_KDECORE = @LIB_KDECORE@ +LIB_KDEPRINT = @LIB_KDEPRINT@ +LIB_KDEUI = @LIB_KDEUI@ +LIB_KFILE = @LIB_KFILE@ +LIB_KFM = @LIB_KFM@ +LIB_KHTML = @LIB_KHTML@ +LIB_KIMGIO = @LIB_KIMGIO@ +LIB_KIO = @LIB_KIO@ +LIB_KPARTS = @LIB_KPARTS@ +LIB_KSPELL = @LIB_KSPELL@ +LIB_KSYCOCA = @LIB_KSYCOCA@ +LIB_POLL = @LIB_POLL@ +LIB_QPE = @LIB_QPE@ +LIB_QT = @LIB_QT@ +LIB_QTOPIA = @LIB_QTOPIA@ +LIB_SMB = @LIB_SMB@ +LIB_X11 = @LIB_X11@ +LIB_XEXT = @LIB_XEXT@ +LN_S = @LN_S@ +MCOPIDL = @MCOPIDL@ +MEINPROC = @MEINPROC@ +MICO_INCLUDES = @MICO_INCLUDES@ +MICO_LDFLAGS = @MICO_LDFLAGS@ +MOC = @MOC@ +MSGFMT = @MSGFMT@ +NOOPT_CFLAGS = @NOOPT_CFLAGS@ +NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ +NOREPO = @NOREPO@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PAMLIBS = @PAMLIBS@ +PASSWDLIBS = @PASSWDLIBS@ +PYTHONINC = @PYTHONINC@ +PYTHONLIB = @PYTHONLIB@ +PYTHONMODDIR = @PYTHONMODDIR@ +QTDOCDIR = @QTDOCDIR@ +QTE_NORTTI = @QTE_NORTTI@ +QTOPIA_INCLUDES = @QTOPIA_INCLUDES@ +QT_INCLUDES = @QT_INCLUDES@ +QT_LDFLAGS = @QT_LDFLAGS@ +RANLIB = @RANLIB@ +RC = @RC@ +REPO = @REPO@ +SETUIDFLAGS = @SETUIDFLAGS@ +SSL_INCLUDES = @SSL_INCLUDES@ +SSL_LDFLAGS = @SSL_LDFLAGS@ +STRIP = @STRIP@ +TOPSUBDIRS = @TOPSUBDIRS@ +UIC = @UIC@ +UIC_TR = @UIC_TR@ +USER_INCLUDES = @USER_INCLUDES@ +USER_LDFLAGS = @USER_LDFLAGS@ +USE_EXCEPTIONS = @USE_EXCEPTIONS@ +USE_RTTI = @USE_RTTI@ +USE_THREADS = @USE_THREADS@ +VERSION = @VERSION@ +WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ +XGETTEXT = @XGETTEXT@ +XPMINC = @XPMINC@ +XPMLIB = @XPMLIB@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_INCLUDES = @X_INCLUDES@ +X_LDFLAGS = @X_LDFLAGS@ +X_PRE_LIBS = @X_PRE_LIBS@ +all_includes = @all_includes@ +all_libraries = @all_libraries@ +am__include = @am__include@ +am__quote = @am__quote@ +idldir = @idldir@ +install_sh = @install_sh@ +jni_includes = @jni_includes@ +kde_appsdir = @kde_appsdir@ +kde_bindir = @kde_bindir@ +kde_confdir = @kde_confdir@ +kde_datadir = @kde_datadir@ +kde_htmldir = @kde_htmldir@ +kde_icondir = @kde_icondir@ +kde_includes = @kde_includes@ +kde_libraries = @kde_libraries@ +kde_libs_htmldir = @kde_libs_htmldir@ +kde_libs_prefix = @kde_libs_prefix@ +kde_locale = @kde_locale@ +kde_mimedir = @kde_mimedir@ +kde_moduledir = @kde_moduledir@ +kde_qtver = @kde_qtver@ +kde_servicesdir = @kde_servicesdir@ +kde_servicetypesdir = @kde_servicetypesdir@ +kde_sounddir = @kde_sounddir@ +kde_styledir = @kde_styledir@ +kde_templatesdir = @kde_templatesdir@ +kde_wallpaperdir = @kde_wallpaperdir@ +kde_widgetdir = @kde_widgetdir@ +micodir = @micodir@ +qt_includes = @qt_includes@ +qt_libraries = @qt_libraries@ +x_includes = @x_includes@ +x_libraries = @x_libraries@ + +EXTRA_DIST = help_en.docbook help_fr.docbook + + +####### kdevelop will overwrite this part!!! (end)############ +MAINTAINERCLEANFILES = ./*.html +CLEANFILES = core *~ .deps/* doc/*~ *.orig changes.docbook +DISTCLEANFILES = Makefile.in Makefile + +LANGUAGES = en fr de et it fi es ru +SUFFIXES = .docbook .po .pot +SGMLDIR = $(kde_datadir)/ksgmltools2 +DOCDIR = $(DESTDIR)${kde_htmldir} +XML2POT = xml2pot +PO2XML = po2xml +MSGMERGE = msgmerge +subdir = doc +mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DIST_COMMON = Makefile.am Makefile.in +#>- all: all-am +#>+ 1 +all: docs-am all-am + +.SUFFIXES: +.SUFFIXES: .docbook .po .pot + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +#>- cd $(top_srcdir) && \ +#>- $(AUTOMAKE) --gnu doc/Makefile +#>+ 3 + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile + cd $(top_srcdir) && perl admin/am_edit knights-0.6/doc/Makefile.in +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && \ + CONFIG_HEADERS= CONFIG_LINKS= \ + CONFIG_FILES=$(subdir)/$@ $(SHELL) ./config.status +uninstall-info-am: +tags: TAGS +TAGS: + + +#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +#>+ 4 +KDE_DIST=help_et.po help_fi.po help_de.po help_it.po help_ru.po help_es.po help_fr.po help_en.pot + +DISTFILES= $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) + + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + $(mkinstalldirs) "$(distdir)/$$dir"; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir) \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile + +installdirs: + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +#>- clean: clean-am +#>+ 1 +clean: kde-rpo-clean clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +uninstall-am: uninstall-info-am uninstall-local + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am info info-am install install-am install-data \ + install-data-am install-data-local install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool uninstall uninstall-am uninstall-info-am \ + uninstall-local + + +help_en.pot: help_en.docbook + $(XML2POT) help_en.docbook > help_en.pot + +# --- translated docbook online help --- + +help_fr.po: help_en.pot + $(MSGMERGE) -o help_fr.po help_fr.po help_en.pot + +help_fr.docbook: help_en.docbook help_en.pot + ${MAKE} help_fr.po + @echo "converting french help" + @ $(PO2XML) help_en.docbook help_fr.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ French\ /g \ + > help_fr.docbook + +help_de.po: help_en.pot + $(MSGMERGE) -o help_de.po help_de.po help_en.pot + +help_de.docbook: help_en.docbook help_en.pot + ${MAKE} help_de.po + @echo "converting german help" + @ $(PO2XML) help_en.docbook help_de.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ German\ /g \ + > help_de.docbook + +help_et.po: help_en.pot + $(MSGMERGE) -o help_et.po help_et.po help_en.pot + +help_et.docbook: help_en.docbook help_en.pot + ${MAKE} help_et.po + @echo "converting estonian help" + @ $(PO2XML) help_en.docbook help_et.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Estonian\ /g \ + > help_de.docbook + +help_it.po: help_en.pot + $(MSGMERGE) -o help_it.po help_it.po help_en.pot + +help_it.docbook: help_en.docbook help_en.pot + ${MAKE} help_it.po + @echo "converting italian help" + @ $(PO2XML) help_en.docbook help_it.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Italian\ /g \ + > help_it.docbook + +help_fi.po: help_en.pot + $(MSGMERGE) -o help_fi.po help_fi.po help_en.pot + +help_fi.docbook: help_en.docbook help_en.pot + ${MAKE} help_fi.po + @echo "converting finnish help" + @ $(PO2XML) help_en.docbook help_fi.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Finnish\ /g \ + > help_fi.docbook + +help_es.po: help_en.pot + $(MSGMERGE) -o help_es.po help_es.po help_en.pot + +help_es.docbook: help_en.docbook help_en.pot + ${MAKE} help_es.po + @echo "converting spanish help" + @ $(PO2XML) help_en.docbook help_es.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Spanish\ /g \ + > help_es.docbook + +help_ru.po: help_en.pot + $(MSGMERGE) -o help_ru.po help_ru.po help_en.pot + +help_ru.docbook: help_en.docbook help_en.pot + ${MAKE} help_ru.po + @echo "converting russian help" + @ $(PO2XML) help_en.docbook help_ru.po | \ + sed s/^\ \ \<\!ENTITY\ %\ English\ /\ \ \<\!ENTITY\ %\ Russian\ /g \ + > help_ru.docbook + +# --- --- + +install-data-local: + echo installing docs in $(DOCDIR) + for lang in ${LANGUAGES}; do \ + { \ + $(mkinstalldirs) ${DOCDIR}/$${lang}/$(PACKAGE); \ + $(INSTALL_DATA) help_$${lang}.docbook ${DOCDIR}/$${lang}/$(PACKAGE)/index.docbook; \ + if test ! -e ${DOCDIR}/$${lang}/$(PACKAGE)/common ; then \ + rm -f ${DOCDIR}/$${lang}/$(PACKAGE)/common ; fi ; \ + ( cd ${DOCDIR}/$${lang}/${PACKAGE} ; ln -sf ../common . ) ; \ + }; done + cd ${DOCDIR} ; \ + if test ! -e default/$(PACKAGE) -a -e default ; then ln -sf ../en/$(PACKAGE) default; fi; + +uninstall-local: + for lang in ${LANGUAGES}; do { \ + rm -R -f ${DOCDIR}/$${lang}/${PACKAGE} ; \ + rmdir -p --ignore-fail-on-non-empty $(DOCDIR)/$$lang >/dev/null 2>&1; \ + if test -L ${DOCDIR}/default/$(PACKAGE); then rm -f ${DOCDIR}/default/$(PACKAGE); fi; \ + }; done + +all: +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + + + +#>+ 2 +docs-am: + +#>+ 6 +force-reedit: + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile + cd $(top_srcdir) && perl admin/am_edit knights-0.6/doc/Makefile.in + + +#>+ 2 +final: + $(MAKE) all-am +#>+ 2 +final-install: + $(MAKE) install-am +#>+ 2 +no-final: + $(MAKE) all-am +#>+ 2 +no-final-install: + $(MAKE) install-am +#>+ 3 +cvs-clean: + $(MAKE) admindir=$(top_srcdir)/admin -f $(top_srcdir)/admin/Makefile.common cvs-clean + +#>+ 3 +kde-rpo-clean: + -rm -f *.rpo diff --git a/doc/help_en.docbook b/doc/help_en.docbook new file mode 100644 index 0000000..7b899f8 --- /dev/null +++ b/doc/help_en.docbook @@ -0,0 +1,795 @@ + + + + +]> + + + + + The Knights Handbook + + + + Troy + Corbin Jr. + +
+ tcorbin@users.sf.net +
+
+
+ + Troy + Corbin Jr. + +
+ tcorbin@users.sf.net +
+
+ Developer +
+
+ + + 2001, 2002 + Troy Corbin Jr. + + + &FDLNotice; + + + 2003-05-17 + + + 0.6 + + + + Knights is a graphical chess interface for &kde;. It supports chess matches against computer engines like GNUChess and Crafty, watching two computer engines play against each other, solitaire chess, matches played via Internet Chess Servers, and reviewing matches saved in Portable Game Notation. + + + + knights + KDE + game + chess + gnuchess + crafty + ICS + SAN + PGN + +
+ + + Introduction + + Chess is a game of strategy with a long history and many variations, and Knights aims to be the ultimate chess resource on your computer. Knights provides a virtual chess board and pieces which you can use to play against a variety of opponents. Currently, those opponents include yourself ( Solitaire chess is a wonderful way to improve your skill at the game ), computer opponents ( sometimes called chess engines ) which you have installed on your computer, and people connected to an internet chess server. In the future, you will also be able to play against a friend using email. + + + If you like to review chess matches which other people have played, Knights can help. Using Portable Game Notation ( PGN ), Knights can exchange recorded chess matches with most other computer chess programs. You can also record your own matches with Knights, and share them with anyone. + + + Future versions of Knights will include comprehensive chess education in the form of interactive tutorials. These tutorials will help new players grasp the basics, and help them evolve into advanced players. + + + + + Getting Started + + The following sections will help you become familiar with Knights quickly. + + + The Chessboard + + If you've ever played chess before, then Knights' chessboard should be easy to understand. It always displays one player at the top of the screen and the other at the bottom. By default, your pieces always start at the bottom while your opponent's start at the top. + + + Directly below the board are two clocks. The left clock has a white background and always shows the time for the white player. The right clock is always black and shows the time for the black player. + + + Making a Move + + To move a chessman, simply click the left mouse button while your pointer is over the chessman you wish to move. If it's your turn to move, the chessman will become highlighted. This lets you know that Knights is ready to move that chessman for you. Now, move your pointer to the position where you want your chessman to move to. Click the left mouse button. You've just moved your chessman! + + + You can also move your chessman using "Drag and Drop". Hold down the left mouse button over the chessman you wish to move and, while still holding down the mouse button, move your chessman to it's new position and release the button. + + + + Using Preview + + The Preview feature shows you where each chessman can move on a given turn. To use this feature, move your pointer so that it is over the chessman you wish to examine. Now, click the right mouse button. Any position which that chessman can move to will be highlighted. Moves which will result in a chessman being captured are colored differently. + + + If the chessman you are examining is yours, and it is your turn, you may go head and move him by left clicking on the desired square. + + + + You can tell Knights to automatically preview possible moves every time you left click on a chessman. See the Display Settings chapter to find out how. + + + + + SAN Notation + + You will notice that in the lower-right corner, there is a button which displays the last move using Standard Algebraic Notation ( SAN ). Clicking this button will display all the moves in this match. You can review a previous position by selecting it from this list. Another way to move through this list is to use the Up and Down arrow keys on your keyboard. This will step through each move one at a time. + + + + You can not make your next move while you are reviewing the match. You must return to the most recent entry in the list before you can make your move. If someone else makes a move while you are reviewing a previous position, Knights will automatically return you to the current position. + + + + + + Starting a New Match + + To start a new match, click on the File menu, then select New Match.... + + + The New Match Window + + The New Match Window lets you change the type of chess match you'd like to play. + + + + Online games can not be started from here. If you'd like to play chess online, please see the section of this document titled Using Knights Online. + + + + Clicking Human will tell Knights that you want to control this color yourself. + + + The Computer option, if available, will tell Knights that a Computer Opponent ( also known as a Chess Engine ) should control this color. Another window will pop up with a list of opponents that you have installed. After selecting an opponent, you should use the Player Strength slider to customize your opponent's skill level. Due to the fact that each computer opponent is unique, some which are set to Weak may actually be better than opponents set to Strong. Also note that some may completely ignore your preference and play that same no matter what skill level you select. + + + The Email option is not yet supported by Knights. + + + Once you've selected the players, you'll want to select the time controls for this match. Base Time is the number of minutes that this player has at the beginning of the match. After you make a number of moves, you'll receive extra time on your clock. Moves Per Base Time controls the number of moves needed to receive that extra time. Increment Per Move is yet another time bonus that you receive after every move. + + + + + + + Using Knights Online + + Knights can connect you with thousands of other chess players around the globe. You can play games, observe others playing, attend live classes, or just relax and chat. + + + Although Knights tries to make it easy to use a chess server, there are many commands and functions for each server that are beyond the scope of this document. You should check with the chess server you intend to use for a full description of these. + + + Getting Started + + If you used the Setup Wizard when you first installed Knights, then Knights will connect to the Free Internet Chess Server by default. If you did not use the Setup Wizard, or you'd prefer to connect to another chess server, you'll need to change Knights' settings. See the section of this document titled Chess Servers for instructions on doing this. + + + Your computer will need to be connected to the Internet before you attempt to connect to a chess server. Knights will display an error message if it can not access the Internet. + + + Some chess servers will require you to have a membership, which sometimes includes paying a membership fee. You will need to visit the website of your chosen chess server to sign up for membership. + + + If you are not interested in obtaining a membership, but you still want to play chess online, some chess servers will allow you to play as a free guest without signing up for anything. This is strongly suggested for those who have never played chess online before. + + + Connecting to a Server + + To connect to a chess server, click on File, and then select Connect to Server. + + + A new window will pop up asking for your Login and Password. You should have recieved these when you signed up for membership with this chess server. If you do not have a membership yet, click on the Log in as guest option. + + + + + Online Tools + + Once Knights has established a connection with your chosen chess server, several new tools will be displayed to help you make the most of your time online. + + + The Console + + The Console is your primary communications tool while you're online. All of the messages that are sent to you are displayed here. + + + Messages can be colored differently depending on the type of message. For example, a message from a chat channel may be displayed in blue, while message sent specifically to you may be in green. These colors ( and fonts ) may be customized by going to SettingsConfigure Knights.... Then click on Display, and then the Console tab. + + + This is also where you send your messages out. Just start typing on your keyboard to write a message, and press Enter to send it. Knights will remember the last 100 messages you sent out, which you can access by pressing SHIFT + UP and SHIFT + DOWN. + + + There are several shortcuts available for the most commonly used server commands. To see a list of these, your should read the section of this document titled Command Reference. + + + + The Sought Games List + + Ok, you've connected to a chess server. Now how do you play chess on it? + + + The Sought Games List will help. Right click on it, and select Seek Matches. A list of other players, who are also interested in playing a game of chess, will appear. When you find one you like, simply left click on it to start playing. + + + As you'll notice, there are a number of actions you can take when you right click on a match. They are: + + + + + Tell... will begin a private message between you and the player offering this match. Simply select this and type your message. + + + + + Assess will display a graph that shows you how your rating will be effected if you play a match against this opponent. + + + + + Player Info, otherwise known as "Finger", will display a wealth of information about this player. This information can include how long the player has been online, his rating for different types of chess matches, win/loss statistics, etc. + + + + + Player History shows the results of the last 14 or so games played by this opponent. There are columns in the history display for the players and their ratings (as adjusted by the result of the match), the winner, the type of match (blitz/standard, rated/unrated) and the date. + + + + + Add to Friends tells your ICS that you want to be notified whenever this player logs on and off the server. In the future, Knights will display your friends list so you can easily send them messages, observe their matches, and more. + + + + + Ignore This Player keeps you from hearing anything this player says, including private messages. + + + + + + The Sought Games Graph + + The Sought Games Graph performs the same function as the Sought Games List, but with one difference: Instead of displaying a list of players, it displays a graph. + + + Usually, when you're interested in playing a chess match, you already know how long you want the match to be, and you already know that you want to play against an opponent of a particular skill level. The graph is very useful for this, because it organizes the available games based on it's length, and on your opponent's strength. + + + Stronger opponents are listed at the top of the graph, while weaker opponents are listed at the bottom. Shorter games are listed at the left, while longer games are listed at the right. Rated games are displayed using a solid square, while unrated games use a hollow square. + + + Right clicking on a match will display the same menu used in the Sought Games List. That menu includes: + + + + + Tell... will begin a private message between you and the player offering this match. Simply select this and type your message. + + + + + Assess will display a graph that shows you how your rating will be effected if you play a match against this opponent. + + + + + Player Info, otherwise known as "Finger", will display a wealth of information about this player. This information can include how long the player has been online, his rating for different types of chess matches, win/loss statistics, etc. + + + + + Player History shows the results of the last 14 or so games played by this opponent. There are columns in the history display for the players and their ratings (as adjusted by the result of the match), the winner, the type of match (blitz/standard, rated/unrated) and the date. + + + + + Add to Friends tells your ICS that you want to be notified whenever this player logs on and off the server. In the future, Knights will display your friends list so you can easily send them messages, observe their matches, and more. + + + + + Ignore This Player keeps you from hearing anything this player says, including private messages. + + + + + + + + + Organizing Your Tabs + + Knights often must display more than just the chessboard. For example, when you play chess online, Knights must open up a new window containing several new tools. These tools are stacked on top of each other using tabs to help keep your desktop from getting too cluttered, but what if you want to see more than one of these tools at a time? + + + At the top of each tab, you'll find a Grip widget. It looks like three horizontal lines, and when you move your pointer over it, the pointer will change into four arrows. When this happens, you can click and drag that tab to a different position on the screen. If you drag it to another tab, then they will merge together into the same window. If you do not drag it onto another tab, it will create it's own window at the new location. + + + To the right of the Grip is a Close button. Clicking on this button will close out this Tab. If this was the only Tab in it's window, then the window will be closed as well. + + + + Whenever a tab is closed, Knights will remember the size of that tab. + + + + + + Settings + + One of our primary goals is to make Knights easy to setup and customize. When you need to customize Knights, select SettingsConfigure Knights.... A new window will be displayed. The following sections describe the various options available from this new window. + + + General + + Your Name is the name Knights records on saved games for you. + + + When Knights Begins It Should: This allows you to customize Knights' behavior when you run the program. + + + Save Match on Close? When you close a chess match, Knights can automatically save it for you. If this match doesn't yet have a file name, you will be prompted for one. + + + The Append to Save File option tells Knights that you wish to save all your games to a single pgn file. This is useful for players who wish to analyze their matches later in a chess database program like SCID. + + + Pause on Minimize This will cause Knights to pause all your matches when you minimize the Knights window. + + + + Some types of matches ( like matches on ICS ) can not be paused in this way. + + + + Always Promote to Queen When checked, any of your pawns that get promoted will automatically become a queen. Otherwise Knights will prompt you each time a pawn is promoted. + + + Call Flag Automatically This option will automatically declare you the winner of the match if your opponent's clock runs out of time. + + + + Display + + General + + Use the Install New Themes button to install themes that you've downloaded. + + + Use the Board Themes and Chessman Themes buttons to select the look of your board. Knights only includes one board theme and one chessman theme, but others are available for download.Click here to download the Knights Themepack. + + + Theme Size can be adjusted to make the board larger or smaller. + + + Using the Reverse Board Orientation option is like turning the chessboard 180 degrees. Normally, the board is displayed with your army on the bottom and your opponent's army on top. Checking this option puts your army on the top and your opponent's army on the bottom. + + + Display Startup Logo toggles the welcome screen. + + + Automatic Preview will enable the Preview feature for the left mouse button. + + + Show Last Move will highlight the chessman that moved on the previous turn. + + + Show Coordinates will draw the Rank and File coordinates on the board. + + + + Console + + The Font buttons allow you to alter the font for each different kind of text displayed on the console. The Color buttons beside them let you change the color which that font will be displayed in. The seventh extra Color button changes the background color. + + + Restore Defaults will disregard any changes you've made to the font and color options, returning them to their original state. + + + + + Audio + + Knights uses sounds to keep you informed of important events both on and off the board. For example, Knights can play a sound when a chessman is moved, or play another sound when someone sends you a private message online. This section describes the different options you have when it comes to Knights' sounds. + + + The enable Audio checkbox is like the power button on your stereo. Uncheck this, and all of Knights' sounds are turned off. + + + Audio Themes allows you to choose between different audio themes, which are similar to the graphical themes. Knights only includes one sound theme, but others may be available for download from the internet. + + + The Volume slider allows you to adjust how loudly Knights will play it's sounds. + + + + This is independent of the volume controls in your mixer and on your speakers. In other words, if the volume in Knights is at maximum, but your mixer's volume is at minimum, then you will not be able to hear Knights' sounds. + + + + For Current Match Only is a checkbox that allows you to turn off all sounds from chess matches that you are not actively watching. So if you have a match vs. GNUChess running, but you're looking at your match vs. Crafty, only the Crafty match will make sounds. When you click on the GNUChess match again, then it will make sounds again and the Crafty match will fall silent. + + + + Computer Opponents + + Here you'll be able to configure Knights to use various "Chess Engines", which are computer opponents you can play chess against. These engines are separate programs that do not come with Knights. To use them, you must first download a chess engine. Tim Mann's Chess Engines page has a great list of available engines for you to download. Knights should work with all of these. See the README and INSTALL instructions that come with each engine to install it. + + + Once you have a chess engine installed, click the Add... button on the right hand side of the window. A new window will be displayed. + + + The only things that you MUST enter to use the engine are the Protocol and the Engine Filename. + + + Engine Name is what Knights will call this engine when you select it as an opponent, or if there is an error. This is set for you if you leave it blank. + + + Protocol is a list of "languages" that computer opponents can speak. Knights acts like a translator by taking what the engine says and converting it into a move on the virtual chessboard. It is important to have the correct protocol or else the engine won't be able to play. + + + + For most engines, you should select XBoard as the protocol. The Knights protocol is reserved for future engines to use. + + + + Engine Filename should contain the actual location of the engine on your filesystem. Include the full path, unless the engine is in the search path. If you don't want to type this in, you can browse your filesystem with the folder icon on the right. Simply find the engine, left click on it, and left click Open. + + + Command Line Arguments is where you should add any special options for this engine. See the engine's documentation for a list of options and their useage. + + + Log File is a special text document which records the "conversation" between Knights and the engine. This is very useful for engine developers and for users who are having trouble getting Knights to work with a particular engine. Most users can leave this blank. + + + Click OK and Knights is now ready to use this engine! + + + You'll notice options which enable "Book Engines". Book engines are a kind of helper for the computer opponent. These types of engines are new and experimental. Therefore, you should not enable these unless you are a chess engine developer or unless you're sure that the engine supports "Bookengine" mode ( XBoard version 3 and Knights protocols ). + + + + Chess Servers + + This section is where you'll configure all your options related to Internet Chess Servers. + + + Servers + + If you'd like to configure Knights to use a new Chess Server, click the "Add..." button on the right hand side of the window. A new window will be displayed. + + + This window is used to tell Knights how it can connect to our chess server. Server Name is a descriptive title for the server. You can enter anything you want here. "My Chess Server", "FICS", etc. + + + Server URL is the address of the server. + + + Server Port tells Knights which port to communicate with the server on. If this is left blank, Knights will try to guess the port number. + + + Username and Password will store your login information. If you do not wish for Knights to remember your login information, just leave these blank and you will be prompted each time you connect. + + + A Timeseal is a program that helps to reduce the effect of Internet lag on your clock. It can be quite unpleasant to lose a match because your Internet connection is slow. If you have a Timeseal program that you'd like to use, enter the full path and filename for it here. + + + Log File can be used to keep a record of your session online. Be warned though: Knights does not maintain the size of your logfiles. + + + When all is done you can click OK to add this chess server to the list of those Knights will connect with. + + + + Options + + The Profanity Filter can be used to garble undesirable words. It has six levels of filtration. + + + Automatically Close Previous ICS Match does was it says. If you just played a match and you're starting a new one, Knights will go ahead and close the last one for you. + + + Private Matches will tell your ICS that you don't want your match to be observable. + + + The enable Premove option allows you to move your next chessman while it's still your opponent's turn. Knights will remember your selection and move the piece for you as soon as it's your turn again. + + + The enable Kibitzes option will display Kibitz message on the console if enabled. + + + enable Unregistered Tells will allow you to hear messages from unregistered users. + + + enable Shouts will allow you to hear shouts. + + + The enable Seeks option will display Sought Match messages. + + + Seconds Between Seek Updates This tells Knights how often you want it to refresh it's Sought Games List. Valid numbers range between 3 seconds to 2 minutes ( 120 seconds ). + + + + + + + Command Reference + + + + UP - Pressing up will step backwards through the move list and show you the previous position. + + + + + DOWN - Pressing down will step forward through the move list and show you the next board position. + + + + + ENTER - Pressing Enter will always bring up the Console cursor so you can enter text. Pressing Enter again will remove it and send anything you typed in between. + + + + + PAGE UP and PAGE DOWN - Pressing these keys will scroll the Console up and down. + + + + + SHIFT + UP and SHIFT + DOWN - These will scroll through the history of what you've typed previously. Very handy for repeating commands. + + + + + ALT + C - This will begin a reply to the last channel who sent you a tell. + + + + + ALT + K - This will begin a kibitz, which can be heard by everyone observing a match, including the players. + + + + + ALT + R - This will begin a reply to the last person who sent you a private tell. + + + + + ALT + W - This will begin a whisper, which can be heard by everyone observing the current match, but not by the players of that match. + + + + + + + Credits and License + + Knights + + + Program copyright 2001, 2002 Troy Corbin Jr. tcorbin@users.sf.net + + + Documentation copyright 2001, 2002 Troy Corbin Jr. tcorbin@users.sf.net + + + &underFDL; + &underGPL; + + + + Installation + + How to obtain Knights + + The Knights Project is located at http://knights.sourceforge.net. It will usually contain the most up-to-date information on Knights available. + + + + If you're using the OpenNIC root service, then you can reach the Knights Project at http://www.knights.oss. + + + + + Requirements + + Before you can install Knights, you must have the K Desktop Environment version 3.x or newer installed on your system. Knights also requires that you have Autoconf version 2.5 and Automake version 1.6. + + + + Compilation and Installation + + Knights uses autoconf and automake to ensure that compiling is easy. If for some reason Knights won't compile for you, help is available at the Knights Project website located at http://knights.sourceforge.net. + + + You must have the KDEDIR environment variable defined before you begin the installation. Without this, Knights will not be able to access it's resources! To add the KDEDIR environment variable, you need to edit your /etc/profile ( or ~/.bash_profile ) and add the line: + + + export KDEDIR="/usr" + + + ...where /usr is your KDE's base directory. + + + Now, change the present working directory to the location where you unarchived Knights and type the following: + + + +% ./configure +% make +% make + + + + Knights should now be installed and ready to go. You can type knights in a terminal to start the game, or create an icon for it and select that. + + + + + + Command Line Options + + Knights is a graphical chess interface and tries to make full use of it. Most every option you'd ever want should be available from Knights' Settings menu and Configure window. However, there are rare cases where a command line option is an absolute must. Here are descriptions for those options. + + +% knights + + + The use of this command line option is depreciated. If Knights displays garbage rather than a chessboard, then you did not set the KDEDIR environment variable correctly before compiling Knights. Please see the Installation instructions for the proper compiling procedures. + + +% knights + + + By appending a filename to the command line, you can start Knights with a chess match already loaded for you. + + + + + Knights Markup Language + + The Knights Markup Language is a variation on HTML with the specific purpose of formatting and displaying PGN data. The formatting is actually done using Qt's default rich-text commands. Since these are already explained at length on Trolltech's website, they will not be covered here. + + + This appendix lists the macros used within KML to represent PGN data. These macros are case-sensitive. + + + %whiteimage% - This will be replaced with an image showing the white player's picture, or a generic image if Knights can't find it. + + + %blackimage% - This will be replaced with an image showing the black player's picture, or a generic image if Knights can't find it. + + + %moves% - This represents the move data. Recursive annotations appear in italics, while comments appear in bold type. + + + %site% - Represents the PGN tag: Site. + + + %date% - Represents the PGN tag: Date. + + + %round% - Represents the PGN tag: Round. + + + %result% - Represents the PGN tag: Result. + + + %white% - Represents the PGN tag: White. + + + %whitetitle% - Represents the PGN tag: White Title. + + + %whiteelo% - Represents the PGN tag: White ELO. + + + %whiteuscf% - Represents the PGN tag: White USCF. + + + %whitena% - Represents the PGN tag: White NA. + + + %whitetype% - Represents the PGN tag: White Type. + + + %black% - Represents the PGN tag: Black. + + + %blacktitle% - Represents the PGN tag: Black Title. + + + %blackelo% - Represents the PGN tag: Black ELO. + + + %blackuscf% - Represents the PGN tag: Black USCF. + + + %blackna% - Represents the PGN tag: Black NA. + + + %blacktype% - Represents the PGN tag: Black Type. + + + %time% - Represents the PGN tag: Time. + + + %utctime% - Represents the PGN tag: UTC Time. + + + %utcdate% - Represents the PGN tag: UTC Date. + + + %event% - Represents the PGN tag: Event. + + + %eventdate% - Represents the PGN tag: Event Date. + + + %eventsponsor% - Represents the PGN tag: Event Sponsor. + + + %section% - Represents the PGN tag: Section. + + + %stage% - Represents the PGN tag: Stage. + + + %board% - Represents the PGN tag: Board. + + + %opening% - Represents the PGN tag: Opening. + + + %variation% - Represents the PGN tag: Variation. + + + %subvariation% - Represents the PGN tag: Subvariation. + + + %eco% - Represents the PGN tag: ECO. + + + %nic% - Represents the PGN tag: NIC. + + + %timecontrol% - Represents the PGN tag: Time Control. + + + %termination% - Represents the PGN tag: Termination. + + + %setup% - Represents the PGN tag: Setup. + + + %fen% - Represents the PGN tag: FEN. + + + %annotator% - Represents the PGN tag: Annotator. + + + %mode% - Represents the PGN tag: Mode. + + + %plycount% - Represents the PGN tag: Plycount. + + +
+ + + + diff --git a/doc/help_fr.docbook b/doc/help_fr.docbook new file mode 100644 index 0000000..0b3505f --- /dev/null +++ b/doc/help_fr.docbook @@ -0,0 +1,658 @@ + + + + +]> + + + + + + + + Troy + Corbin Jr. + +
+ tcorbin@users.sf.net +
+
+ +
+
+ + + 2001, 2002 + + + + &FDLNotice; + + + 2003-05-17 + + + 0.6 + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + &underFDL; + &underGPL; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/knights.lsm b/knights.lsm new file mode 100644 index 0000000..9ad58c2 --- /dev/null +++ b/knights.lsm @@ -0,0 +1,15 @@ +Begin3 +Title: Knights +Version: 0.6 +Entered-date: +Description: A graphical chess interface for KDE +Keywords: chess KDE FICS PGN ICS crafty gnuchess +Author: Troy Corbin Jr. +Maintained-by: Troy Corbin Jr. +Primary-site: http://knights-chess.com +Home-page: +Original-site: +Platforms: Linux and other Unices +Copying-policy: GNU Public License +End + diff --git a/knights.spec b/knights.spec new file mode 100644 index 0000000..a67ba4b --- /dev/null +++ b/knights.spec @@ -0,0 +1,95 @@ +# +# Knights Spec File +# +# Writen with Knights 0.4.9 +# +%define name knights +%define version 0.4.9 +%define release 1mdk + +Summary: A chess interface for the K Desktop Environment +Name: %{name} +Version: %{version} +Release: %{release} +Copyright: GPL +Group: Games/Boards +Source:%{name}-%{version}.tar.gz +URL: http://knights.sourceforge.net/ +Distribution: Mandrake Linux +Vendor: Mandrake +Packager: Troy Corbin Jr. +Requires: kde +BuildRoot: %{_tmppath}/%{name}-buildroot + +%description +A chess interface for the K Desktop Environment. Knights works with all +XBoard compatible chess engines, FICS, and .pgn files. + +%prep +rm -rf $RPM_BUILD_ROOT +%setup -a 0 + +%build +./configure i586-mandrake-linux \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --includedir=/usr/include \ + --libdir=/usr/lib \ + --libexecdir=/usr/lib \ + --localstatedir=/var/lib \ + --sharedstatedir=/usr/com \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info +%make +%install +# The menu entry used by debian and mandrake +cat << EOF > $RPM_BUILD_ROOT/%{_menudir}/knights +command="/usr/bin/knights" +icon="knights.pgn" +needs="kde" +section="Amusement/Boards" +title="Knights" +longtitle="A graphical chess interface for KDE" +EOF +%makeinstall + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root,0755) +%doc README COPYING AUTHORS ChangeLog CreatingThemes TODO INSTALL +/usr/bin/knights +/usr/share/doc/HTML/en/knights/knights-01.png +/usr/share/doc/HTML/en/knights/knights-02.png +/usr/share/doc/HTML/en/knights/configure-02.png +/usr/share/doc/HTML/en/knights/configure-1.png +/usr/share/doc/HTML/en/knights/configure-3.png +/usr/share/doc/HTML/en/knights/index.docbook +/usr/share/apps/knights/splash.png +/usr/share/apps/knights/wizard.png +/usr/share/apps/knights/themes/KBDefault.tar.gz +/usr/share/apps/knights/themes/KCDefault.tar.gz +/usr/share/apps/knights/icon-display.png +/usr/share/apps/knights/icon-general.png +/usr/share/apps/knights/icon-console-bottom.png +/usr/share/apps/knights/icon-console-detach.png +/usr/share/apps/knights/icon-console-side.png +/usr/share/icons/locolor/16x16/apps/knights.png +/usr/share/icons/locolor/32x32/apps/knights.png +/usr/share/icons/hicolor/16x16/apps/knights.png +/usr/share/icons/hicolor/32x32/apps/knights.png +/usr/share/icons/hicolor/48x48/apps/knights.png +/usr/share/icons/hicolor/64x64/apps/knights.png +/usr/share/icons/locolor/16x16/mimetypes/pgn.png +/usr/share/icons/locolor/32x32/mimetypes/pgn.png +/usr/share/icons/hicolor/16x16/mimetypes/pgn.png +/usr/share/icons/hicolor/32x32/mimetypes/pgn.png +/usr/share/icons/hicolor/48x48/mimetypes/pgn.png +/usr/share/icons/hicolor/64x64/mimetypes/pgn.png +/usr/share/applnk/Amusement/Boards/knights.desktop + diff --git a/knights/Makefile.am b/knights/Makefile.am new file mode 100644 index 0000000..4bbec46 --- /dev/null +++ b/knights/Makefile.am @@ -0,0 +1,61 @@ +####### kdevelop will overwrite this part!!! (begin)########## +bin_PROGRAMS = knights + +## INCLUDES were found outside kdevelop specific part + +knights_SOURCES = board_2d.cpp board_base.cpp setpagedisplay.cpp proto_xboard.cpp dlg_selectengine.cpp thinbuttons.cpp pgn.cpp io_engine.cpp dlg_challenge.cpp idmanager.cpp challenge_graph.cpp dlg_login.cpp tabgrip.cpp tabpage.cpp tab_seeklist.cpp dlg_engine.cpp setpageaudio.cpp proto_base.cpp dlg_server.cpp core.cpp match_param.cpp knightspixcache.cpp dlg_settings.cpp console.cpp match.cpp setpagegeneral.cpp splash.cpp audio.cpp main.cpp logic.cpp list_pgn.cpp challenge_graph_view.cpp accel.cpp dlg_selectemail.cpp challenge_rectangle.cpp knightstextview.cpp tabmanager.cpp command.cpp dlg_newmatch.cpp chessclock.cpp dlg_promote.cpp resource.cpp tabbox.cpp io_internet.cpp challenge_game.cpp knights.cpp tab_pgnview.cpp io_base.cpp wiz_setup.cpp setpageservers.cpp proto_uci.cpp setpageengines.cpp +knights_LDADD = -lqt-mt -lartskde -lkio -lkdeprint -lkdeui -lkdecore $(LIBSOCKET) + +EXTRA_DIST = setpageengines.cpp proto_uci.cpp setpageservers.cpp wiz_setup.cpp setpageengines.h io_base.cpp knightsmap.h tab_pgnview.cpp knights.cpp challenge_game.cpp io_internet.cpp challenge_graph_view.h resource.h tabbox.cpp resource.cpp dlg_promote.cpp dlg_server.h pgn.h chessclock.cpp dlg_newmatch.cpp command.h io_internet.h challenge_rectangle.h command.cpp tabmanager.cpp dlg_promote.h definitions.h knightstextview.cpp challenge_rectangle.cpp dlg_selectemail.cpp splash.h list_pgn.h accel.cpp tabmanager.h match.h setpagedisplay.h challenge_graph_view.cpp list_pgn.cpp logic.h logic.cpp knightstextview.h main.cpp audio.cpp splash.cpp setpagegeneral.cpp match.cpp io_base.h console.h idmanager.h dlg_selectemail.h console.cpp tab_pgnview.h knights.h dlg_settings.cpp core.h knightspixcache.cpp thinbuttons.h dlg_settings.h setpageservers.h tab_seeklist.h match_param.cpp core.cpp match_param.h dlg_server.cpp pgn.desktop tabbox.h accel.h io_engine.h proto_base.cpp setpageaudio.cpp dlg_engine.cpp tab_seeklist.cpp tabpage.cpp challenge_graph.h tabgrip.cpp dlg_login.cpp challenge_graph.cpp proto_uci.h setpageaudio.h proto_base.h chessclock.h setpagegeneral.h idmanager.cpp dlg_challenge.cpp io_engine.cpp audio.h dlg_newmatch.h pgn.cpp dlg_engine.h thinbuttons.cpp wiz_setup.h dlg_selectengine.cpp challenge_game.h proto_xboard.cpp knightspixcache.h setpagedisplay.cpp tabgrip.h knights.desktop dlg_login.h proto_xboard.h dlg_challenge.h dlg_selectengine.h tabpage.h board_base.cpp board_base.h board_2d.cpp board_2d.h Makefile.am + +install-data-local: + $(mkinstalldirs) $(kde_mimedir)/application/ + $(INSTALL_DATA) $(srcdir)/pgn.desktop $(kde_mimedir)/application/pgn.desktop + $(mkinstalldirs) $(kde_appsdir)/Games/Board/ + $(INSTALL_DATA) $(srcdir)/knights.desktop $(kde_appsdir)/Games/Board/knights.desktop + +uninstall-local: + -rm -f $(kde_mimedir)/application/pgn.desktop + -rm -f $(kde_appsdir)/Games/Board/knights.desktop + +####### kdevelop will overwrite this part!!! (end)############ +# this 10 paths are KDE specific. Use them: +# kde_htmldir Where your docs should go to. (contains lang subdirs) +# kde_appsdir Where your application file (.kdelnk) should go to. +# kde_icondir Where your icon should go to. +# kde_minidir Where your mini icon should go to. +# kde_datadir Where you install application data. (Use a subdir) +# kde_locale Where translation files should go to.(contains lang subdirs) +# kde_cgidir Where cgi-bin executables should go to. +# kde_confdir Where config files should go to. +# kde_mimedir Where mimetypes should go to. +# kde_toolbardir Where general toolbar icons should go to. +# kde_wallpaperdir Where general wallpapers should go to. + +# set the include path for X, qt and KDE +INCLUDES= $(all_includes) + +METASOURCES = AUTO + +# the library search path. +knights_LDFLAGS = $(all_libraries) $(KDE_RPATH) + +# Uncomment the following two lines if you add a ui.rc file for your application to make use of +# KDE´s XML GUI builing +#rcdir = $(kde_datadir)/knights +#rc_DATA = knightsui.rc + +#WARNING: if you use a ui.rc file above, use: + +# messages: rc.cpp + +# instead of + +# messages: + +messages: + LIST=`find $(srcdir) -name \*.h -o -name \*.hh -o -name \*.H -o -name \*.hxx -o -name \*.hpp -o -name \*.cpp -o -name \*.cc -o -name \*.cxx -o -name \*.ecpp -o -name \*.C`; \ + if test -n "$$LIST"; then \ + $(XGETTEXT) $$LIST -o $(podir)/knights.pot; \ + fi + diff --git a/knights/accel.cpp b/knights/accel.cpp new file mode 100644 index 0000000..c2ef168 --- /dev/null +++ b/knights/accel.cpp @@ -0,0 +1,60 @@ +/*************************************************************************** + accel.cpp - description + ------------------- + begin : Wed Nov 6 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "accel.moc" +#include + +Accel::Accel( QWidget *parent, QObject *target ) : KAccel( parent ) +{ + insertItem( i18n("Previous Move"), "Previous Move", Key_Up, TRUE ); + insertItem( i18n("Next Move"), "Next Move", Key_Down, TRUE ); + insertItem( i18n("Enter Text"), "Enter Text", Key_Return, TRUE ); + insertItem( i18n("Page Up"), "Page Up", Key_PageUp, TRUE ); + insertItem( i18n("Page Down"), "Page Down", Key_PageDown, TRUE ); + insertItem( i18n("Increase Board Size"), "Board Up", ALT + Key_Plus, TRUE ); + insertItem( i18n("Decrease Board Size"), "Board Down", ALT + Key_Minus, TRUE ); + insertItem( i18n("Last History Item"), "Last History Item", SHIFT + Key_Up, TRUE ); + insertItem( i18n("Next History Item"), "Next History Item", SHIFT + Key_Down, TRUE ); + insertItem( i18n("Reply to the Last Tell"), "Tell Reply", ALT + Key_R, TRUE ); + insertItem( i18n("Reply to the Channel"), "Channel Reply", ALT + Key_C, TRUE ); + insertItem( i18n("Kibitz"), "Kibitz", ALT + Key_K, TRUE ); + insertItem( i18n("Whisper"), "Whisper", ALT + Key_W, TRUE ); + readSettings(); + + if( target ) + setTarget( target ); +} +Accel::~Accel() +{ + writeSettings(); +} +void Accel::setTarget( QObject *target ) +{ + connectItem( "Board Down" , target, SIGNAL( board_down() ) ); + connectItem( "Board Up" , target, SIGNAL( board_up() ) ); + connectItem( "Previous Move" , target, SIGNAL( move_prev() ) ); + connectItem( "Next Move" , target, SIGNAL( move_next() ) ); + connectItem( "Page Up", target, SIGNAL( page_up() ) ); + connectItem( "Page Down", target, SIGNAL( page_down() ) ); + connectItem( "Last History Item", target, SIGNAL( history_prev() ) ); + connectItem( "Next History Item", target, SIGNAL( history_next() ) ); + connectItem( "Tell Reply", target, SIGNAL( reply_tell() ) ); + connectItem( "Channel Reply", target, SIGNAL( reply_channel() ) ); + connectItem( "Enter Text", target, SIGNAL( focus() ) ); + connectItem( "Kibitz", target, SIGNAL( kibitz() ) ); + connectItem( "Whisper", target, SIGNAL( whisper() ) ); +} diff --git a/knights/accel.h b/knights/accel.h new file mode 100644 index 0000000..6767a3e --- /dev/null +++ b/knights/accel.h @@ -0,0 +1,59 @@ +/*************************************************************************** + accel.h - description + ------------------- + begin : Wed Nov 6 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef ACCEL_H +#define ACCEL_H + +#include + +/** + *@author Troy Corbin Jr. + */ + +class Accel : public KAccel +{ + Q_OBJECT + + public: + Accel( QWidget *parent=0, QObject *target=0 ); + ~Accel(); + void setTarget( QObject* ); + + signals: + void focus( void ); + void focus( const QChar& ); + + void board_up( void ); + void board_down( void ); + + void move_prev( void ); + void move_next( void ); + + void page_up( void ); + void page_down( void ); + + void history_prev( void ); + void history_next( void ); + + void reply_tell( void ); + void reply_channel( void ); + + void kibitz( void ); + void whisper( void ); +}; + +#endif diff --git a/knights/audio.cpp b/knights/audio.cpp new file mode 100644 index 0000000..f1b0d34 --- /dev/null +++ b/knights/audio.cpp @@ -0,0 +1,177 @@ +/*************************************************************************** + audio.cpp - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "audio.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class audioPrivate +{ + public: + bool enabled; + bool firstTime; + QString theme; + Arts::Dispatcher dispatcher; + Arts::SoundServerV2 server; + Arts::PlayObjectFactory playObjectFactory; + QMap audioMap; + QPtrList fileRef; +}; + +audio::audio() +{ + a = new audioPrivate; + a->server = Arts::Reference("global:Arts_SoundServerV2"); + a->fileRef.setAutoDelete( TRUE ); + if( a->server.isNull() ) + { + a->enabled = FALSE; + kdWarning() << "audio::audio: Can not create Arts::SoundServerV2" << endl; + } + else + { + a->enabled = TRUE; + a->playObjectFactory = Arts::Reference("global:Arts_PlayObjectFactory"); + } + a->firstTime = TRUE; +} +audio::~audio() +{ + a->audioMap.clear(); + a->fileRef.clear(); + delete a; +} +void audio::play( const int snd ) +{ + if( a->firstTime || !enabled || !a->enabled ) + return; + + QMap::Iterator IT = a->audioMap.find( snd ); + + if( IT == a->audioMap.end() ) + { + return; + } + + Arts::PlayObject* current = &IT.data(); + + if( volume ) + { + Arts::Synth_BUS_UPLINK uplink = Arts::DynamicCast( current->_getChild( "uplink" ) ); + uplink.stop(); + current->_node()->stop(); + Arts::disconnect( *current, "left", uplink, "left" ); + Arts::disconnect( *current, "right", uplink, "right" ); + Arts::StereoVolumeControl volumeControl = Arts::DynamicCast( a->server.createObject( "Arts::StereoVolumeControl" ) ); + current->_addChild( volumeControl, "volume" ); + uplink.start(); + volumeControl.start(); + current->_node()->start(); + Arts::connect( *current, "left", volumeControl, "inleft" ); + Arts::connect( *current, "right", volumeControl, "inright" ); + Arts::connect( volumeControl, "outleft", uplink, "left" ); + Arts::connect( volumeControl, "outright", uplink, "right" ); + volumeControl.scaleFactor( ( 100 - volume ) / 100.0 ); + } + + Arts::poTime time = current->currentTime(); + time.seconds = 0; + time.ms = 0; + current->seek( time ); + current->play(); +} + +void audio::setTheme( const QString &newTheme ) +{ + QString configFile; + KSimpleConfig *themeConfig; + + if( !enabled || !a->enabled ) + return; + + a->audioMap.clear(); + a->fileRef.clear(); + + if( !KIO::NetAccess::download( newTheme + "theme.conf" , configFile ) ) + { + kdWarning() << "audio::setTheme: Can not access theme.conf from " << newTheme << endl; + return; + } + themeConfig = new KSimpleConfig( configFile, TRUE ); + + /* Read the details about this theme */ + themeConfig->setGroup( "General" ); + themeHeader.name = themeConfig->readEntry( "Name", "Unknown" ); + themeHeader.version = themeConfig->readEntry( "Version", "Unknown" ); + themeHeader.author = themeConfig->readEntry( "Author", "Unknown" ); + themeHeader.authorEmail = themeConfig->readEntry( "AuthorEmail", "Unknown" ); + themeHeader.authorWWW = themeConfig->readEntry( "AuthorWWW", "Unknown" ); + themeHeader.notes = themeConfig->readEntry( "Notes", "Unknown" ); + + /* Read the sounds */ + themeConfig->setGroup( "Audio" ); + a->theme = newTheme; + prepFile( a->theme + themeConfig->readEntry("Select"), SND_SELECT ); + prepFile( a->theme + themeConfig->readEntry("Move"), SND_MOVE ); + prepFile( a->theme + themeConfig->readEntry("Check"), SND_CHECK ); + prepFile( a->theme + themeConfig->readEntry("MatchOver"), SND_MATCH_OVER ); + prepFile( a->theme + themeConfig->readEntry("Challenge"), SND_CHALLENGE ); + prepFile( a->theme + themeConfig->readEntry("Tell"), SND_TELL ); + prepFile( a->theme + themeConfig->readEntry("Notification"), SND_NOTIFICATION ); + prepFile( a->theme + themeConfig->readEntry("DrawOffer"), SND_DRAW_OFFER ); + prepFile( a->theme + themeConfig->readEntry("Say"), SND_SAY ); + prepFile( a->theme + themeConfig->readEntry("Promote"), SND_PROMOTE ); + a->firstTime = FALSE; + + delete themeConfig; + KIO::NetAccess::removeTempFile( configFile ); +} +void audio::prepFile( const QString &source, const int &ref ) +{ + Arts::PlayObject player; + KTempFile *dest; + QString filename; + if( source.isEmpty() ) + return; + + dest = new KTempFile( QString::null, source.right(4), 700 ); + dest->setAutoDelete( TRUE ); + filename = dest->name(); + + if( !KIO::NetAccess::download( source, filename ) ) + { + kdWarning() << "audio::prepFile: Can not download " << source << endl; + delete dest; + return; + } + player = a->playObjectFactory.createPlayObject( QFile::encodeName( dest->name() ).data() ); + if( player.isNull() ) + { + delete dest; + return; + } + a->fileRef.append( dest ); + a->audioMap[ ref ] = player; + return; +} diff --git a/knights/audio.h b/knights/audio.h new file mode 100644 index 0000000..1270b85 --- /dev/null +++ b/knights/audio.h @@ -0,0 +1,64 @@ +/*************************************************************************** + audio.h - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef AUDIO_H +#define AUDIO_H + +#include "definitions.h" +#include +#include + +/** + *@author Troy Corbin Jr. + */ + +/* + These represent the various sounds that can be played. +*/ + +const int SND_NONE = 0x00; +const int SND_SELECT = 0x01; +const int SND_MOVE = 0x02; +const int SND_MATCH_OVER = 0x03; // Deprecieated +const int SND_CHECK = 0x04; +const int SND_FLAG = 0x05; +const int SND_CHALLENGE = 0x50; +const int SND_TELL = 0x51; +const int SND_NOTIFICATION = 0x52; +const int SND_DRAW_OFFER = 0x53; +const int SND_SAY = 0x54; +const int SND_PROMOTE = 0x55; + +class audioPrivate; +class audio +{ + public: + audio(); + ~audio(); + void play( const int ); + void setTheme( const QString& ); + + bool enabled; + int volume; + ThemeHeader themeHeader; + protected: + void prepFile( const QString&, const int& ); + private: + audioPrivate *a; +}; + +#endif diff --git a/knights/board_2d.cpp b/knights/board_2d.cpp new file mode 100644 index 0000000..f3a9b49 --- /dev/null +++ b/knights/board_2d.cpp @@ -0,0 +1,807 @@ +/*************************************************************************** + board_2d.cpp - description + ------------------- + begin : Fri Feb 28 2003 + copyright : (C) 2003 by The Knights Project + email : knights-general@lists.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "board_2d.moc" +#include "resource.h" +#include "logic.h" +#include "knightspixcache.h" +#include +#include +#include + +static int MAX_STEPS = 18; + +board_2d::board_2d(QWidget *parent, const char *name, resource *Rsrc, logic *Lgc ) : board_base(parent,name,Rsrc,Lgc) +{ + updateX1 = updateY1 = 4000; + updateX2 = updateY2 = -4000; + init = TRUE; + premoveFrom = Null; + premoveTo = Null; + DragSprite = NULL; + lastMoveWasDrag = FALSE; + cache = myResource->pixCache; + int size = 8 + ( 1 * ( myResource->ThemeBorder == TRUE ) ); + sprites.setAutoDelete( TRUE ); + + /* Setup Pixmaps */ + myself.setOptimization( QPixmap::BestOptim ); + myself.resize( myResource->ThemeSize * size, myResource->ThemeSize * size); + myself.fill(); + + /* Setup self */ + setBackgroundMode( Qt::NoBackground ); + show(); +} +board_2d::~board_2d() +{ +} +/////////////////////////////////////// +// +// board_2d::coords +// +/////////////////////////////////////// +QPoint board_2d::coords( const int &rank, const int &file ) +{ + QPoint tmp; + if( orientation == 0 ) + { + tmp.setX( myResource->ThemeSize * file ); + tmp.setY( myResource->ThemeSize * ( 7 - rank ) ); + } + else + { + tmp.setX( myResource->ThemeSize * ( 7 - file ) ); + tmp.setY( myResource->ThemeSize * rank ); + } + if( myResource->ThemeBorder ) + { + tmp.setX( tmp.x() + ( myResource->ThemeSize >> 1 ) ); + tmp.setY( tmp.y() + ( myResource->ThemeSize >> 1 ) ); + } + return tmp; +} +/////////////////////////////////////// +// +// board_2d::position +// +/////////////////////////////////////// +int board_2d::position( const QPoint &_point ) +{ + int file, rank; + int themeSize = myResource->ThemeSize; + QPoint point( _point ); + + if( myResource->ThemeBorder ) + { + point.setX( point.x() - ( themeSize >> 1 ) ); + point.setY( point.y() - ( themeSize >> 1 ) ); + } + if( !orientation ) + { + file = point.x() / themeSize; + rank = 7 - ( point.y() / themeSize ); + } + else + { + file = 7 - ( point.x() / themeSize ); + rank = point.y() / themeSize; + } + return ( ( rank << 3 ) + file ); +} +/////////////////////////////////////// +// +// board_2d::drawMove +// +/////////////////////////////////////// +void board_2d::drawMove( const ChessMove &chessMove, const bool &reverse ) +{ + char fromPtr, toPtr, takenPtr(Null); + if( reverse ) + { + fromPtr = ( chessMove.toRank << 3 ) + chessMove.toFile; + toPtr = ( chessMove.fromRank << 3 ) + chessMove.fromFile; + } + else + { + fromPtr = ( chessMove.fromRank << 3 ) + chessMove.fromFile; + toPtr = ( chessMove.toRank << 3 ) + chessMove.toFile; + } + + /* Position where Man was taken != Target Position; ie. en passant */ + if( chessMove.ManTaken != Null ) + { + takenPtr = myLogic->Pointer( myLogic->chessman[ chessMove.ManTaken ].File, myLogic->chessman[ chessMove.ManTaken ].Rank ); + } + + /* Show Highlights */ + if( myResource->OPTION_Show_Last_Move ) + { + myLogic->current[ fromPtr ].Note = NOTE_MOVE; + if( chessMove.ManTaken != Null ) + { + myLogic->current[ toPtr ].Note = NOTE_ATTACK; + } + else + { + myLogic->current[ toPtr ].Note = NOTE_MOVE; + } + } + + /* Show Animation */ + if( myResource->OPTION_Animate_Moves && !lastMoveWasDrag && isVisible() ) + { + QTimer::singleShot( 0, this, SLOT( updateSprites() ) ); + sprite *spritePtr = new sprite; + spritePtr->Steps = 1; + spritePtr->Restore = FALSE; + spritePtr->POSITION_Origin = fromPtr; + spritePtr->POSITION_Destination = toPtr; + spritePtr->POSITION_TargetTaken = takenPtr; + if( !reverse ) + { + spritePtr->POINT_Origin = coords( chessMove.fromRank, chessMove.fromFile ); + spritePtr->POINT_Destination = coords( chessMove.toRank, chessMove.toFile ); + spritePtr->PIXMAP_Sprite = getChessman( spritePtr->POSITION_Destination ); + } + else + { + spritePtr->POINT_Origin = coords( chessMove.toRank, chessMove.toFile ); + spritePtr->POINT_Destination = coords( chessMove.fromRank, chessMove.fromFile ); + spritePtr->PIXMAP_Sprite = getChessman( spritePtr->POSITION_Origin ); + } + spritePtr->POINT_Current = spritePtr->POINT_Origin; + spritePtr->PIXMAP_FlipFrame.resize( spritePtr->PIXMAP_Sprite.size() ); + sprites.append( spritePtr ); + } + else + { + /* Draw this position only if we're not animating */ + drawPosition( toPtr ); + if( takenPtr != Null ) + { + drawPosition( takenPtr ); + } + } + /* Draw the originating position */ + drawPosition( fromPtr ); + + if( QString( chessMove.SAN ).contains( "o-o", FALSE ) ) + { + /* This is a castle */ + ChessMove newMove; + strcpy( newMove.SAN, QString( "no" ).latin1() ); + newMove.fromRank = chessMove.fromRank; + newMove.toRank = chessMove.toRank; + newMove.ManTaken = Null; + if( QString( chessMove.SAN ).contains( "o-o-o", FALSE ) ) + { + /* Queenside */ + newMove.fromFile = 0; + newMove.toFile = 3; + } + else + { + /* Kingside */ + newMove.fromFile = 7; + newMove.toFile = 5; + } + drawMove( newMove, reverse ); + } + lastMoveWasDrag = FALSE; +} +/////////////////////////////////////// +// +// board_2d::resizeBoard( SLOT ) +// +/////////////////////////////////////// +void board_2d::resizeBoard( void ) +{ + int size = 8 + ( 1 * ( myResource->ThemeBorder == TRUE ) ); + init = FALSE; + + /* Resize myself */ + myself.resize( myResource->ThemeSize * size, myResource->ThemeSize * size); + myself.fill(); + + /* Finish up */ + setFixedSize( myResource->ThemeSize * size, myResource->ThemeSize * size); + redrawAll(); + + int inverseSize = IMAGE_MAX - myResource->ThemeSize; + MAX_STEPS = ( ( inverseSize * inverseSize ) / IMAGE_MAX ) + 7; +} +/////////////////////////////////////// +// +// board_2d::redrawAll +// +/////////////////////////////////////// +void board_2d::redrawAll( void ) +{ + register char tmp(0); + + if( init ) + return; + + /* Set Orientation */ + orientation = myResource->OPTION_Board_Orientation; + if( localArmy != WHITE ) + orientation = !orientation; + if( flip ) + orientation = !orientation; + + /* Set Border */ + if( myResource->ThemeBorder ) + { + if( orientation ) + { + QWMatrix matrix; + matrix.rotate( 180.0 ); + myself = cache->Border.xForm( matrix ); + } + else + myself = cache->Border; + } + + /* Redraw All Positions */ + while( tmp < 64 ) + drawPosition( tmp++ ); + redrawLights(); + + /* Make sure everything is repainted */ + updateX1 = updateY1 = 0; + updateX2 = updateY2 = IMAGE_MAX * 9; + + commit(); +} +/////////////////////////////////////// +// +// board_2d::redrawLights +// +/////////////////////////////////////// +void board_2d::redrawLights( void ) +{ + int half, four; + QPoint black, white; + if( myResource->ThemeBorder ) + { + half = myResource->ThemeSize >> 1; + four = myResource->ThemeSize << 2; + if( !orientation ) + { + black.setX( 0 ); + black.setY( four ); + white.setX( 0 ); + white.setY( four + half ); + } + else + { + black.setX( myself.width() - half ); + black.setY( four + half ); + white.setX( myself.width() - half ); + white.setY( four ); + } + if( myLogic->OnMove != WHITE ) + { + myBlit( black, &cache->BorderLightOn, cache->BorderLightOn.rect() ); + myBlit( white, &cache->BorderLightOff, cache->BorderLightOff.rect() ); + } + else + { + myBlit( black, &cache->BorderLightOff, cache->BorderLightOff.rect() ); + myBlit( white, &cache->BorderLightOn, cache->BorderLightOn.rect() ); + } + } +} +/////////////////////////////////////// +// +// board_2d::drawPosition +// +/////////////////////////////////////// +void board_2d::drawPosition( const int &pos ) +{ + int rank = pos >> 3; + int file = pos % 8; + QPixmap buffer; + QString cacheName = QString::number( myResource->ThemeSize ); + QImage tempImage; + + if( ( pos < 0 ) || ( pos > 63 ) ) return; + /* + Build the cache ref name + */ + if( color( rank, file ) ) + cacheName += "L"; + else + cacheName += "D"; + if( !paused ) + { + switch( myLogic->current[pos].Note ) + { + case NOTE_SELECT: + case NOTE_HIGHLIGHT: + cacheName += "S"; + break; + case NOTE_MOVE: + case NOTE_CASTLE: + case NOTE_PAWN_DOUBLE: + cacheName += "M"; + break; + case NOTE_ATTACK: + case NOTE_ENPASSANT: + cacheName += "A"; + break; + default: + cacheName += " "; + } + if( ( myLogic->current[pos].ManPtr != Null ) && ( !isSprite( pos ) ) ) + { + if( myLogic->chessman[ myLogic->current[pos].ManPtr ].Army == WHITE ) + cacheName += "W"; + else + cacheName += "B"; + switch( myLogic->chessman[myLogic->current[pos].ManPtr].Type ) + { + case King: + cacheName += "K"; + break; + case Queen: + cacheName += "Q"; + break; + case Bishop: + cacheName += "B"; + break; + case Knight: + cacheName += "N"; + break; + case Rook: + cacheName += "R"; + break; + case Pawn: + cacheName += "P"; + break; + default: + break; + } + if( ( pos == premoveFrom ) || ( pos == premoveTo ) ) + cacheName += "t"; // The means it's transparent + } + } + else + cacheName += " "; + if( cache->find( cacheName, buffer ) ) + { + /* + Cache Hit... no need to redraw + */ + if( myResource->OPTION_Show_Coord ) + drawCoords( &buffer, pos ); + myBlit( coords( rank, file ), &buffer, buffer.rect() ); + return; + } + + /* + Cache miss + Draw the pixmap + */ + if( color( rank, file ) ) + buffer = cache->SquareLight; + else + buffer = cache->SquareDark; + + switch( myLogic->current[pos].Note ) + { + case NOTE_HIGHLIGHT: // Fall Through + case NOTE_SELECT: + bitBlt( &buffer, 0, 0, &cache->HighlightSelect, 0, 0, -1, -1, Qt::CopyROP, FALSE); + break; + case NOTE_MOVE: // Fall Through + case NOTE_CASTLE: // Fall Through + case NOTE_PAWN_DOUBLE: + bitBlt( &buffer, 0, 0, &cache->HighlightMove, 0, 0, -1, -1, Qt::CopyROP, FALSE); + break; + case NOTE_ATTACK: // Fall Through + case NOTE_ENPASSANT: + bitBlt( &buffer, 0, 0, &cache->HighlightAttack, 0, 0, -1, -1, Qt::CopyROP, FALSE); + break; + default: + break; + } + if( !isSprite(pos) ) + { + QPixmap chessman = getChessman( pos ); + bitBlt( &buffer, 0, 0, &chessman, 0, 0, -1, -1, Qt::CopyROP, FALSE); + } + /* Now add this pixmap to the cache */ + cache->add( cacheName, buffer ); + /* */ + if( myResource->OPTION_Show_Coord ) + drawCoords( &buffer, pos ); + myBlit( coords( rank, file ), &buffer, buffer.rect() ); +} +/////////////////////////////////////// +// +// board_2d::drawCoords +// +/////////////////////////////////////// +void board_2d::drawCoords( QPixmap *pic, const int &pos ) +{ + QPainter painter; + QString letter; + int themeSize = myResource->ThemeSize - 4; + int targetRank, targetFile; + + if( orientation == 0 ) + { + targetRank = 0; + targetFile = 0; + } + else + { + targetRank = 7; + targetFile = 7; + } + /* Draw Rank */ + if( ( pos >> 3 ) == targetRank ) + { + letter = QString( QString("abcdefgh").at( pos % 8 ) ); + painter.begin( pic ); + painter.setFont( myResource->FONT_Standard ); + painter.setPen( myResource->COLOR_Notation_Shadow ); + painter.drawText( 3, 3, themeSize, themeSize, + Qt::AlignRight | Qt::AlignBottom, letter ); + painter.setPen( myResource->COLOR_Notation ); + painter.drawText( 2, 2, themeSize, themeSize, + Qt::AlignRight | Qt::AlignBottom, letter ); + painter.end(); + } + /* Draw File */ + if( ( pos % 8 ) == targetFile ) + { + letter = QString( QString("12345678").at( pos >> 3 ) ); + painter.begin( pic ); + painter.setFont( myResource->FONT_Standard ); + painter.setPen( myResource->COLOR_Black ); + painter.drawText( 3, 3, themeSize, themeSize, + Qt::AlignLeft | Qt::AlignTop, letter ); + painter.setPen( myResource->COLOR_White ); + painter.drawText( 2, 2, themeSize, themeSize, + Qt::AlignLeft | Qt::AlignTop, letter ); + painter.end(); + } +} +/////////////////////////////////////// +// +// board_2d::mouseReleaseEvent +// +/////////////////////////////////////// +void board_2d::mouseReleaseEvent( QMouseEvent *event ) +{ + event->accept(); + + if( DragSprite != NULL ) + { + /* Destroy any sprites being dragged */ + int tmp = DragSprite->POSITION_Origin; + myBlit( DragSprite->POINT_LastUpdate, + &DragSprite->PIXMAP_FlipFrame, + DragSprite->PIXMAP_FlipFrame.rect() ); + sprites.removeRef( DragSprite ); + DragSprite = NULL; + drawPosition( tmp ); + commit(); + lastMoveWasDrag = TRUE; + } + + if(event->button() == Qt::LeftButton) + { + emit leftClick( position( event->pos() ) ); + } + if(event->button() == Qt::RightButton) + { + emit rightClick( position( event->pos() ) ); + } +} +/////////////////////////////////////// +// +// board_2d::mousePressEvent +// +/////////////////////////////////////// +void board_2d::mousePressEvent( QMouseEvent *event ) +{ + pressPoint = event->pos(); + event->accept(); +} +/////////////////////////////////////// +// +// board_2d::mouseMoveEvent +// +/////////////////////////////////////// +void board_2d::mouseMoveEvent( QMouseEvent *event ) +{ + event->accept(); + if( DragSprite == NULL ) + { + if( event->state() & Qt::LeftButton ) + { + if( abs( pressPoint.x() - event->pos().x() ) + abs( pressPoint.y() - event->pos().y() ) > 6 ) + { + /* Begin Dragging a piece */ + DragSprite = new sprite; + sprites.append( DragSprite ); + DragSprite->POINT_Origin = pressPoint; + DragSprite->POSITION_Origin = position( pressPoint ); + emit leftClick( DragSprite->POSITION_Origin ); // Tell match that we just clicked on this piece + + if( myLogic->current[ DragSprite->POSITION_Origin ].Note != NOTE_SELECT ) + { + /* The selection didn't take.. back out. */ + sprites.removeRef( DragSprite ); + DragSprite = NULL; + drawPosition( position( pressPoint ) ); + commit(); + return; + } + + /* Get the piece image and store it in dragPix */ + DragSprite->PIXMAP_Sprite = getChessman( DragSprite->POSITION_Origin ); + DragSprite->PIXMAP_FlipFrame.resize( DragSprite->PIXMAP_Sprite.size() ); + DragSprite->Restore = FALSE; + } + else + /* Not enough dragging */ + return; + } // End ( event->state() & Qt::LeftButton ) + else + return; /* No dragging. Most events should end up here */ + } + + int halfSize = myResource->ThemeSize >> 1; + DragSprite->POINT_Current.setX( event->x() - halfSize ); + DragSprite->POINT_Current.setY( event->y() - halfSize ); + commit(); +} +/////////////////////////////////////// +// +// board_2d::getChessman +// +/////////////////////////////////////// +QPixmap board_2d::getChessman( const int &pos ) +{ + QPixmap tmp; + register char type, army; + + if( pos == premoveTo ) + { + type = myLogic->chessman[myLogic->current[premoveFrom].ManPtr].Type; + army = myLogic->chessman[myLogic->current[premoveFrom].ManPtr].Army; + } + else + { + type = myLogic->chessman[myLogic->current[pos].ManPtr].Type; + army = myLogic->chessman[myLogic->current[pos].ManPtr].Army; + } + switch( type ) + { + case King: + if( army == WHITE ) + tmp = cache->WhiteKing; + else + tmp = cache->BlackKing; + break; + case Queen: + if( army == WHITE ) + tmp = cache->WhiteQueen; + else + tmp = cache->BlackQueen; + break; + case Bishop: + if( army == WHITE ) + tmp = cache->WhiteBishop; + else + tmp = cache->BlackBishop; + break; + case Knight: + if( army == WHITE ) + tmp = cache->WhiteKnight; + else + tmp = cache->BlackKnight; + break; + case Rook: + if( army == WHITE ) + tmp = cache->WhiteRook; + else + tmp = cache->BlackRook; + break; + case Pawn: + if( army == WHITE ) + tmp = cache->WhitePawn; + else + tmp = cache->BlackPawn; + break; + default: + break; + } + if( ( pos == premoveFrom ) || ( pos == premoveTo ) ) + { + KIconEffect::semiTransparent( tmp ); + } + return tmp; +} +/////////////////////////////////////// +// +// board_2d::setPremovePositions +// +/////////////////////////////////////// +void board_2d::setPremovePositions( const int &posF, const int &posT ) +{ + premoveFrom = posF; + premoveTo = posT; + if( ( posF != Null ) && ( posT != Null ) ) + { + myLogic->current[posF].Note = NOTE_NONE; + myLogic->current[posT].Note = NOTE_NONE; + drawPosition( posF ); + drawPosition( posT ); + commit(); + } +} +/////////////////////////////////////// +// +// board_2d::commit +// +/////////////////////////////////////// +void board_2d::commit( void ) +{ + drawSprites(); + bitBlt( this, updateX1, updateY1, &myself, updateX1, updateY1, updateX2, updateY2, Qt::CopyROP ); + updateX1 = updateY1 = 4000; + updateX2 = updateY2 = -4000; +} +/////////////////////////////////////// +// +// board_2d::paintEvent +// +/////////////////////////////////////// +void board_2d::paintEvent( QPaintEvent *event ) +{ + /* Paint the Widget */ + bitBlt( this, event->rect().topLeft(), &myself, event->rect(), Qt::CopyROP ); +} +/////////////////////////////////////// +// +// board_2d::drawSprites +// +/////////////////////////////////////// +void board_2d::drawSprites( void ) +{ + int index; + sprite *spritePtr; + + /* Remove all sprites from the pixmap */ + for( index = (signed int)sprites.count() - 1; index > -1; index-- ) + { + spritePtr = sprites.at(index); + if( spritePtr->Restore == FALSE ) + { + spritePtr->Restore = TRUE; + } + else + { + myBlit( spritePtr->POINT_LastUpdate, + &spritePtr->PIXMAP_FlipFrame, + spritePtr->PIXMAP_FlipFrame.rect() ); + } + } + /* Redraw all sprites */ + for( index = 0; index < (signed int)sprites.count(); index++ ) + { + spritePtr = sprites.at(index); + + if( ( spritePtr == DragSprite ) || ( spritePtr->Steps < MAX_STEPS ) ) + { + /* Redraw Sprite */ + bitBlt( &spritePtr->PIXMAP_FlipFrame, + 0, + 0, + &myself, + spritePtr->POINT_Current.x(), + spritePtr->POINT_Current.y(), + spritePtr->PIXMAP_FlipFrame.width(), + spritePtr->PIXMAP_FlipFrame.height(), + Qt::CopyROP ); + myBlit( spritePtr->POINT_Current, + &spritePtr->PIXMAP_Sprite, + spritePtr->PIXMAP_Sprite.rect() ); + spritePtr->POINT_LastUpdate = spritePtr->POINT_Current; + } + else + { + /* Animation finished */ + int origin = spritePtr->POSITION_Origin; + int destination = spritePtr->POSITION_Destination; + int target = spritePtr->POSITION_TargetTaken; + sprites.removeRef( spritePtr ); + drawPosition( origin ); + drawPosition( destination ); + drawPosition( target ); + index = -1; + } + } +} +/////////////////////////////////////// +// +// board_2d::updateSprites +// +/////////////////////////////////////// +void board_2d::updateSprites( void ) +{ + if( myResource->OPTION_Animate_Moves ) + { + for( int index = 0; index < (signed int)sprites.count(); index++ ) + { + sprite *spritePtr = sprites.at( index ); + if( spritePtr == DragSprite ) + continue; + + QTimer::singleShot( 0, this, SLOT( updateSprites() ) ); + if( spritePtr->Steps < MAX_STEPS ) + { + double factor = ( 1.0 / (double)MAX_STEPS ) * (double)spritePtr->Steps; + int newX = (int)( ( spritePtr->POINT_Destination.x() - spritePtr->POINT_Origin.x() ) * factor ); + int newY = (int)( ( spritePtr->POINT_Destination.y() - spritePtr->POINT_Origin.y() ) * factor ); + spritePtr->POINT_Current = spritePtr->POINT_Origin + QPoint( newX, newY ); + spritePtr->Steps += sprites.count(); + } + } + commit(); + } +} +/////////////////////////////////////// +// +// board_2d::isSprite +// +/////////////////////////////////////// +bool board_2d::isSprite( const int &pos ) +{ + for( unsigned int index = 0; index < sprites.count(); index++ ) + { + sprite *tmpSprite = sprites.at( index ); + if( tmpSprite->POSITION_Origin == pos ) + { + return TRUE; + } + } + return FALSE; +} +/////////////////////////////////////// +// +// board_2d::myBlit +// +/////////////////////////////////////// +void board_2d::myBlit( const QPoint &dp, const QPaintDevice *src, const QRect &sr ) +{ + bitBlt( &myself, dp.x(), dp.y(), src, sr.x(), sr.y(), sr.width(), sr.height(), Qt::CopyROP ); + if( dp.x() < updateX1 ) + updateX1 = dp.x(); + if( dp.y() < updateY1 ) + updateY1 = dp.y(); + if( dp.x() + sr.width() > updateX2 ) + updateX2 = dp.x() + sr.width(); + if( dp.y() + sr.height() > updateX2 ) + updateX2 = dp.y() + sr.height(); +} diff --git a/knights/board_2d.h b/knights/board_2d.h new file mode 100644 index 0000000..f2291e2 --- /dev/null +++ b/knights/board_2d.h @@ -0,0 +1,99 @@ +/*************************************************************************** + board_2d.h - description + ------------------- + begin : Fri Feb 28 2003 + copyright : (C) 2003 by The Knights Project + email : knights-general@lists.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef BOARD_2D_H +#define BOARD_2D_H + +#include +#include +#include + +/** + *@author The Knights Team + */ + +typedef struct sprite +{ + bool Restore; + int Steps; + int POSITION_Origin; + int POSITION_Destination; + int POSITION_TargetTaken; + QPoint POINT_Origin; + QPoint POINT_Current; + QPoint POINT_LastUpdate; + QPoint POINT_Destination; + QPixmap PIXMAP_Sprite; + QPixmap PIXMAP_FlipFrame; +}; + +typedef QPtrList SpriteList; +class KnightsPixCache; + +class board_2d : public board_base +{ + Q_OBJECT + public: + board_2d(QWidget *parent=0, const char *name=0, resource *Rsrc=0, logic *Lgc=0); + ~board_2d(); + virtual void drawMove( const ChessMove &chessMove, const bool &reverse=FALSE ); + virtual void setPremovePositions( const int&, const int& ); + virtual void redrawLights( void ); + void paintEvent( QPaintEvent *event ); + void mouseReleaseEvent( QMouseEvent *event ); + void mousePressEvent( QMouseEvent *event ); + void mouseMoveEvent( QMouseEvent *event ); + + public slots: + virtual void resizeBoard( void ); + virtual void redrawAll( void ); + virtual void drawPosition( const int& ); + virtual void commit( void ); + + protected: + void drawCoords( QPixmap *pic, const int &pos ); + QPoint coords( const int&, const int&); + int position( const QPoint& ); + void drawSprites( void ); + QPixmap getChessman( const int &pos ); + bool isSprite( const int &pos ); + void myBlit( const QPoint &dp, const QPaintDevice *src, const QRect &sr ); + + protected slots: + void updateSprites( void ); + + private: + SpriteList sprites; + sprite *DragSprite; + KnightsPixCache *cache; + QPixmap myself; + QPoint pressPoint; + bool orientation; + bool lastMoveWasDrag; + bool init; + + int updateX1; + int updateY1; + int updateX2; + int updateY2; + + /* Premove Positions */ + int premoveFrom; + int premoveTo; +}; + +#endif diff --git a/knights/board_base.cpp b/knights/board_base.cpp new file mode 100644 index 0000000..6370644 --- /dev/null +++ b/knights/board_base.cpp @@ -0,0 +1,125 @@ +/*************************************************************************** + board_base.cpp - description + ------------------- + begin : Fri Feb 28 2003 + copyright : (C) 2003 by The Knights Team + email : knights-general@lists.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "board_base.moc" +#include "resource.h" +#include "logic.h" + +board_base::board_base(QWidget *parent, const char *name, resource *Rsrc, logic *Lgc ) : QWidget(parent,name) +{ + /* Setup Variables */ + myResource = Rsrc; + myLogic = Lgc; + + paused = false; + flip = false; + localArmy = WHITE; +} +board_base::~board_base() +{ +} +/////////////////////////////////////// +// +// board_base::setPaused +// +/////////////////////////////////////// +void board_base::setPaused( const bool &state ) +{ + paused = state; + redrawAll(); +} +/////////////////////////////////////// +// +// board_base::setLocalArmy +// +/////////////////////////////////////// +void board_base::setLocalArmy( const bool &state ) +{ + if( state == localArmy ) + return; + localArmy = state; + redrawAll(); +} +/////////////////////////////////////// +// +// board_base::flipBoard +// +/////////////////////////////////////// +void board_base::flipBoard( void ) +{ + flip = !flip; + redrawAll(); +} +/////////////////////////////////////// +// +// board_base::drawMove +// +/////////////////////////////////////// +void board_base::drawMove( const ChessMove&, const bool& ) +{ + /* Subclasses MUST reimplement this */ +} +/////////////////////////////////////// +// +// board_base::resizeBoard +// +/////////////////////////////////////// +void board_base::resizeBoard( void ) +{ + /* Subclasses MUST reimplement this */ +} +/////////////////////////////////////// +// +// board_base::redrawAll +// +/////////////////////////////////////// +void board_base::redrawAll( void ) +{ + /* Subclasses MUST reimplement this */ +} +/////////////////////////////////////// +// +// board_base::drawPosition +// +/////////////////////////////////////// +void board_base::drawPosition( const int& ) +{ +} +/////////////////////////////////////// +// +// board_base::setPremovePositions +// +/////////////////////////////////////// +void board_base::setPremovePositions( const int&, const int& ) +{ +} +/////////////////////////////////////// +// +// board_base::commit +// +/////////////////////////////////////// +void board_base::commit( void ) +{ +} +/////////////////////////////////////// +// +// board_base::redrawLights +// +/////////////////////////////////////// +void board_base::redrawLights( void ) +{ +} diff --git a/knights/board_base.h b/knights/board_base.h new file mode 100644 index 0000000..305e686 --- /dev/null +++ b/knights/board_base.h @@ -0,0 +1,68 @@ +/*************************************************************************** + board_base.h - description + ------------------- + begin : Fri Feb 28 2003 + copyright : (C) 2003 by The Knights Project + email : knights-general@lists.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef BOARD_BASE_H +#define BOARD_BASE_H + +#include +#include +#include "definitions.h" + +/** + *@author The Knights Project + */ + +class resource; +class logic; + +class board_base : public QWidget +{ + Q_OBJECT + + public: + board_base(QWidget *parent=0, const char *name=0, resource *Rsrc=0, logic *Lgc=0); + virtual ~board_base(); + virtual void drawMove( const ChessMove &chessMove, const bool &reverse=FALSE ); + virtual void setPremovePositions( const int&, const int& ); + virtual void redrawLights( void ); + + public slots: + virtual void resizeBoard( void ); + virtual void redrawAll( void ); + virtual void setPaused( const bool& ); + virtual void setLocalArmy( const bool& ); + virtual void drawPosition( const int& ); + virtual void commit( void ); + void flipBoard( void ); + + signals: + void leftClick( int ); + void rightClick( int ); + + protected: + resource *myResource; + logic *myLogic; + bool paused; + bool localArmy; + bool flip; + + protected: + inline bool color( const int &rank, const int &file ) + { return abs( ( rank % 2 ) - ( file % 2 ) ); } +}; + +#endif diff --git a/knights/challenge_game.cpp b/knights/challenge_game.cpp new file mode 100644 index 0000000..b7d37cc --- /dev/null +++ b/knights/challenge_game.cpp @@ -0,0 +1,37 @@ +/*************************************************************************** + game.cpp - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Eric Faccer + email : e.faccer@qut.edu.au + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include "challenge_game.h" + + +Challenge_Game::Challenge_Game(QString seeker, QString seeker_rating, QString match_kind, QString rated, QString time, QString incr, QString uid) +: _player(seeker), _match_type(match_kind), _is_rated(rated) +{ + _id = uid.toInt(); + if( seeker_rating == "++++" ) + _player_rating = 0; + else + _player_rating = seeker_rating.toInt(); + _clock = time.toInt(); + _increment = incr.toInt(); + if( _is_rated == "unrated" ) + _rated = false; + else + _rated = true; +} + diff --git a/knights/challenge_game.h b/knights/challenge_game.h new file mode 100644 index 0000000..6857492 --- /dev/null +++ b/knights/challenge_game.h @@ -0,0 +1,47 @@ +/*************************************************************************** + game.h - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Eric Faccer + email : e.faccer@qut.edu.au + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef GAME_H +#define GAME_H +#include + +class Challenge_Game { + + public: + Challenge_Game(QString seeker, QString seeker_rating, QString match_kind, QString rated, QString time, QString incr, QString uid); + + public: + + int id() { return _id; }; + int clock() { return _clock; }; + int increment() { return _increment; }; + bool rated() { return _rated; }; + int rating() { return _player_rating; }; + QString _player; + QString _match_type; + QString _is_rated; + + private: + int _id; + bool _rated; + int _player_rating; + int _clock; + int _increment; +}; + +#endif + diff --git a/knights/challenge_graph.cpp b/knights/challenge_graph.cpp new file mode 100644 index 0000000..5d36ff1 --- /dev/null +++ b/knights/challenge_graph.cpp @@ -0,0 +1,460 @@ +/*************************************************************************** + challenge_graph.cpp - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Eric Faccer + email : e.faccer@qut.edu.au + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "challenge_graph.moc" +#include "challenge_graph_view.h" +#include "challenge_rectangle.h" +#include "command.h" +#include "definitions.h" + +/* SIZE is for the size of the challenge square. It could become a class variable */ +#define SIZE 8 +#define OFFSET 2 +#define SPACER SIZE+OFFSET + +/////////////////////////////////////// +// +// Challenge_Graph::Constructor +// +/////////////////////////////////////// +Challenge_Graph::Challenge_Graph( QWidget* parent, const char* name, resource *Rsrc ) + : QVBox(parent, name), myResource(Rsrc) +{ + max_rating = 2600; + max_time = 60; + seek = FALSE; + + graph = new QCanvas( 0, "Challenge_Graph" ); + myStatusBar = new QLabel( this, "Challenge_Graph_Status_Bar" ); + myView = new Challenge_Graph_View( *graph, this, "Challenge_Graph_View", 0, myStatusBar ); + + QObject::connect(myView, SIGNAL(leftClick(int)), SLOT(selectMatch(int))); + QObject::connect(myView, SIGNAL(rightClick(Challenge_Game*, const QPoint&)), SLOT(display_menuSeek(Challenge_Game*, const QPoint&))); + + + /* Setup Style for myStatusBar */ + myStatusBar->setAlignment( Qt::AlignAuto | Qt::AlignVCenter | Qt::SingleLine ); + myStatusBar->setFrameStyle( QFrame::Panel | QFrame::Sunken ); + clear(); + + menuSeek = new KPopupMenu( this ); + menuSeek->setCheckable( TRUE ); + menuSeek->insertItem( i18n("Seek Matches"), this, SLOT( menuFunct(int) ), 0, MENU_SEEK ); + menuSeek->insertSeparator(); + menuSeek->insertItem( i18n("Accept This Match"), this, SLOT( menuFunct(int) ), 0, MENU_ACCEPT_MATCH ); + menuSeek->insertItem( i18n("Tell..."), this, SLOT( menuFunct(int) ), 0, MENU_TELL ); + menuSeek->insertItem( i18n("Assess..."), this, SLOT( menuFunct(int) ), 0, MENU_ASSESS ); + menuSeek->insertItem( i18n("Player Info"), this, SLOT( menuFunct(int) ), 0, MENU_FINGER ); + menuSeek->insertItem( QIconSet( myResource->LoadIcon( QString("history"), KIcon::Small ) ), + i18n("Player History"), this, SLOT( menuFunct(int) ), 0, MENU_HISTORY ); + menuSeek->insertSeparator(); + menuSeek->insertItem( i18n("Add to Friends"), this, SLOT( menuFunct(int) ), 0, MENU_NOTIFY ); + menuSeek->insertItem( i18n("Ignore This Player"), this, SLOT( menuFunct(int) ), 0, MENU_CENSOR ); + menuSeek->setItemChecked( MENU_SEEK, FALSE ); +} +/////////////////////////////////////// +// +// Challenge_Graph::Destructor +// +/////////////////////////////////////// +Challenge_Graph::~Challenge_Graph() +{ +} +/////////////////////////////////////// +// +// Challenge_Graph::resizeEvent +// +/////////////////////////////////////// +void Challenge_Graph::resizeEvent( QResizeEvent *e ) +{ + if( e->size() != e->oldSize() ) + { + QSize newsize = e->size(); + x_size = newsize.width() - 8; + y_size = newsize.height() - myStatusBar->height(); + graph->resize( x_size, y_size ); + createBackground(); + } +} +/////////////////////////////////////// +// +// Challenge_Graph::add +// +/////////////////////////////////////// +void Challenge_Graph::add(Challenge_Game *seek) +{ + double AdjustedClock = (float)seek->clock() + ( ( (float)seek->increment() / 60.0 ) * 20.0 ); + double my_x = (float)x_size / (float)max_time * AdjustedClock; + double mag = (float)max_rating / (float)y_size; + double my_y = ( max_rating - seek->rating() ) / mag; + + //bleah + //a bit of a hack for the status bar real estate & values larger then MAX + if ( seek->rating() < 250) + my_y = (max_rating - 250) / mag; + else if ( seek->rating() >= max_rating ) + my_y = 10; + + if ( seek->clock() > (max_time-3) ) + my_x = x_size/max_time * (max_time-3); + + int time_control_x = (int)(my_x); + int rating_y = (int)(my_y); + + if ( isEmpty(time_control_x, rating_y) ) + drawChallenge(time_control_x, rating_y, seek->rated(), seek); + else + addTo_Nearest_Neighbour(time_control_x, rating_y, seek->rated(), seek); +} +/////////////////////////////////////// +// +// Challenge_Graph::clear +// +/////////////////////////////////////// +void Challenge_Graph::clear() +{ + myView->reset(); + graph->update(); +} +/////////////////////////////////////// +// +// Challenge_Graph::drawChallenge +// +/////////////////////////////////////// +void Challenge_Graph::drawChallenge(int time_control_x, int rating_y, bool rated, Challenge_Game *challenge) +{ + /* This next peice of unelegant code is fairly unnecessary. It is to keep everything on the screen */ + /* It's based on the theory of prophylaxis */ + int my_x = time_control_x; + int my_y = rating_y; + + if( my_y >= y_size - SPACER) + my_y = y_size - SPACER; + if( my_y < SPACER ) + my_y = SPACER; + if( my_x >= x_size - ( SPACER ) ) + my_x = x_size - ( SPACER ); /*Since squares draw from the top left */ + if( my_x < SPACER ) + my_x = SIZE; + + QCanvasPolygonalItem *item = new Challenge_Rectangle(my_x, my_y, SIZE, SIZE, graph, challenge); + + item->setPen( myResource->COLOR_GraphForeground ); + item->move( time_control_x, rating_y ); + item->show(); + + if( rated ) + item->setBrush( QBrush(myResource->COLOR_GraphForeground) ); + else + item->setBrush( QBrush(myResource->COLOR_GraphBackground, Qt::SolidPattern) ); + + item->show(); + graph->update(); +} +/////////////////////////////////////// +// +// Challenge_Graph::isEmpty +// +/////////////////////////////////////// +bool Challenge_Graph::isEmpty(int x, int y) +{ + QCanvasItemList l = graph->collisions( QRect(x, y, SIZE, SIZE) ); + + if( l.count() ) + return false; + return true; +} + +/* This function does a spiral search for the nearest neighbour */ +/* Pre: TRUE + Post: Finds the nearest non-overlapping position to the original coordinates */ +/////////////////////////////////////// +// +// Challenge_Graph::addTo_Nearest_Neighbour +// +/////////////////////////////////////// +bool Challenge_Graph::addTo_Nearest_Neighbour(int orig_x, int orig_y, bool rated, Challenge_Game * challenge, int searchdepth) +{ + int right = 1; + int down = 2; + int left = 2; + int up = 3; + + int x = orig_x; + int y = orig_y - ( SIZE + OFFSET ); + + /* Check the location on top*/ + if ( isEmpty( x, y ) ) + { + drawChallenge( x, y, rated, challenge ); + return true; + } + + /* Now search in a spiral */ + while( right < searchdepth ) + { + for( int i = 0; i < right; i++ ) + { + x += SPACER; + if( isEmpty( x, y ) ) + { + drawChallenge( x, y, rated, challenge ); + return true; + } + } + for( int i = 0; i < down; i++ ) + { + y += SPACER; + if( isEmpty( x, y ) ) + { + drawChallenge( x, y, rated, challenge ); + return true; + } + } + for( int i = 0; i < left; i++ ) + { + x -= SPACER; + if( isEmpty( x, y) ) + { + drawChallenge( x, y, rated, challenge ); + return true; + } + } + for( int i = 0; i < up; i++ ) + { + y -= SPACER; + if( isEmpty( x, y ) ) + { + drawChallenge( x, y, rated, challenge ); + return true; + } + } + + /* Grow the spiral bounds */ + right += 2; + down += 2; + left += 2; + up += 2; + } + return false; +} +/////////////////////////////////////// +// +// Challenge_Graph::createBackground +// +/////////////////////////////////////// +void Challenge_Graph::createBackground( void ) +{ + QPainter painter; + QColor ink; + QWMatrix matrix; + int colorTotal; + + background.resize( y_size, x_size ); + background.fill( myResource->COLOR_GraphBackground ); + + /* Find out if we have a dark bgcolor or a light one. */ + colorTotal = ( myResource->COLOR_GraphBackground.red() + + myResource->COLOR_GraphBackground.blue() + + myResource->COLOR_GraphBackground.green() ); + + /* Set our ink to something that will contrast well */ + if( colorTotal < 384 ) // 384 = 50% gray + ink = myResource->COLOR_GraphBackground.light(); + else + ink = myResource->COLOR_GraphBackground.dark(); + + /* Paint the text on */ + painter.begin( &background ); + painter.setFont( myResource->FONT_Standard ); + painter.setPen( ink ); + painter.drawText( 64, 12, i18n( "Rating" ) ); + painter.end(); + matrix.rotate( -90.0 ); + background = background.xForm( matrix ); + painter.begin( &background ); + painter.setFont( myResource->FONT_Standard ); + painter.setPen( ink ); + painter.drawText( 64, y_size - 8, i18n( "Time" ) ); + painter.end(); + + graph->setBackgroundPixmap( background ); +} +/////////////////////////////////////// +// +// Challenge_Graph::selectMatch +// +/////////////////////////////////////// +void Challenge_Graph::selectMatch( int matchID ) +{ + if( matchID ) + emit sendCMD( Command( 0, CMD_Start_Match, QString::number( matchID ) ) ); +} +/////////////////////////////////////// +// +// Challenge_Graph::menuFunct +// +/////////////////////////////////////// +void Challenge_Graph::menuFunct( int funct ) +{ + switch( funct ) + { + case MENU_SEEK: + emit sendCMD( Command( 0, CMD_Toggle_Seek ) ); + break; + case MENU_FINGER: + emit sendCMD( Command( 0, CMD_Player_Finger, selectedPlayerName ) ); + break; + case MENU_TELL: + emit sendCMD( Command( 0, CMD_Set_Input, QString( "tell %1 " ).arg( selectedPlayerName ) ) ); + break; + case MENU_NOTIFY: + emit sendCMD( Command( 0, CMD_Add_Friend, selectedPlayerName ) ); + break; + case MENU_CENSOR: + emit sendCMD( Command( 0, CMD_Ignore_Player, selectedPlayerName ) ); + break; + case MENU_HISTORY: + emit sendCMD( Command( 0, CMD_Player_History, selectedPlayerName ) ); + break; + case MENU_ACCEPT_MATCH: + emit sendCMD( Command( 0, CMD_Start_Match, QString::number( selectedMatchID ) ) ); + break; + case MENU_ASSESS: + emit sendCMD( Command( 0, CMD_Assess, selectedPlayerName ) ); + break; + default: + break; + } +} +/////////////////////////////////////// +// +// Challenge_Graph::updateSoughtList +// +/////////////////////////////////////// +void Challenge_Graph::updateSoughtList( void ) +{ + unsigned int loop; + Challenge_Game *cg; + + clear(); + for( loop = 0; loop < SF_01.count(); loop++ ) + { + cg = new Challenge_Game( SF_01[loop], + SF_02[loop], + SF_03[loop], + SF_04[loop], + SF_05[loop], + SF_06[loop], + SF_07[loop] ); + add( cg ); + } + SF_01.clear(); + SF_02.clear(); + SF_03.clear(); + SF_04.clear(); + SF_05.clear(); + SF_06.clear(); + SF_07.clear(); + seek = TRUE; +} +/////////////////////////////////////// +// +// Challenge_Graph::addSoughtItem +// +/////////////////////////////////////// +void Challenge_Graph::addSoughtItem( const QString &src ) +{ + QStringList fields = QStringList::split( QChar(' '), src, FALSE ); + SF_01 << fields[2]; // Name + SF_02 << fields[1]; // Rating + SF_03 << fields[6]; // Match Type + SF_04 << fields[5]; // Is Rated? + SF_05 << fields[3]; // Base Time + SF_06 << fields[4]; // Increment + SF_07 << fields[0]; // ID# +} +/////////////////////////////////////// +// +// Challenge_Graph::display_menuSeek +// +/////////////////////////////////////// +void Challenge_Graph::display_menuSeek( Challenge_Game *Item, const QPoint &Pos ) +{ + bool enable; + if( Item != NULL ) + { + selectedPlayerName = Item->_player.replace( QRegExp("\\(.+\\)"), QString("") ); + selectedMatchID = Item->id(); + enable = TRUE; + } + else + { + enable = FALSE; + } + menuSeek->setItemChecked( MENU_SEEK, seek ); + menuSeek->setItemEnabled( MENU_FINGER, enable ); + menuSeek->setItemEnabled( MENU_TELL, enable ); + menuSeek->setItemEnabled( MENU_NOTIFY, enable ); + menuSeek->setItemEnabled( MENU_CENSOR, enable ); + menuSeek->setItemEnabled( MENU_HISTORY, enable ); + menuSeek->setItemEnabled( MENU_ACCEPT_MATCH, enable ); + menuSeek->setItemEnabled( MENU_ASSESS, enable ); + menuSeek->popup( Pos ); +} +/////////////////////////////////////// +// +// Challenge_Graph::recvCMD +// +/////////////////////////////////////// +void Challenge_Graph::recvCMD( const Command& command ) +{ + switch(((Command)command).getCommand()) + { + case CMD_Add_Sought_Match: + addSoughtItem( ((Command)command).getData() ); + break; + case CMD_Show_Sought_List: + updateSoughtList(); + break; + case CMD_Hide_Sought_List: + clear(); + seek = FALSE; + break; + default: + break; + } +} diff --git a/knights/challenge_graph.h b/knights/challenge_graph.h new file mode 100644 index 0000000..e7963a3 --- /dev/null +++ b/knights/challenge_graph.h @@ -0,0 +1,93 @@ +/*************************************************************************** + challenge_graph.h - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Eric Faccer + email : e.faccer@qut.edu.au + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef CHALLENGE_GRAPH_H +#define CHALLENGE_GRAPH_H + +#include +#include +#include +#include + +#include "resource.h" +#include "challenge_game.h" + +class KPopupMenu; +class QCanvas; +class QLabel; +class Challenge_Graph_View; +class Command; + +class Challenge_Graph : public QVBox +{ + Q_OBJECT + + public: + Challenge_Graph(QWidget *parent=0, const char *name=0, resource *Rsrc=0); + virtual ~Challenge_Graph(); + void resizeEvent( QResizeEvent* ); + void add( Challenge_Game *seek ); + void clear(); + + signals: + void sendCMD( const Command& ); + + public slots: + void recvCMD( const Command& ); + void display_menuSeek( Challenge_Game*, const QPoint& ); + void selectMatch( int ); + void menuFunct( int ); + + protected: + virtual bool isEmpty( int x, int y ); + void drawChallenge( int time_control_x, int rating_y, bool rated, Challenge_Game *challenge ); + bool addTo_Nearest_Neighbour( int orig_x, int orig_y, bool rated, Challenge_Game *challenge, int searchdepth=10 ); + void createBackground( void ); + void addSoughtItem( const QString& ); + void updateSoughtList( void ); + + private: + int x_size; + int y_size; + int max_rating; + int max_time; + bool seek; + + resource *myResource; + QCanvas *graph; + Challenge_Graph_View *myView; + QLabel *myStatusBar; + QPixmap background; + + KPopupMenu *menuSeek; + int selectedMatchID; + QString selectedPlayerName; + /* + These StringLists temporarily store Sought Game data + until all ads have been displayed. + */ + QStringList SF_01; + QStringList SF_02; + QStringList SF_03; + QStringList SF_04; + QStringList SF_05; + QStringList SF_06; + QStringList SF_07; +}; + +#endif + diff --git a/knights/challenge_graph_view.cpp b/knights/challenge_graph_view.cpp new file mode 100644 index 0000000..734ed99 --- /dev/null +++ b/knights/challenge_graph_view.cpp @@ -0,0 +1,112 @@ +/*************************************************************************** + challenge_graph_view.cpp - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Eric Faccer + email : e.faccer@qut.edu.au + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include + +#include "challenge_graph_view.moc" + +#include "challenge_graph.h" +#include "challenge_rectangle.h" + +/////////////////////////////////////// +// +// Challenge_Graph_View::Constructor +// +/////////////////////////////////////// +Challenge_Graph_View::Challenge_Graph_View(QCanvas& c, QWidget * parent,const char* name, WFlags f, QLabel *qsb) + : QCanvasView(&c,parent,name,f), canvas(c), statusbar(qsb) +{ + setHScrollBarMode( QScrollView::AlwaysOff ); + setVScrollBarMode( QScrollView::AlwaysOff ); + + if ( parent ) + parent->installEventFilter( this ); + QScrollView::viewport()->setMouseTracking(true); +} +/////////////////////////////////////// +// +// Challenge_Graph_View::Destructor +// +/////////////////////////////////////// +Challenge_Graph_View::~Challenge_Graph_View() +{ +} +/////////////////////////////////////// +// +// Challenge_Graph_View::contentsMousePressEvent +// +/////////////////////////////////////// +void Challenge_Graph_View::contentsMousePressEvent(QMouseEvent* e) +{ + QCanvasItemList l = canvas.collisions(e->pos()); + QCanvasItemList::Iterator it = l.begin(); + for(; it != l.end(); ++it ) + { + Challenge_Rectangle *cr = dynamic_cast(*it); + Challenge_Game *g = cr->getGame(); + if( e->button() == Qt::LeftButton ) + emit leftClick( g->id() ); + if( e->button() == Qt::RightButton ) + emit rightClick( g, e->globalPos() ); + return; + } + if( e->button() == Qt::RightButton ) + emit rightClick( NULL, e->globalPos() ); // We need to catch all right clicks +} +/////////////////////////////////////// +// +// Challenge_Graph_View::reset +// +/////////////////////////////////////// +void Challenge_Graph_View::reset() +{ + QCanvasItemList list = canvas.allItems(); + QCanvasItemList::Iterator it = list.begin(); + for(; it != list.end(); ++it ) + { + Challenge_Rectangle *cr = dynamic_cast(*it); + Challenge_Game *g = cr->getGame(); + delete g; + if ( *it ) + delete *it; + } +} +/////////////////////////////////////// +// +// Challenge_Graph_View::contentsMouseMoveEvent +// +/////////////////////////////////////// +void Challenge_Graph_View::contentsMouseMoveEvent(QMouseEvent* e) +{ + QString match; + QCanvasItemList l = canvas.collisions(e->pos()); + QCanvasItemList::Iterator it = l.begin(); + for(; it!=l.end(); ++it) + { + Challenge_Rectangle *cr = dynamic_cast(*it); + Challenge_Game *g = cr->getGame(); + + match = i18n( " Name: %1 Rating: %2 Match Type: %3 %4 Base Time: %5 Increment: %6" ) + .arg( g->_player ).arg( g->rating() ).arg( g->_match_type ).arg( g->_is_rated ) + .arg( g->clock() ).arg( g->increment() ); + break; + } + statusbar->setText( match ); +} + diff --git a/knights/challenge_graph_view.h b/knights/challenge_graph_view.h new file mode 100644 index 0000000..f1e89ba --- /dev/null +++ b/knights/challenge_graph_view.h @@ -0,0 +1,50 @@ +/*************************************************************************** + challenge_graph_view.h - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Eric Faccer + email : e.faccer@qut.edu.au + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef CHALLENGE_GRAPH_VIEW_H +#define CHALLENGE_GRAPH_VIEW_H + +#include +#include +#include +#include "challenge_game.h" + + +class Challenge_Graph_View : public QCanvasView +{ + Q_OBJECT + + public: + Challenge_Graph_View(QCanvas&, QWidget* parent=0, const char* name=0, WFlags f=0, QLabel *qsb=0); + ~Challenge_Graph_View(); + void reset(); + + signals: + void leftClick(int); + void rightClick(Challenge_Game*, const QPoint&); + + protected: + void contentsMousePressEvent(QMouseEvent*); + void contentsMouseMoveEvent(QMouseEvent*); + void updateStatusBar(QString msg); + + private: + QCanvas &canvas; + QLabel *statusbar; +}; + +#endif diff --git a/knights/challenge_rectangle.cpp b/knights/challenge_rectangle.cpp new file mode 100644 index 0000000..2587623 --- /dev/null +++ b/knights/challenge_rectangle.cpp @@ -0,0 +1,34 @@ +/*************************************************************************** + challenge_rectangle.cpp - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Eric Faccer + email : e.faccer@qut.edu.au + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "challenge_rectangle.h" + +Challenge_Rectangle::Challenge_Rectangle + (int x, int y, int width, int height, QCanvas * canvas, Challenge_Game * ptr) + : QCanvasRectangle(x,y,width,height,canvas), challenge(ptr) +{ +} + +Challenge_Game* Challenge_Rectangle::getGame() +{ + return challenge; +} + +Challenge_Rectangle::~Challenge_Rectangle() +{ + this->hide(); +} diff --git a/knights/challenge_rectangle.h b/knights/challenge_rectangle.h new file mode 100644 index 0000000..02488ff --- /dev/null +++ b/knights/challenge_rectangle.h @@ -0,0 +1,36 @@ +/*************************************************************************** + challenge_rectangle.h - description + ------------------- + begin : Mon Jan 7 2002 + copyright : (C) 2003 by Eric Faccer + email : e.faccer@qut.edu.au + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef CHALLENGE_RECTANGLE_H +#define CHALLENGE_RECTANGLE_H + +#include +#include "challenge_game.h" + +class Challenge_Rectangle : public QCanvasRectangle +{ + public: + Challenge_Rectangle(int x=0, int y=0, int width=0, int height=0, QCanvas * canvas=0, Challenge_Game * ptr=0); + ~Challenge_Rectangle(); + Challenge_Game* getGame(); + + private: + Challenge_Game * challenge; + +}; +#endif + diff --git a/knights/chessclock.cpp b/knights/chessclock.cpp new file mode 100644 index 0000000..bde4745 --- /dev/null +++ b/knights/chessclock.cpp @@ -0,0 +1,195 @@ +/*************************************************************************** + chessclock.cpp - description + ------------------- + begin : Mon Jul 2 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "chessclock.moc" +#include "audio.h" + +chessclock::chessclock(QWidget *parent, const char *name, resource *Rsrc ) : QWidget(parent,name) +{ + Resource = Rsrc; + Silent = TRUE; + WhiteIndex = 0; + BlackIndex = 0; + Flag[WHITE] = FALSE; + Flag[BLACK] = FALSE; + whiteClock = " 0:00:00 "; + blackClock = " 0:00:00 "; +} +chessclock::~chessclock() +{ +} +/////////////////////////////////////// +// +// chessclock::Set +// +/////////////////////////////////////// +void chessclock::Set( const int WhiteSec, const int BlackSec, const bool onMove ) +{ + /* these times are in centi seconds */ + White.Seconds = WhiteSec / 10; + Black.Seconds = BlackSec / 10; + ArmyOnMove = onMove; +} +/////////////////////////////////////// +// +// chessclock::Reset +// +/////////////////////////////////////// +void chessclock::Reset( void ) +{ + Pause(); + WhiteIndex = 0; + BlackIndex = 0; + + White = Resource->TCPWhite[WhiteIndex]; + Black = Resource->TCPBlack[BlackIndex]; + + White.Seconds *= 10; + White.Increment *= 10; + Black.Seconds *= 10; + Black.Increment *= 10; + + ArmyOnMove = WHITE; + External = FALSE; + UpdateStrings(); +} +/////////////////////////////////////// +// +// chessclock::Pause +// +/////////////////////////////////////// +void chessclock::Pause( void ) +{ + Silent = TRUE; +} +/////////////////////////////////////// +// +// chessclock::Resume +// +/////////////////////////////////////// +void chessclock::Resume( void ) +{ + Silent = FALSE; +} +/////////////////////////////////////// +// +// chessclock::getCentiseconds +// +/////////////////////////////////////// +int chessclock::getCentiseconds( const bool Army ) +{ + if( Army == WHITE ) + { + return White.Seconds * 10; + } + return Black.Seconds * 10; +} +/////////////////////////////////////// +// +// chessclock::Moved +// +/////////////////////////////////////// +void chessclock::Moved( void ) +{ + Pause(); + if( ArmyOnMove == WHITE ) + { + ArmyOnMove = BLACK; + White.Moves--; + White.Seconds += White.Increment; + if( White.Moves < 1 ) + { + WhiteIndex++; + if( WhiteIndex == (signed)Resource->TCPWhite.count() ) WhiteIndex--; + White = Resource->TCPWhite[WhiteIndex]; + White.Seconds *= 10; + White.Increment *= 10; + } + } + else + { + ArmyOnMove = WHITE; + Black.Moves--; + Black.Seconds += Black.Increment; + if( Black.Moves < 1 ) + { + BlackIndex++; + if( BlackIndex == (signed)Resource->TCPBlack.count() ) BlackIndex--; + Black = Resource->TCPBlack[BlackIndex]; + Black.Seconds *= 10; + Black.Increment *= 10; + } + } + Resume(); +} +/////////////////////////////////////// +// +// chessclock::Tick +// +/////////////////////////////////////// +void chessclock::Tick( void ) +{ + if( Silent ) return; + if( ArmyOnMove == WHITE ) + { + White.Seconds--; + if( ( White.Seconds < 0 ) && ( Flag[WHITE] == FALSE ) ) + { + Flag[WHITE] = TRUE; + emit flagFell( WHITE ); + Resource->play( SND_FLAG ); + } + } + else + { + Black.Seconds--; + if( ( Black.Seconds < 0 ) && ( Flag[BLACK] == FALSE ) ) + { + Flag[BLACK] = TRUE; + emit flagFell( BLACK ); + Resource->play( SND_FLAG ); + } + } + UpdateStrings(); +} +/////////////////////////////////////// +// +// chessclock::UpdateStrings +// +/////////////////////////////////////// +void chessclock::UpdateStrings( void ) +{ + int tmp; + int h, m, s; + char sign; + + sign = ' '; + if( White.Seconds < 0 ) sign = '-'; + tmp = abs(White.Seconds / 10); + s = ( tmp % 60 ); + m = ( ( tmp / 60 ) % 60 ); + h = ( ( tmp / 60 ) / 60 ); + whiteClock.sprintf( " %c%.1d:%.2d:%.2d ", sign, h, m, s ); + + sign = ' '; + if( Black.Seconds < 0 ) sign = '-'; + tmp = abs(Black.Seconds / 10); + s = ( tmp % 60 ); + m = ( ( tmp / 60 ) % 60 ); + h = ( ( tmp / 60 ) / 60 ); + blackClock.sprintf( " %c%.1d:%.2d:%.2d ", sign, h, m, s ); +} diff --git a/knights/chessclock.h b/knights/chessclock.h new file mode 100644 index 0000000..ce2a1fd --- /dev/null +++ b/knights/chessclock.h @@ -0,0 +1,75 @@ +/*************************************************************************** + chessclock.h - description + ------------------- + begin : Mon Jul 2 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef CHESSCLOCK_H +#define CHESSCLOCK_H + +#include +#include +#include +#include "definitions.h" +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ + +class chessclock : public QWidget +{ + Q_OBJECT + + public: + + chessclock( QWidget *parent=0, const char *name=0, resource *Rsrc=0 ); + ~chessclock(); + + /* The Set function accepts Centiseconds ( 1/100 second ) */ + void Set( const int WhiteSec, const int BlackSec, const bool onMove ); + void Reset( void ); + void Pause( void ); + void Resume( void ); + void Moved( void ); + int getCentiseconds( const bool Army ); + + QString whiteClock; + QString blackClock; + bool Silent; + bool Flag[2]; + + public slots: + void Tick( void ); + + signals: + void flagFell( const bool ); + + private: + + resource *Resource; + + TCP White; + TCP Black; + + int WhiteIndex; + int BlackIndex; + + bool ArmyOnMove; + bool External; + + void UpdateStrings( void ); +}; + +#endif diff --git a/knights/command.cpp b/knights/command.cpp new file mode 100644 index 0000000..a67088a --- /dev/null +++ b/knights/command.cpp @@ -0,0 +1,98 @@ +/*************************************************************************** + command.cpp - description + ------------------- + begin : Sun Jun 30 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "command.h" + +Command::Command( int ID, int Command, int WhiteTime, int BlackTime, struct ChessMove Move ) +{ + white_time = WhiteTime; + black_time = BlackTime; + move = Move; + id = ID; + command = Command; +} + +Command::Command( int ID, int Command, int WhiteTime, int BlackTime, struct ChessMove Move, QString Data ) +{ + white_time = WhiteTime; + black_time = BlackTime; + data = Data; + move = Move; + id = ID; + command = Command; +} + +Command::Command( int ID, int Command, int WhiteTime, int BlackTime, QString Data ) +{ + white_time = WhiteTime; + black_time = BlackTime; + data = Data; + id = ID; + command = Command; +} + +Command::Command( int ID, int Command ) +{ + clear(); + id = ID; + command = Command; +} + +Command::Command( int ID, int Command, QString Data ) +{ + clear(); + id = ID; + command = Command; + data = Data; +} + +Command::Command() +{ + clear(); +} + +Command::~Command() +{ +} + +void Command::clear(void) +{ + white_time = 0; + black_time = 0; + command = CMD_None; + clearMove( &move ); +} +/////////////////////////////////////// +// +// Command::clearMove +// +/////////////////////////////////////// +void Command::clearMove( ChessMove *Move ) +{ + Move->fromFile = Null; + Move->fromRank = Null; + Move->toFile = Null; + Move->toRank = Null; + Move->Promote = Null; + Move->ManTaken = Null; + Move->NAG = 0; + Move->ICS_MoveCounter = 0; + Move->ICS_PawnPushFile = Null; + Move->ICS_Mode = Null; + Move->ICS_OnMove = 0; + Move->ICS_ClockTicking = TRUE; +} diff --git a/knights/command.h b/knights/command.h new file mode 100644 index 0000000..c10e300 --- /dev/null +++ b/knights/command.h @@ -0,0 +1,194 @@ +/*************************************************************************** + command.h - description + ------------------- + begin : Sun Jun 30 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef COMMAND_H +#define COMMAND_H + +#include +#include "definitions.h" + +/** + *@author Alexander Wels. + */ + /* Commands */ + +/* + These constants represent the game's desire to send the IOs a command. + SendCMD will convert them to the correct command for the current protocol. +*/ + +const int CMD_None = 0x00000000; +const int CMD_Init = 0x00000001; +const int CMD_NewGame = 0x00000002; +const int CMD_Exit = 0x00000003; +const int CMD_MoveNow = 0x00000004; +const int CMD_Pause = 0x00000005; +const int CMD_Resume = 0x00000006; +const int CMD_Move = 0x00000007; +const int CMD_Illegal = 0x00000008; +const int CMD_Play_White = 0x00000009; +const int CMD_Play_Black = 0x0000000a; +const int CMD_Result_White = 0x0000000b; +const int CMD_Result_Black = 0x0000000c; +const int CMD_Result_Draw = 0x0000000d; +const int CMD_Your_Time = 0x0000000e; +const int CMD_Enemy_Time = 0x0000000f; +const int CMD_Offer_Draw = 0x00000010; +const int CMD_Ponder = 0x00000011; +const int CMD_No_Pondering = 0x00000012; +const int CMD_Book_Mode = 0x00000013; +const int CMD_Out_Of_Book = 0x00000014; +const int CMD_Check_Book = 0x00000015; +const int CMD_Retract_Move = 0x00000016; +const int CMD_Hint = 0x00000017; +const int CMD_Listen = 0x00000018; +const int CMD_Play = 0x00000019; +const int CMD_Tell_User = 0x0000001a; +const int CMD_Tell_User_Error = 0x0000001b; +const int CMD_White_Resign = 0x0000001c; +const int CMD_Black_Resign = 0x0000001d; +const int CMD_White_Called_Flag = 0x0000001e; +const int CMD_Black_Called_Flag = 0x0000001f; +const int CMD_Set_Depth = 0x00000020; +const int CMD_Set_Board = 0x00000021; +const int CMD_Set_Difficulty = 0x00000022; +const int CMD_Tell_Opponent = 0x00000023; +const int CMD_Tell_Others = 0x00000024; +const int CMD_Tell_All = 0x00000025; +const int CMD_Tell_ICS = 0x00000026; +const int CMD_Set_Name = 0x00000028; + +/* Engine Specific */ +const int CMD_UCI_Hint = 0x00100001; +const int CMD_Send_SIGTERM = 0x00100002; +const int CMD_Send_SIGINT = 0x00100003; + +/* Internet specific commands */ +const int CMD_Reject_Draw = 0x01000001; +const int CMD_Reset_Server = 0x01000002; +const int CMD_Examine_Forward = 0x01000003; +const int CMD_Examine_Backward = 0x01000004; +const int CMD_Lost_Contact = 0x01000005; +const int CMD_Bad_Login = 0x01000006; +const int CMD_Toggle_Seek = 0x01000007; +const int CMD_Assess = 0x01000008; +const int CMD_Player_Finger = 0x01000009; +const int CMD_Player_History = 0x0100000a; +const int CMD_Add_Friend = 0x0100000b; +const int CMD_Ignore_Player = 0x0100000c; +const int CMD_Start_Match = 0x0100000d; + +/* These commands are from Match to Core ONLY */ +const int CMD_New_Players = 0x02000001; + +/* These commands are sent to ICS Related Widgets */ +const int CMD_Add_Sought_Match = 0x03000001; +const int CMD_Show_Sought_List = 0x03000002; +const int CMD_Hide_Sought_List = 0x03000003; +const int CMD_Set_Input = 0x03000004; +const int CMD_Set_Src_Tell = 0x03000005; +const int CMD_Set_Src_Channel = 0x03000006; +const int CMD_Append_To_Console = 0x03000007; +const int CMD_Send_To_ICS = 0x03000008; + +class Command +{ + +protected: + int white_time; // Centiseconds + int black_time; // Centiseconds + struct ChessMove move; + int command; + int id; + QString data; // Generic String... used for ICS and FEN, etc. + +public: + Command( int ID, int Command ); + Command( int ID, int Command, QString Data ); + Command( int ID, int Command, int WhiteTime, int BlackTime, struct ChessMove Move ); + Command( int ID, int Command, int WhiteTime, int BlackTime, struct ChessMove Move, QString Data ); + Command( int ID, int Command, int WhiteTime, int BlackTime, QString Data ); + Command(); + ~Command(); + void clear( void ); + + /* Static Public Members */ + static void clearMove( struct ChessMove *Move ); + + /* Inline Members */ + int getWhiteTime( void ) + { + return white_time; + } + + int getBlackTime( void ) + { + return black_time; + } + + struct ChessMove& getMove( void ) + { + return move; + } + + int getID( void ) + { + return id; + } + + int getCommand( void ) + { + return command; + } + + QString& getData( void ) + { + return data; + } + + void setWhiteTime( int time ) + { + white_time = time; + } + + void setBlackTime( int time ) + { + black_time = time; + } + + void setMove( struct ChessMove &NewMove ) + { + move = NewMove; + } + + void setID( int NewID ) + { + id = NewID; + } + + void setCommand( int &NewCommand ) + { + command = NewCommand; + } + + void setData( QString &NewData ) + { + data = NewData; + } +}; + +#endif diff --git a/knights/console.cpp b/knights/console.cpp new file mode 100644 index 0000000..33bbbd5 --- /dev/null +++ b/knights/console.cpp @@ -0,0 +1,264 @@ +/*************************************************************************** + console.cpp - description + ------------------- + begin : Sun May 27 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "console.moc" +#include "knightstextview.h" +#include "accel.h" +#include "tabmanager.h" + +/* KDE */ +#include +#include +#include +#include + +Console::Console(QWidget *parent, + const char *name, + resource *Rsrc ) : QVBox(parent,name) +{ + myResource = Rsrc; + SelfMoving = FALSE; + QStyle& Style = QApplication::style(); + + margin = Style.defaultFrameWidth(); + myTextView = new KnightsTextView( this, myResource ); + myLineEdit = new KLineEdit( this, "console_edit" ); + /* Configure misc */ + setBG(); + myTextView->setStaticBackground( FALSE ); + + connect( myLineEdit, SIGNAL( returnPressed( const QString& ) ), this, SLOT( getText( const QString& ) ) ); + connect( myResource->myAccel, SIGNAL( history_prev() ), this, SLOT( historyBackward() ) ); + connect( myResource->myAccel, SIGNAL( history_next() ), this, SLOT( historyForward() ) ); + connect( myResource->myAccel, SIGNAL( page_up() ), this, SLOT( pageUp() ) ); + connect( myResource->myAccel, SIGNAL( page_down() ), this, SLOT( pageDown() ) ); + connect( myResource->myAccel, SIGNAL( kibitz() ), this, SLOT( kibitz() ) ); + connect( myResource->myAccel, SIGNAL( whisper() ), this, SLOT( whisper() ) ); + connect( myResource->myAccel, SIGNAL( reply_tell() ), this, SLOT( replyPrivate() ) ); + connect( myResource->myAccel, SIGNAL( reply_channel() ), this, SLOT( replyChannel() ) ); + connect( myResource->myAccel, SIGNAL( focus() ), this, SLOT( getFocus() ) ); + connect( myResource->myAccel, SIGNAL( focus( const QChar& ) ), this, SLOT( getFocus( const QChar& ) ) ); + + myTextView->show(); + myLineEdit->show(); + show(); +} +Console::~Console() +{ + delete myLineEdit; + delete myTextView; +} +/////////////////////////////////////// +// +// Console::pageDown +// +/////////////////////////////////////// +void Console::pageDown( void ) +{ + myTextView->pageMove( Qt::Key_PageDown ); +} +/////////////////////////////////////// +// +// Console::pageUp +// +/////////////////////////////////////// +void Console::pageUp( void ) +{ + myTextView->pageMove(); +} +/////////////////////////////////////// +// +// Console::recvCMD +// +/////////////////////////////////////// +void Console::recvCMD( const Command& command ) +{ + QString modText; /* this will hold the text to append after it has been modified with anchors */ + + switch(((Command)command).getCommand()) + { + case CMD_Append_To_Console: + if( myTextView->contentsY() >= ( myTextView->contentsHeight() - myTextView->visibleHeight() - 12 ) ) + { + modText = insertTags(((Command)command).getData()); + myTextView->append(modText); + myTextView->scrollToBottom(); + } + else + { + modText = insertTags(((Command)command).getData()); + myTextView->append(modText); + } + break; + case CMD_Set_Input: + myLineEdit->setText( ((Command)command).getData() ); + if( !myLineEdit->hasFocus() ) + getFocus(); + break; + case CMD_Set_Src_Tell: + lastPrivateSource = ((Command)command).getData(); + break; + case CMD_Set_Src_Channel: + lastChannelSource = ((Command)command).getData(); + break; + default: + break; + } +} +/////////////////////////////////////// +// +// Console::getText +// +/////////////////////////////////////// +void Console::getText( const QString &text ) +{ + /* Append this text into our history */ + history.append( text ); + if( history.count() > 100 ) + history.remove( history.begin() ); + historyIT = history.end(); + emit sendCMD( Command( 0, CMD_Send_To_ICS, text ) ); + myLineEdit->clear(); +} +/////////////////////////////////////// +// +// Console::historyBack +// +/////////////////////////////////////// +void Console::historyBackward( void ) +{ + if( history.count() && ( historyIT != history.begin() ) ) + { + historyIT--; + myLineEdit->setText( (*historyIT) ); + } + if( !myLineEdit->hasFocus() ) + getFocus(); +} +/////////////////////////////////////// +// +// Console::historyForward +// +/////////////////////////////////////// +void Console::historyForward( void ) +{ + if( history.count() && ( historyIT != history.end() ) ) + { + historyIT++; + myLineEdit->setText( (*historyIT) ); + } + if( !myLineEdit->hasFocus() ) + getFocus(); +} +/////////////////////////////////////// +// +// Console::replyPrivate +// +/////////////////////////////////////// +void Console::replyPrivate( void ) +{ + myLineEdit->setText( QString( "tell %1 " ).arg( lastPrivateSource ) ); + if( !myLineEdit->hasFocus() ) + getFocus(); +} +/////////////////////////////////////// +// +// Console::replyChannel +// +/////////////////////////////////////// +void Console::replyChannel( void ) +{ + myLineEdit->setText( QString( "tell %1 " ).arg( lastChannelSource ) ); + if( !myLineEdit->hasFocus() ) + getFocus(); +} +/////////////////////////////////////// +// +// Console::kibitz +// +/////////////////////////////////////// +void Console::kibitz( void ) +{ + myLineEdit->setText( QString( "kibitz " ) ); + if( !myLineEdit->hasFocus() ) + getFocus(); +} +/////////////////////////////////////// +// +// Console::whisper +// +/////////////////////////////////////// +void Console::whisper( void ) +{ + myLineEdit->setText( QString( "whisper " ) ); + if( !myLineEdit->hasFocus() ) + getFocus(); +} +/////////////////////////////////////// +// +// Console::getFocus +// +/////////////////////////////////////// +void Console::getFocus( void ) +{ + if( myLineEdit->hasFocus() ) + { + getText( myLineEdit->text() ); + } + setActiveWindow(); + myResource->tabManager->showTab( this ); + myLineEdit->setFocus(); +} +void Console::getFocus( const QChar &c ) +{ + myLineEdit->setText( myLineEdit->text() + QString( c ) ); + if( !myLineEdit->hasFocus() ) + getFocus(); +} +/////////////////////////////////////// +// +// Console::setBG +// +/////////////////////////////////////// +void Console::setBG( void ) +{ + myTextView->setPaper( QBrush( myResource->COLOR_Background ) ); +} + +/////////////////////////////////////// +// +// Console::insertTags(QString data) +// +/////////////////////////////////////// +QString Console::insertTags(QString data) +{ + QRegExp hyperLinks("(http://(?:.)+(?:\\.(?:[^\\s\\r\\t<])+)+)"); + QRegExp mailLinks("\\b((?:\\w|\\d)+\\@(?:\\w|\\d)+(?:\\.(?:\\d|\\w)+)+)\\b"); + int pos = 0; + + pos = hyperLinks.search(data, 0); + if(pos >= 0) + { + data.replace(hyperLinks, "" + hyperLinks.cap(0) + ""); + } + pos = mailLinks.search(data, 0); + if(pos >= 0) + { + data.replace(mailLinks, "" + mailLinks.cap(0) + ""); + } + return data; +} diff --git a/knights/console.h b/knights/console.h new file mode 100644 index 0000000..ec38ec9 --- /dev/null +++ b/knights/console.h @@ -0,0 +1,87 @@ +/*************************************************************************** + console.h - description + ------------------- + begin : Sun May 27 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef CONSOLE_H +#define CONSOLE_H + +/* Qt */ +#include +#include +#include +/* Local */ +#include "definitions.h" +#include "resource.h" +#include "command.h" + +/** + *@author Troy Corbin Jr. + */ + +class KLineEdit; +class KnightsTextView; + +class Console : public QVBox +{ + Q_OBJECT + + public: + + enum Direction + { + Up = 1, + Down = 0 + }; + + Console(QWidget *parent=0, const char *name=0, resource *Rsrc=0); + ~Console(); + void buildAccel( void ); + + public slots: + void recvCMD( const Command& ); + void getText( const QString& ); + void historyBackward( void ); + void historyForward( void ); + void pageUp( void ); + void pageDown( void ); + void getFocus( void ); + void getFocus( const QChar& ); + void setBG( void ); + void replyPrivate( void ); + void replyChannel( void ); + void kibitz( void ); + void whisper( void ); + + signals: + void sendCMD( const Command& ); + + private: + QString insertTags(QString); + + resource *myResource; + int margin; + bool SelfMoving; + + KnightsTextView *myTextView; + KLineEdit *myLineEdit; + + QStringList history; + QStringList::Iterator historyIT; + QString lastPrivateSource; + QString lastChannelSource; +}; + +#endif diff --git a/knights/core.cpp b/knights/core.cpp new file mode 100644 index 0000000..e0b09ce --- /dev/null +++ b/knights/core.cpp @@ -0,0 +1,892 @@ +/*************************************************************************** + core.cpp - description + ------------------- + begin : Tue Oct 2 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +/* KDE */ +#include +#include + +/* Qt */ +#include + +/* Local */ +#include "core.moc" +#include "match.h" +#include "list_pgn.h" +#include "thinbuttons.h" +#include "io_engine.h" +#include "io_internet.h" +#include "match_param.h" + +/* Tabs */ +#include "tabmanager.h" + +/////////////////////////////////////// +// +// core::core +// +/////////////////////////////////////// +core::core(QWidget *parent, const char *name, resource *Rsrc ) : QWidget(parent,name) +{ + myResource = Rsrc; + listPGN = NULL; + currentMatch = NULL; + + myButtonGroup = new thinbuttons( this, "ButtonGroup", myResource ); + myButtonGroup->show(); + connect( myButtonGroup, SIGNAL( leftClick(int) ), this, SLOT( setMatch(int) ) ); + connect( myButtonGroup, SIGNAL( menuItemSelected(int,int) ), this, SLOT( thinButtonMenu(int,int) ) ); + + myCoreClock.start( 100, FALSE ); + resize(); +} + +/////////////////////////////////////// +// +// core::~core +// +/////////////////////////////////////// +core::~core() +{ + myCoreClock.stop(); + delete myButtonGroup; +} + +/////////////////////////////////////// +// +// core::createNewIO +// +/////////////////////////////////////// +void core::createNewIO( int type, int ID, int side, int str ) +{ + io_internet *internetioPtr = NULL; + io_engine *engineioPtr = NULL; +// io_email *ioEmailPtr = NULL; + switch( type ) + { + /* PLAYERTCP */ + case PLAYERTCP: + if( ID == Null ) + { + /* Create a NEW internetIO */ + internetioPtr = new io_internet( this, myResource ); + myIOMap.add( ID, internetioPtr ); + internetioPtr->setID( ID ); + connect( internetioPtr, SIGNAL( sendCMD( const Command& ) ), this, SLOT( command2Match( const Command& ) ) ); + } + else + { + /* Use an existing internetIO */ + internetioPtr = (io_internet*) myIOMap.find(Null); + if( internetioPtr == NULL ) + { + kdWarning() << "core::createNewIO: Trying to connect a match to an internetIO that doesn't exsist." << endl; + } + else + { + myIOMap.add( ID, internetioPtr ); + } + } + break; + /* PLAYEREXAMINE */ + case PLAYEREXAMINE: + /* examine mode needs only 1 io mapped to it */ + if( ID == Null ) + { + /* Create a NEW internetIO */ + internetioPtr = new io_internet( this, myResource ); + myIOMap.add( ID, internetioPtr ); + internetioPtr->setID( ID ); + connect( internetioPtr, SIGNAL( sendCMD( const Command& ) ), this, SLOT( command2Match( const Command& ) ) ); + } + else + { + internetioPtr = (io_internet*) myIOMap.find(ID); + if( internetioPtr == NULL ) + { + /* no io mapped to the ID yet, use the internetio */ + /* Use an existing internetIO */ + internetioPtr = (io_internet*) myIOMap.find(Null); + if( internetioPtr == NULL ) + { + kdWarning() << "core::createNewIO: Trying to connect a match to an internetIO that doesn't exsist." << endl; + } + else + { + myIOMap.add( ID, internetioPtr ); + } + } + /* this ID is already mapped we don't need another one */ + } + break; + /* PLAYERPC */ + case PLAYERPC: + engineioPtr = new io_engine( this, myResource ); + myIOMap.add( ID, engineioPtr ); + engineioPtr->setID( ID ); + connect( engineioPtr, SIGNAL( sendCMD( const Command& ) ), this, SLOT( command2Match( const Command& ) ) ); + engineioPtr->Start( side ); + engineioPtr->recvCMD( Command( ID, CMD_Set_Difficulty, QString().setNum( 1 << str ) ) ); + break; + /* PLAYEREMAIL */ + case PLAYEREMAIL: +// ioEmailPtr = new io_email( this, myResource ); +// myIOMap.add( ID, ioEmailPtr ); +// ioEmailPtr->setID( ID ); +// connect( ioEmailPtr, SIGNAL( sendCMD( const Command& ) ), this, SLOT( command2Match( const Command& ) ) ); + break; + default: + /* No IO needed */ + break; + } +} + +/////////////////////////////////////// +// +// core::newMatch(match_params* param); +// +/////////////////////////////////////// +match* core::newMatch( match_param* param ) +{ + match *match_ptr = NULL; + int newID; + + /* create a new ID for the match */ + newID = myIDManager.getNewID(); + + /* Create the match navigation button */ + myButtonGroup->create( newID ); + + /* Create the match */ + match_ptr = new match(this, param, myResource); + match_ptr->setID( newID ); + myMatchMap.add( newID, match_ptr ); + + /* Create IOs */ + createNewIO( param->type(WHITE), newID, WHITE, param->strength(WHITE) ); + createNewIO( param->type(BLACK), newID, BLACK, param->strength(BLACK) ); + + /* Connect Signals */ + connect( match_ptr, SIGNAL( sendCMD( const Command& ) ), this, SLOT( command2IO( const Command& ) ) ); + connect( &myCoreClock, SIGNAL( timeout() ), match_ptr, SLOT( tick() ) ); + + /* Set this new match as the current match */ + setMatch( newID ); + setActiveWindow(); + + /* Save our configuration settings */ + myResource->ConfigWrite(); + + return match_ptr; +} + +/////////////////////////////////////// +// +// core::setMatch +// +/////////////////////////////////////// +void core::setMatch( int ID ) +{ + /* + Disconnect the current match from the display + */ + if( currentMatch != NULL ) + { + currentMatch->setCurrent( FALSE ); + disconnect( currentMatch, SIGNAL( setClocks() ), this, SLOT( slot_setClocks() ) ); + disconnect( currentMatch, SIGNAL( setStatusBar( const int&, const QString& ) ), this, SLOT( slot_setStatusBar( const int&, const QString& ) ) ); + disconnect( currentMatch, SIGNAL( setNotation() ), this, SLOT( slot_setNotation() ) ); + currentMatch->setVisibility( FALSE ); + } + /* + Now display the new match, and connect it's signals to the GUI + */ + currentMatch = myMatchMap.find( ID ); + currentMatch->setVisibility( TRUE ); + myButtonGroup->setButton( ID ); + connect( currentMatch, SIGNAL( setClocks() ), this, SLOT( slot_setClocks() ) ); + connect( currentMatch, SIGNAL( setStatusBar( const int&, const QString& ) ), this, SLOT( slot_setStatusBar( const int&, const QString& ) ) ); + connect( currentMatch, SIGNAL( setNotation() ), this, SLOT( slot_setNotation() ) ); + currentMatch->setCurrent( TRUE ); + emit requestResize(); + emit initMatch(); + currentMatch->resendStatusBar(); + + /* Give Ourselves Focus */ + setActiveWindow(); + topLevelWidget()->raise(); +} + +/////////////////////////////////////// +// +// core::clearAll +// +/////////////////////////////////////// +bool core::clearAll( void ) +{ + while( myMatchMap.count() ) + { + if( clearMatch() != TRUE ) return FALSE; + } + return TRUE; +} +/////////////////////////////////////// +// +// core::clearMatch +// +/////////////////////////////////////// +bool core::clearMatch( int id ) +{ + match *departingMatch, *nextMatch; + io_base *ioPtr; + + if( id == Null ) + { + if( currentMatch != NULL ) + { + id = currentMatch->getID(); + } + else + { + return FALSE; + } + } + departingMatch = myMatchMap.find(id); + + /* A bad ID was passed */ + if( departingMatch == NULL ) + { + kdError() << "core::clearMatch: Bad matchID " << id << " could not be cleared." << endl; + return FALSE; + } + + /* Save if needed */ + if( departingMatch->modified() ) + { + if( save( id, TRUE, FALSE ) == FALSE ) + { + return FALSE; + } + } + + /* Get ID of another match so it can become the current match */ + if( departingMatch == currentMatch ) + { + /* Find another match in the map */ + nextMatch = --myMatchMap; + if( nextMatch == NULL ) + { + ++myMatchMap; + nextMatch = ++myMatchMap; + } + /* Set the new current match */ + if( nextMatch != NULL ) + { + setMatch( nextMatch->getID() ); + } + else + { + currentMatch = NULL; + emit initMatch(); + } + } + + /* Remove IOs in this match... */ + ioPtr = myIOMap.find(id); + while( ioPtr != NULL ) + { + myIOMap.remove( id ); + if( ioPtr->getType() != io_base::INTERNET ) + { + delete ioPtr; + } + ioPtr = myIOMap.find(id); + } + + /* ...and remove the match */ + myMatchMap.remove( id ); + myButtonGroup->remove( id ); + delete departingMatch; + + resize(); + return TRUE; +} +/////////////////////////////////////// +// +// core::resize +// +/////////////////////////////////////// +void core::resize( void ) +{ + int size = 8 + ( 1 * ( myResource->ThemeBorder == TRUE ) ); + + if( currentMatch != NULL ) + { + currentMatch->resize(); + myButtonGroup->resize( currentMatch->width() ); + myButtonGroup->move( 0, currentMatch->height() ); + setFixedSize( currentMatch->width(), currentMatch->height() + myButtonGroup->height() ); + } + else + { + myButtonGroup->resize( myResource->ThemeSize * size ); + myButtonGroup->move( 0, myResource->ThemeSize * size ); + setFixedSize( myResource->ThemeSize * size, ( myResource->ThemeSize * size ) + myButtonGroup->height() ); + } +} +/////////////////////////////////////// +// +// core::command2IO +// +/////////////////////////////////////// +void core::command2IO( const Command &command ) +{ + io_base *io; + int id = ((Command)command).getID(); + + io = myIOMap.find(id); + while( io != NULL ) + { + io->recvCMD(command); + io = myIOMap.findNext(); + } +} +/////////////////////////////////////// +// +// core::command2Match +// +/////////////////////////////////////// +void core::command2Match( const Command &command ) +{ + match_param *paramPtr; + match *matchPtr; + Command cmd = command; + + matchPtr = myMatchMap.find( cmd.getID() ); + while( matchPtr != NULL ) + { + /* Catch Commands Meant for Core */ + switch( cmd.getCommand() ) + { + case CMD_Hint: + KMessageBox::information( this, cmd.getData(), i18n("Hint") ); + break; + case CMD_Tell_User: + KMessageBox::information( this, cmd.getData(), i18n( "Tell User" ) ); + break; + case CMD_Tell_User_Error: + KMessageBox::sorry( this, cmd.getData(), i18n( "Tell User Error" ) ); + break; + case CMD_Tell_Opponent: + paramPtr = matchPtr->getParam(); + if( ( paramPtr->type( WHITE ) == PLAYERLOCAL ) || + ( paramPtr->type( BLACK ) == PLAYERLOCAL ) ) + KMessageBox::information( this, cmd.getData(), i18n( "Tell Opponent" ) ); + else + command2IO( command ); + break; + case CMD_Tell_Others: + command2IO( command ); + break; + case CMD_Tell_ICS: + command2IO( command ); + break; + case CMD_Tell_All: + paramPtr = matchPtr->getParam(); + if( ( paramPtr->type( WHITE ) == PLAYERLOCAL ) || + ( paramPtr->type( BLACK ) == PLAYERLOCAL ) ) + KMessageBox::information( this, cmd.getData(), i18n( "Tell All" ) ); + command2IO( command ); + break; + case CMD_Out_Of_Book: +// engine[enginePtr - 1]->sendCMD( CMD_Check_Book ); + break; + default: + /* Just send it to the Match */ + matchPtr->recvCMD( command ); + break; + } + matchPtr = myMatchMap.findNext(); + } +} +/////////////////////////////////////// +// +// core::flag +// +/////////////////////////////////////// +bool core::flag( const bool Army ) +{ + if( currentMatch == NULL ) return FALSE; + return currentMatch->flag( Army ); + return false; +} +/////////////////////////////////////// +// +// core::clock +// +/////////////////////////////////////// +QString core::clock( const bool Army ) +{ + if( currentMatch == NULL ) return QString::null; + return currentMatch->clock( Army ); + return ""; +} +/////////////////////////////////////// +// +// core::modified +// +/////////////////////////////////////// +bool core::modified( void ) +{ + if( currentMatch == NULL ) return FALSE; + return currentMatch->modified(); + return false; +} +/////////////////////////////////////// +// +// core::paused +// +/////////////////////////////////////// +bool core::paused( void ) +{ + if( currentMatch == NULL ) return FALSE; + return currentMatch->paused(); + return false; +} +/////////////////////////////////////// +// +// core::isOnline +// +/////////////////////////////////////// +bool core::isOnline( void ) +{ + unsigned int index; + for( index=0; index < myIOMap.count(); index++ ) + { + if( myIOMap[index]->getType() == io_base::INTERNET ) + { + return TRUE; + } + } + return FALSE; +} + +/////////////////////////////////////// +// +// core::onMove +// +/////////////////////////////////////// +char core::onMove( void ) +{ + if( currentMatch == NULL ) return Null; + return currentMatch->onMove(); +} +/////////////////////////////////////// +// +// core::caption +// +/////////////////////////////////////// +QString core::caption( void ) +{ + QButton *Button; + if( currentMatch == NULL ) return QString::null; + Button = myButtonGroup->find( currentMatch->getID() ); + if( Button != NULL ) Button->setText( currentMatch->caption() ); + return currentMatch->caption(); +} +/////////////////////////////////////// +// +// core::whiteInput +// +/////////////////////////////////////// +char core::whiteInput(void) +{ + if( currentMatch == NULL ) return Null; + return currentMatch->input(WHITE); +} +/////////////////////////////////////// +// +// core::blackInput +// +/////////////////////////////////////// +char core::blackInput(void) +{ + if( currentMatch == NULL ) return Null; + return currentMatch->input(BLACK); +} +/////////////////////////////////////// +// +// core::review +// +/////////////////////////////////////// +void core::review( int Index ) +{ + if( currentMatch == NULL ) return; + currentMatch->review( Index ); +} +/////////////////////////////////////// +// +// core::inputOnMove +// +/////////////////////////////////////// +char core::inputOnMove( bool reverse ) +{ + if( currentMatch == NULL ) return Null; + return currentMatch->inputOnMove( reverse ); +} +/////////////////////////////////////// +// +// core::notation +// +/////////////////////////////////////// +QStringList* core::notation( void ) +{ + if( currentMatch == NULL ) return NULL; + return currentMatch->notation(); +} +/////////////////////////////////////// +// +// core::slot_setNotation +// +/////////////////////////////////////// +void core::slot_setNotation( void ) +{ + emit setNotation(); +} +/////////////////////////////////////// +// +// core::slot_setStatusBar +// +/////////////////////////////////////// +void core::slot_setStatusBar( const int &ID, const QString& MSG ) +{ + emit setStatusBar( ID, MSG ); +} +/////////////////////////////////////// +// +// core::slot_setClocks +// +/////////////////////////////////////// +void core::slot_setClocks( void ) +{ + emit setClocks(); +} +/////////////////////////////////////// +// +// core::print +// +/////////////////////////////////////// +void core::print( int ID ) +{ + match *m2p; + + if( ID == Null ) + { + m2p = currentMatch; + } + else + { + m2p = myMatchMap.find( ID ); + } + if( m2p == NULL ) return; + m2p->print(); + return; +} +/////////////////////////////////////// +// +// core::load +// +/////////////////////////////////////// +bool core::load( void ) +{ + const QString fileFilter( "*.pgn *.Pgn *.PGN|Portable Game Notation (.pgn)\n*|All Files" ); + QString URL; + URL = KFileDialog::getOpenFileName( QString::null, QString( fileFilter ), this, i18n( "Load PGN..." ) ); + if( URL.isEmpty() ) return FALSE; + return load( URL ); +} +bool core::load( const QString &IncURL ) +{ + listPGN = new list_pgn( 0, "listPGN" ); + myResource->tabManager->addTab( listPGN, IncURL.section( '/', -1 ) ); + connect( listPGN, SIGNAL( selected( const QString&, const int& ) ), this, SLOT( load( const QString&, const int& ) ) ); + listPGN->setURL( IncURL ); +return TRUE; +} +bool core::load( const QString &url, const int &pos ) +{ + newMatch( new match_param( myResource, PLAYERLOAD, PLAYERLOAD ) ); + return currentMatch->load( url, pos ); +} +/////////////////////////////////////// +// +// core::save +// +/////////////////////////////////////// +bool core::save( const int ID, const bool Prompt, const bool SaveAs ) +{ + const QString fileFilter( "*.pgn *.Pgn *.PGN|Portable Game Notation (.pgn)\n*|All Files" ); + match *match2bSaved; + int answer; + QString URL; + + if( ID == Null ) + { + /* Use current match */ + match2bSaved = currentMatch; + } + else + { + match2bSaved = myMatchMap.find( ID ); + } + if( match2bSaved == NULL ) return FALSE; + if( Prompt ) + { + /* Prompt for the save */ + myResource->ConfigWrite(); + answer = KMessageBox::warningYesNoCancel( this, + i18n("Would you like to save this match?"), + i18n("Save Match?"), + QString::null, + QString::null, + QString("PromptForSaving") ); + myResource->ConfigRead(); + if( answer == KMessageBox::Cancel ) + { + return FALSE; + } + if( answer == KMessageBox::No ) + { + return TRUE; + } + } + /* Get the last URL we used */ + URL = match2bSaved->url(); + if( ( URL.isEmpty() ) || ( SaveAs ) ) + { + /* Get a new URL */ + URL = KFileDialog::getSaveFileName( QString::null, QString( fileFilter ), this, i18n( "Save Match..." ) ); + if( URL.isNull() ) + { + return FALSE; + } + if( URL.findRev( ".pgn", -1, FALSE ) == -1 ) + { + URL += ".pgn"; + } + } + if( match2bSaved->save( URL ) == FALSE ) + { + emit setStatusBar( SAVE_ERROR ); + return FALSE; + } + emit setStatusBar( SAVE_OK ); + match2bSaved->setModified( FALSE ); + return TRUE; +} +/////////////////////////////////////// +// +// core::matchMenu +// +/////////////////////////////////////// +void core::matchMenu( int opt ) +{ + unsigned int index; + switch(opt) + { + /* Offer / Accept Draw */ + case MENU_OFFER_DRAW: // Fall Through + case MENU_ACCEPT_DRAW: + if( whiteInput() == PLAYERLOCAL ) + { + command2Match( Command( currentMatch->getID(), CMD_Offer_Draw, QString("W") ) ); + } + if( blackInput() == PLAYERLOCAL ) + { + command2Match( Command( currentMatch->getID(), CMD_Offer_Draw, QString("B") ) ); + } + command2IO( Command( currentMatch->getID(), CMD_Offer_Draw ) ); + break; + /* Reject Draw */ + case MENU_REJECT_DRAW: + command2IO( Command( currentMatch->getID(), CMD_Reject_Draw ) ); + break; + /* Resign */ + case MENU_RESIGN: + if( ( whiteInput() == PLAYERLOCAL ) && ( currentMatch->onMove() == WHITE ) ) + { + command2IO( Command( currentMatch->getID(), CMD_White_Resign ) ); + currentMatch->recvCMD( Command( currentMatch->getID(), CMD_White_Resign ) ); + } + if( ( blackInput() == PLAYERLOCAL ) && ( currentMatch->onMove() == BLACK ) ) + { + command2IO( Command( currentMatch->getID(), CMD_Black_Resign ) ); + currentMatch->recvCMD( Command( currentMatch->getID(), CMD_Black_Resign ) ); + } + break; + /* Retract */ + case MENU_RETRACT: + command2IO( Command( currentMatch->getID(), CMD_Retract_Move ) ); + currentMatch->retract(); + currentMatch->retract(); + emit setNotation(); + if( onMove() == WHITE ) + emit setStatusBar( WHITE_TURN ); + else + emit setStatusBar( BLACK_TURN ); + break; + /* Move Now */ + case MENU_MOVE_NOW: + command2IO( Command( currentMatch->getID(), CMD_MoveNow ) ); + break; + /* Hint */ + case MENU_HINT: + currentMatch->requestHint(); + break; + /* Orientation */ + case MENU_ORIENTATION: + currentMatch->flip(); + break; + /* Ponder */ + case MENU_PONDER: + if( myResource->OPTION_Ponder ) + { + command2IO( Command( currentMatch->getID(), CMD_Ponder ) ); + } + else + { + command2IO( Command( currentMatch->getID(), CMD_No_Pondering ) ); + } + break; + /* Pause */ + case MENU_PAUSE: + currentMatch->setPaused( !currentMatch->paused() ); + if( currentMatch->paused() ) + { + command2IO( Command( currentMatch->getID(), CMD_Pause ) ); + } + else + { + command2IO( Command( currentMatch->getID(), CMD_Resume ) ); + } + break; + /* Pause All */ + case MENU_PAUSEALL: + if( myMatchMap.count() ) + { + for( index = 0; index < myMatchMap.count(); index++ ) + { + if( ( whiteInput() == PLAYERTCP ) || ( blackInput() == PLAYERTCP ) ) + continue; + myMatchMap[index]->setPaused( !myMatchMap[index]->paused() ); + if( myMatchMap[index]->paused() ) + { + command2IO( Command( currentMatch->getID(), CMD_Pause ) ); + } + else + { + command2IO( Command( currentMatch->getID(), CMD_Resume ) ); + } + } + } + break; + /* Call Flag */ + case MENU_CALL_FLAG: + if( whiteInput() == PLAYERLOCAL ) + { + command2IO( Command( currentMatch->getID(), CMD_White_Called_Flag ) ); + currentMatch->recvCMD( Command( currentMatch->getID(), CMD_White_Called_Flag ) ); + } + if( blackInput() == PLAYERLOCAL ) + { + command2IO( Command( currentMatch->getID(), CMD_Black_Called_Flag ) ); + currentMatch->recvCMD( Command( currentMatch->getID(), CMD_Black_Called_Flag ) ); + } + break; + default: + break; + } +} +/////////////////////////////////////// +// +// core::thinButtonMenu +// +/////////////////////////////////////// +void core::thinButtonMenu( int id, int item ) +{ + switch( item ) + { + case MENU_SAVE: + save( id, FALSE, FALSE ); + break; + case MENU_SAVEAS: + save( id, FALSE, TRUE ); + break; + case MENU_PRINT: + print( id ); + break; + case MENU_CLOSE: + clearMatch( id ); + break; + default: + break; + } +} + +/////////////////////////////////////// +// +// core::resetServer +// +/////////////////////////////////////// +void core::resetServer( void ) +{ + command2IO( Command( Null, CMD_Reset_Server ) ); +} + +/////////////////////////////////////// +// +// core::goOffline() +// +/////////////////////////////////////// +void core::goOffline(void) +{ + unsigned int index(0); + io_base *ioPtr(NULL); + + while( index < myIOMap.count() ) + { + if( myIOMap[index]->getType() == io_base::INTERNET ) + { + ioPtr = myIOMap[index]; + + if( myIOMap.keyAt(index) != Null ) + { + clearMatch( myIOMap.keyAt(index) ); + } + else + { + myIOMap.remove( Null ); + } + + index = 0; + continue; + } + index++; + } + if( ioPtr != NULL ) + delete ioPtr; +} + diff --git a/knights/core.h b/knights/core.h new file mode 100644 index 0000000..5723112 --- /dev/null +++ b/knights/core.h @@ -0,0 +1,107 @@ +/*************************************************************************** + core.h - description + ------------------- + begin : Tue Oct 2 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef CORE_H +#define CORE_H + +#include +#include +#include "definitions.h" +#include "resource.h" +#include "knightsmap.h" +#include "idmanager.h" +#include "io_base.h" + +class list_pgn; +class thinbuttons; +class match; +class match_param; + +/** + *@author Troy Corbin Jr. + */ + +typedef KnightsMap MatchMap; +typedef KnightsMap IOMap; + +class core : public QWidget +{ + Q_OBJECT + public: + core(QWidget *parent=0, const char *name=0, resource *Rsrc=0); + ~core(); + QStringList* notation( void ); + QString caption( void ); + bool modified( void ); + bool paused( void ); + bool isOnline( void ); + bool flag( const bool ); + char onMove( void ); + char whiteInput( void ); + char blackInput( void ); + char inputOnMove( bool reverse=FALSE ); + void createNewIO( int type, int ID, int side=BLACK, int str=0 ); + void goOffline(void); + + public slots: + match* newMatch( match_param* ); + bool clearMatch( int id=Null ); + bool clearAll( void ); + void setMatch( int ); + void command2IO( const Command& ); + void command2Match( const Command& ); + void resetServer( void ); + void matchMenu( int ); + void resize( void ); + bool save( const int ID, const bool Prompt, const bool SaveAs ); + bool load( void ); + bool load( const QString& ); + bool load( const QString&, const int& ); + void slot_setNotation( void ); + void slot_setClocks( void ); + void slot_setStatusBar( const int&, const QString& ); + void print( int ID=Null ); + void review( int ); + QString clock( const bool ); + + signals: + void requestResize( void ); + void setStatusBar( const int &ID, const QString& MSG=QString::null ); + void setNotation( void ); + void setClocks( void ); + void initMatch( void ); + void serverDestroyed( void ); + + protected: + bool findMatch( const int ); + void serverSelfDestruct( void ); + + protected slots: + void thinButtonMenu( int id, int item ); + + private: + IDManager myIDManager; + resource *myResource; + QTimer myCoreClock; + thinbuttons *myButtonGroup; + list_pgn *listPGN; + IOMap myIOMap; + MatchMap myMatchMap; + match *currentMatch; +}; + +#endif diff --git a/knights/definitions.h b/knights/definitions.h new file mode 100644 index 0000000..858331d --- /dev/null +++ b/knights/definitions.h @@ -0,0 +1,292 @@ +/*************************************************************************** + definitions.h - description + ------------------- + begin : Sun Jul 1 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + + +#ifndef _DEFINITIONS_H +#define _DEFINITIONS_H + +#ifndef TRUE +# define TRUE 1 +# define FALSE 0 +#endif + +#ifndef _VERSION_ +# define _VERSION_ "0.6" +#endif + +#define IMAGE_MAX 144 +#define IMAGE_MIN 32 + +#define CONFIG_VERSION 1 + +#include +#include + +/* + These are used to define the game's states. +*/ +const int WHITE = 0x00; +const int BLACK = 0x01; +const int WHITE_HELPER = 0x02; +const int BLACK_HELPER = 0x03; +const int BOTH = 0x04; + +const int PLAYERPC = 0x00; // Chess Engine +const int PLAYEREMAIL = 0x01; // Email Opponent +const int PLAYERTCP = 0x02; // Internet Chess Engine +const int PLAYERLOAD = 0x03; // Load from PGN + + /* Add a mask of 0x10 to players that accept user input */ +const int PLAYERLOCAL = 0x10; // Human sitting at the PC +const int PLAYEREXAMINE = 0x11; // ICS Examine Mode + +const int ENGINE_WHITE = 0x01; +const int ENGINE_WHITE_BK = 0x02; +const int ENGINE_BLACK = 0x04; +const int ENGINE_BLACK_BK = 0x08; + + /* Menu Entries */ + +/* + These represent the various choices found + throughout the game's menubar. +*/ + +/* File Menu */ +const int MENU_NEWGAME = 0x01; +const int MENU_LOAD = 0x02; +const int MENU_SAVE = 0x03; +const int MENU_SAVEAS = 0x04; +const int MENU_PRINT = 0x05; +const int MENU_QUIT = 0x06; +const int MENU_CLOSE = 0x08; +const int MENU_CLOSEALL = 0x09; +const int MENU_CONNECT = 0x0A; +/* Options Menu */ +const int MENU_BINDINGS_DIALOG = 0x13; +const int MENU_SETTINGS_DIALOG = 0x14; +const int MENU_INSTALL_THEMES = 0x15; +/* New Games Menu */ +const int MENU_SOLITARE = 0x21; +const int MENU_VS_PC = 0x22; +const int MENU_VS_TCPIP = 0x23; +const int MENU_VS_EMAIL = 0x24; +const int MENU_PC_VS_PC = 0x25; +/* Match Menu */ +const int MENU_RETRACT = 0x31; +const int MENU_DRAW = 0x32; +const int MENU_MOVE_NOW = 0x33; +const int MENU_HINT = 0x34; +const int MENU_PONDER = 0x35; +const int MENU_PAUSE = 0x36; +const int MENU_PAUSEALL = 0x37; +const int MENU_ORIENTATION = 0x38; +const int MENU_RESIGN = 0x39; +const int MENU_CALL_FLAG = 0x3A; +/* Draw Menu */ +const int MENU_OFFER_DRAW = 0x41; +const int MENU_ACCEPT_DRAW = 0x42; +const int MENU_REJECT_DRAW = 0x43; +const int MENU_IGNORE_DRAW = 0x44; +/* Seek Menu */ +const int MENU_SEEK = 0x51; +const int MENU_FINGER = 0x52; +const int MENU_TELL = 0x53; +const int MENU_NOTIFY = 0x54; +const int MENU_ACCEPT_MATCH = 0x55; +const int MENU_CENSOR = 0x56; +const int MENU_HISTORY = 0x57; +const int MENU_ASSESS = 0x58; +/* View Menu */ +const int MENU_COPY = 0x61; +const int MENU_SELECT_ALL = 0x62; +const int MENU_CLEAR_ALL = 0x63; +const int MENU_FIND = 0x64; +const int MENU_FIND_NEXT = 0x65; +const int MENU_ZOOM_IN = 0x66; +const int MENU_ZOOM_OUT = 0x67; +/* Tutorial Menu */ +const int MENU_OPEN_TUTORIAL = 0x71; + + /* Messages */ + +/* + The following constants define messages + viewed in the statusbar. +*/ +const int READY = 0x00000000; +const int WHITE_TURN = 0x00000001; +const int BLACK_TURN = 0x00000002; +const int WHITE_WIN = 0x00000003; +const int BLACK_WIN = 0x00000004; +const int GAME_DRAW = 0x00000005; +const int GAME_50_MOVES = 0x00000006; +const int WAITING = 0x00000007; +const int ILLEGAL_MOVE = 0x00000008; +const int NO_MOVE_WHILE_REVIEW = 0x00000009; +const int LOAD_OK = 0x00000010; +const int SAVE_OK = 0x00000011; +const int PAUSED = 0x00000012; +const int READING_FILE = 0x00000013; +const int WHITE_DRAW_OFFER = 0x00000014; +const int BLACK_DRAW_OFFER = 0x00000015; +const int LOAD_ERROR = 0x00000020; +const int SAVE_ERROR = 0x00000021; +const int BOOK_ERROR_1 = 0x00000022; +const int BOOK_ERROR_2 = 0x00000023; +const int BOOK_ERROR_3 = 0x00000024; +const int BOOK_ERROR_4 = 0x00000025; +const int ENGINE_DIED_ERROR = 0x00000026; +const int WHITE_RESIGN = 0x00000027; +const int BLACK_RESIGN = 0x00000028; +const int WHITE_FLAG = 0x00000029; +const int BLACK_FLAG = 0x00000030; +const int WHITE_CALL_FLAG = 0x00000031; +const int BLACK_CALL_FLAG = 0x00000032; +const int WHITE_CHECKMATE = 0x00000033; +const int BLACK_CHECKMATE = 0x00000034; +const int LOST_CONTACT = 0x00000035; +const int COMMENT = 0x00010000; +const int ERROR = 0x00100000; + + /* Variations */ +/* + These define the variations on chess + that can be supported. +*/ + +const int Type_Standard = 0x00000001; +const int Type_WildCastle = 0x00000002; +const int Type_NoCastle = 0x00000004; +const int Type_FischerRandom = 0x00000008; +const int Type_BugHouse = 0x00000010; +const int Type_CrazyHouse = 0x00000020; +const int Type_Losers = 0x00000040; +const int Type_Suicide = 0x00000080; +const int Type_Giveaway = 0x00000100; +const int Type_TwoKings = 0x00000200; +const int Type_Atomic = 0x00000400; +const int Type_Kriegspiel = 0x00000800; +const int Type_ThreeCheck = 0x00001000; + + /* Protocols */ + +const int XBoard = 0x02; +const int UCI = 0x04; + + /* Events */ + +/* + These constants represent QEvent types. +*/ + +const int EVENT_Del_IO_Net = 0x000003e9; + + + /* Position Notes */ + +/* + These represent the various NOTES that can appear on a + given position +*/ + +const char NOTE_NONE = 0x00; +const char NOTE_HIGHLIGHT = 0x01; +const char NOTE_SELECT = 0x02; +const char NOTE_MOVE = 0x10; +const char NOTE_CASTLE = 0x11; +const char NOTE_PAWN_DOUBLE = 0x12; +const char NOTE_ATTACK = 0x20; +const char NOTE_ENPASSANT = 0x21; + + /* Chessmen */ + +/* + These represent the various chessmen, or Types of chessmen + found on the playing board. +*/ +const char Null = -1; +const char King = 0; +const char Queen = 1; +const char Bishop = 2; +const char Knight = 3; +const char Rook = 4; +const char Pawn = 5; + + /* ICS Game Modes */ + +const char ICS_Normal = 0; +const char ICS_Examine = 1; +const char ICS_Observe = 2; +const char ICS_Movelist = 3; + +typedef struct ThemeHeader +{ + QString name; + QString version; + QString author; + QString authorEmail; + QString authorWWW; + QString notes; +}; + +typedef struct ChessMove +{ + char fromFile; + char fromRank; + char toFile; + char toRank; + char Promote; + char ManTaken; + char SAN[8]; + char CAN[6]; +unsigned char NAG; + /* Following used for ICS Only */ + char ICS_Mode; + char ICS_PawnPushFile; + int ICS_MoveCounter; + bool ICS_OnMove; + bool ICS_ClockTicking; +}; + +typedef struct Chessman +{ + bool Army; + char Type; + char File; + char Rank; +}; + +typedef struct Position +{ + char File; + char Rank; + char ManPtr; + char Note; +}; + +/* Time Control Period */ +typedef struct TCP +{ + int Moves; + int Seconds; + int Increment; +}; + +typedef QValueList TCPList; + +#endif diff --git a/knights/dlg_challenge.cpp b/knights/dlg_challenge.cpp new file mode 100644 index 0000000..51a983f --- /dev/null +++ b/knights/dlg_challenge.cpp @@ -0,0 +1,159 @@ +/*************************************************************************** + dlg_challenge.cpp - description + ------------------- + begin : Sun Jan 20 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include "dlg_challenge.moc" + +dlg_challenge::dlg_challenge(QWidget *parent, const char *name, resource *Rsrc ) : + KDialogBase( parent, + name, + FALSE, + i18n("You've Been Challenged:"), + User1|User2, + Ok, + TRUE, + i18n("Accept"), + i18n("Decline") ) +{ + Resource = Rsrc; + + BOX_Parent = makeVBoxMainWidget(); + + LABEL_Headline = new QLabel( BOX_Parent ); + COMBO_Rated = new KComboBox( BOX_Parent ); + BOX_Time = new QHBox( BOX_Parent ); + BOX_White = new QGroupBox( 2, Qt::Horizontal, "-", BOX_Time ); + BOX_WhiteBase = new QSpinBox( BOX_White ); + LABEL_WhiteBase = new QLabel( BOX_White ); + BOX_WhiteInc = new QSpinBox( BOX_White ); + LABEL_WhiteInc = new QLabel( BOX_White ); + BOX_Black = new QGroupBox( 2, Qt::Horizontal, "-", BOX_Time ); + BOX_BlackBase = new QSpinBox( BOX_Black ); + LABEL_BlackBase = new QLabel( BOX_Black ); + BOX_BlackInc = new QSpinBox( BOX_Black ); + LABEL_BlackInc = new QLabel( BOX_Black ); + BUTTON_TimeOdds = new QCheckBox( i18n("Time Odds Match"),BOX_Parent ); + + LABEL_Headline->setAlignment( Qt::AlignCenter ); + COMBO_Rated->setEditable( FALSE ); + COMBO_Rated->insertItem( i18n("Unrated"), 0 ); + COMBO_Rated->insertItem( i18n("Rated"), 1 ); + + BOX_WhiteBase->setMinValue( 0 ); + BOX_WhiteInc->setMinValue( 0 ); + BOX_WhiteBase->setMaxValue( 300 ); + BOX_WhiteInc->setMaxValue( 300 ); + BOX_WhiteBase->setSuffix( i18n(" min.") ); + BOX_WhiteInc->setSuffix( i18n(" sec.") ); + LABEL_WhiteBase->setText( i18n( "Base Time" ) ); + LABEL_WhiteInc->setText( i18n( "Increment" ) ); + + BOX_BlackBase->setMinValue( 0 ); + BOX_BlackInc->setMinValue( 0 ); + BOX_BlackBase->setMaxValue( 300 ); + BOX_BlackInc->setMaxValue( 300 ); + BOX_BlackBase->setSuffix( i18n(" min.") ); + BOX_BlackInc->setSuffix( i18n(" sec.") ); + LABEL_BlackBase->setText( i18n( "Base Time" ) ); + LABEL_BlackInc->setText( i18n( "Increment" ) ); + + showButton( User1, TRUE ); + showButton( User2, TRUE ); + enableButton( User1, TRUE ); + enableButton( User2, TRUE ); + show(); +} + +dlg_challenge::~dlg_challenge() +{ +} + +void dlg_challenge::setValues( const QString &string, const QString &local ) +{ + /* we only need the first line, strip the rest */ + QString myString( string.section('\n', 0, 0) ); + QStringList list; + + /*remove all the white space between the rating brackets*/ + myString.replace( QRegExp("\\(\\s"), "(" ); + myString.replace( QRegExp("\\s\\)"), ")" ); + + list = QStringList::split( QChar(' '), myString, FALSE ); + list[7].replace(QRegExp("\\."), ""); + if( list[0] == local ) + { + localRating = list[1]; + otherPlayer = list[2]; + otherRating = list[3]; + } + else + { + otherPlayer = list[0]; + otherRating = list[1]; + localRating = list[3]; + } + LABEL_Headline->setText( i18n("%1 %2 vs. %3 %4\nin a %5 match.") + .arg(local).arg(localRating).arg(otherPlayer).arg(otherRating).arg(list[5]) ); + if( list[4].lower() == "rated" ) + { + COMBO_Rated->setCurrentItem(1); + } + else + { + COMBO_Rated->setCurrentItem(0); + } + BOX_WhiteBase->setValue( list[6].toInt() ); + BOX_WhiteInc->setValue( list[7].toInt() ); + BOX_BlackBase->setValue( list[6].toInt() ); + BOX_BlackInc->setValue( list[7].toInt() ); + BOX_White->setTitle( i18n("Time Controls") ); + BOX_Black->setTitle( i18n("Time Controls") ); +// BOX_Black->setEnabled( FALSE ); +// BUTTON_TimeOdds->setChecked( FALSE ); + + connect( COMBO_Rated, SIGNAL( activated(int) ), this, SLOT( slot_changed(int) ) ); + connect( BOX_WhiteBase, SIGNAL( valueChanged(int) ), this, SLOT( slot_changed(int) ) ); + connect( BOX_WhiteInc, SIGNAL( valueChanged(int) ), this, SLOT( slot_changed(int) ) ); + connect( BOX_BlackBase, SIGNAL( valueChanged(int) ), this, SLOT( slot_changed(int) ) ); + connect( BOX_BlackInc, SIGNAL( valueChanged(int) ), this, SLOT( slot_changed(int) ) ); + connect( BUTTON_TimeOdds, SIGNAL( stateChanged(int) ), this, SLOT( slot_changed(int) ) ); + connect( BUTTON_TimeOdds, SIGNAL( toggled(bool) ), this, SLOT( slot_timeOdds(bool) ) ); +} + +QString dlg_challenge::values( void ) +{ + QString match; + match = QString("match %1").arg(otherPlayer); + if( COMBO_Rated->currentItem() == 0 ) + match += " unrated"; + else + match += " rated"; + match += QString(" %1 %1").arg(BOX_WhiteBase->value()).arg(BOX_WhiteInc->value()); + if( BUTTON_TimeOdds->isChecked() ) + match += QString(" %1 %1").arg(BOX_BlackBase->value()).arg(BOX_BlackInc->value()); + return match; +} + +void dlg_challenge::slot_changed( int ) +{ + setButtonText( User1, i18n("Counter Offer") ); +} + +void dlg_challenge::slot_timeOdds( bool state ) +{ + BOX_Black->setEnabled( state ); +} diff --git a/knights/dlg_challenge.h b/knights/dlg_challenge.h new file mode 100644 index 0000000..2fbfb68 --- /dev/null +++ b/knights/dlg_challenge.h @@ -0,0 +1,69 @@ +/*************************************************************************** + dlg_challenge.h - description + ------------------- + begin : Sun Jan 20 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_CHALLENGE_H +#define DLG_CHALLENGE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ + +class dlg_challenge : public KDialogBase +{ + Q_OBJECT + public: + dlg_challenge(QWidget *parent=0, const char *name=0, resource *Rsrc=0); + ~dlg_challenge(); + void setValues( const QString&, const QString& ); + QString values( void ); + public slots: + void slot_changed( int ); + void slot_timeOdds( bool ); + private: + resource *Resource; + QString otherPlayer; + QString localRating; + QString otherRating; + + QVBox *BOX_Parent; + QLabel *LABEL_Headline; + KComboBox *COMBO_Rated; + QHBox *BOX_Time; + QGroupBox *BOX_White; + QSpinBox *BOX_WhiteBase; + QSpinBox *BOX_WhiteInc; + QLabel *LABEL_WhiteBase; + QLabel *LABEL_WhiteInc; + QGroupBox *BOX_Black; + QSpinBox *BOX_BlackBase; + QSpinBox *BOX_BlackInc; + QLabel *LABEL_BlackBase; + QLabel *LABEL_BlackInc; + QCheckBox *BUTTON_TimeOdds; +}; + +#endif diff --git a/knights/dlg_engine.cpp b/knights/dlg_engine.cpp new file mode 100644 index 0000000..c2f767e --- /dev/null +++ b/knights/dlg_engine.cpp @@ -0,0 +1,226 @@ +/*************************************************************************** + dlg_engine.cpp - description + ------------------- + begin : Wed Jul 18 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include "dlg_engine.moc" + +dlg_engine::dlg_engine(QWidget *parent, const char *name, resource *Rsrc, QString ItemName ) : + KDialogBase( parent, + name, + TRUE, + i18n("Configure Engine"), + Help|Ok|Apply|Cancel, + Ok, + TRUE ) +{ + Resource = Rsrc; + Name = ItemName; + + BOX_Parent = makeVBoxMainWidget(); + BOX_NameProto = new QHBox( BOX_Parent ); + BOX_Name = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Engine Name" ), + BOX_NameProto ); + EDIT_Name = new KLineEdit( BOX_Name ); + BOX_Protocol = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Protocol" ), + BOX_NameProto ); + EDIT_Protocol = new KComboBox( BOX_Protocol ); + BOX_Filename = new QGroupBox( 2, + Qt::Horizontal, + i18n( "Engine Filename" ), + BOX_Parent ); + EDIT_Filename = new KLineEdit( BOX_Filename ); + BUTTON_Filename = new QPushButton( BOX_Filename ); + BOX_Arguments = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Command Line Arguments" ), + BOX_Parent ); + EDIT_Arguments = new KLineEdit( BOX_Arguments ); + BOX_LogFile = new QGroupBox( 2, + Qt::Horizontal, + i18n( "Log File" ), + BOX_Parent ); + EDIT_LogFile = new KLineEdit( BOX_LogFile ); + BUTTON_LogFile = new QPushButton( BOX_LogFile ); + setMainWidget( BOX_Parent ); + BUTTON_Filename->setPixmap( Resource->LoadIcon( QString( "fileopen" ), KIcon::Toolbar ) ); + BUTTON_LogFile->setPixmap( Resource->LoadIcon( QString( "fileopen" ), KIcon::Toolbar ) ); + EDIT_Name->setMinimumWidth( 150 ); + EDIT_Filename->setMinimumWidth( 300 ); + EDIT_Arguments->setMinimumWidth( 300 ); + /* Protocol ComboBox */ + EDIT_Protocol->insertItem( QString( "XBoard" ) ); + EDIT_Protocol->insertItem( QString( "UCI" ) ); + EDIT_Protocol->setEditable( FALSE ); + /* Load in data if this is a modification */ + if( !Name.isEmpty() ) + { + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).Name == Name ) break; + } + EDIT_Name->setText( (*enginesIT).Name ); + EDIT_Filename->setText( (*enginesIT).Filename ); + EDIT_Arguments->setText( (*enginesIT).Arguments ); + EDIT_LogFile->setText( (*enginesIT).LogFile ); + switch( (*enginesIT).Protocol ) + { + case XBoard: + EDIT_Protocol->setCurrentItem(0); + break; + case UCI: + EDIT_Protocol->setCurrentItem(1); + break; + default: + break; + } + } + /* Init the buttons */ + showButtonCancel( TRUE ); + showButtonOK( TRUE ); + showButtonApply( TRUE ); + showButton( Help, TRUE ); + + enableButtonCancel( TRUE ); + enableButtonOK( TRUE ); + enableButtonApply( FALSE ); + enableButton( Help, TRUE ); + + setHelp( QString( "configure-engines" ) ); + /* Make Connections */ + connect( BUTTON_Filename, SIGNAL( clicked() ), this, SLOT( slotFilenameDialog() ) ); + connect( BUTTON_LogFile, SIGNAL( clicked() ), this, SLOT( slotLogFileDialog() ) ); + connect( EDIT_Protocol, SIGNAL( activated(int) ), this, SLOT( slotProtocol(int) ) ); + show(); +} +/////////////////////////////////////// +// +// dlg_engine::~dlg_engine +// +/////////////////////////////////////// +dlg_engine::~dlg_engine() +{ +} +/////////////////////////////////////// +// +// dlg_engine::slotOk +// +/////////////////////////////////////// +void dlg_engine::slotOk( void ) +{ + slotApply(); + slotDelayedDestruct(); +} +/////////////////////////////////////// +// +// dlg_engine::slotApply +// +/////////////////////////////////////// +void dlg_engine::slotApply( void ) +{ + engineResource newEngine; + + if( Name.isEmpty() ) + { + enginesIT = Resource->engines.append( newEngine ); + Name = "notemptyanymore"; + (*enginesIT).Wins = 0; + (*enginesIT).Losses = 0; + (*enginesIT).Draws = 0; + (*enginesIT).CurrentRef = 0; + } + (*enginesIT).Name = EDIT_Name->text(); + (*enginesIT).Filename = EDIT_Filename->text(); + (*enginesIT).Arguments = EDIT_Arguments->text(); + (*enginesIT).LogFile = EDIT_LogFile->text(); + switch( EDIT_Protocol->currentItem() ) + { + case 0: + (*enginesIT).Protocol = XBoard; + break; + case 1: + (*enginesIT).Protocol = UCI; + break; + default: + break; + } + enableButtonApply( FALSE ); +} +/////////////////////////////////////// +// +// dlg_engine::slotCancel +// +/////////////////////////////////////// +void dlg_engine::slotCancel( void ) +{ + slotDelayedDestruct(); +} +/////////////////////////////////////// +// +// dlg_engine::slotFilenameDialog +// +/////////////////////////////////////// +void dlg_engine::slotFilenameDialog( void ) +{ + QString temp; + int tmp; + + temp = KFileDialog::getOpenFileName( QString::null, + QString( "*" ), + this, + QString( "Find Engine..." ) ); + if( temp.isEmpty() ) return; + EDIT_Filename->setText( temp ); + if( EDIT_Name->text().isEmpty() ) + { + tmp = temp.findRev( '/' ); + EDIT_Name->setText( temp.remove( 0, tmp + 1 ) ); + } + enableButtonApply( TRUE ); +} +/////////////////////////////////////// +// +// dlg_engine::slotLogFileDialog +// +/////////////////////////////////////// +void dlg_engine::slotLogFileDialog( void ) +{ + QString temp; + + temp = KFileDialog::getOpenFileName( QString::null, + QString( "*" ), + this, + QString( "Find Log..." ) ); + if( temp.isEmpty() ) return; + EDIT_LogFile->setText( temp ); + enableButtonApply( TRUE ); +} +/////////////////////////////////////// +// +// dlg_engine::slotProtocol +// +/////////////////////////////////////// +void dlg_engine::slotProtocol( int Index ) +{ + if(Index); // No-op to stop compile warning. + enableButtonApply( TRUE ); +} + diff --git a/knights/dlg_engine.h b/knights/dlg_engine.h new file mode 100644 index 0000000..0bd13af --- /dev/null +++ b/knights/dlg_engine.h @@ -0,0 +1,77 @@ +/*************************************************************************** + dlg_engine.h - description + ------------------- + begin : Wed Jul 18 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_ENGINE_H +#define DLG_ENGINE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "definitions.h" +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ + +class dlg_engine : public KDialogBase +{ + Q_OBJECT + public: + dlg_engine(QWidget *parent=0, const char *name=0, resource *Rsrc=0, QString ItemName="" ); + ~dlg_engine(); + + public slots: + void slotOk( void ); + void slotApply( void ); + void slotCancel( void ); + void slotFilenameDialog( void ); + void slotLogFileDialog( void ); + void slotProtocol( int Index ); + + private: + engineList::Iterator enginesIT; + resource *Resource; + QString Name; + + QVBox *BOX_Parent; + QHBox *BOX_NameProto; + + QGroupBox *BOX_Name; + KLineEdit *EDIT_Name; + + QGroupBox *BOX_Protocol; + KComboBox *EDIT_Protocol; + + QGroupBox *BOX_Filename; + KLineEdit *EDIT_Filename; + QPushButton *BUTTON_Filename; + + QGroupBox *BOX_LogFile; + KLineEdit *EDIT_LogFile; + QPushButton *BUTTON_LogFile; + + QGroupBox *BOX_Arguments; + KLineEdit *EDIT_Arguments; +}; + +#endif diff --git a/knights/dlg_login.cpp b/knights/dlg_login.cpp new file mode 100644 index 0000000..103ff91 --- /dev/null +++ b/knights/dlg_login.cpp @@ -0,0 +1,161 @@ +/*************************************************************************** + dlg_login.cpp - description + ------------------- + begin : Sat Sep 29 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "dlg_login.moc" + +dlg_login::dlg_login(QWidget *parent, const char *name, resource *rsrc) : + KDialogBase(parent, name, TRUE, i18n("Login Prompt"), Help|Ok|Cancel, Ok,TRUE ) +{ + serverList::Iterator i; + serverList::Iterator currentServer; + int counter = 0; + + myResource = rsrc; + + BOX_Parent = makeVBoxMainWidget(); + + /* Select which server to connect to */ + GROUP_Select_Server = new QGroupBox( 1, Qt::Vertical, i18n( "Select Server" ), BOX_Parent ); + + COMBO_Select_Server = new KComboBox ( GROUP_Select_Server ); + COMBO_Select_Server->setEditable( FALSE ); + + /* fill the combobox with servers */ + for(i = myResource->servers.begin(); i != myResource->servers.end(); i++) + { + COMBO_Select_Server->insertItem((*i).Name); + if((*i).CurrentRef == TRUE) + { + COMBO_Select_Server->setCurrentItem(counter); + currentServer = i; + } + counter++; + } + /* connect to right signal to the combobox */ + connect( COMBO_Select_Server, SIGNAL( activated(const QString &) ), this, SLOT( slotUpdateUser(const QString &) ) ); + + GROUP_Username = new QGroupBox( 1, Qt::Horizontal, i18n("User info"), BOX_Parent); + BOX_ALIGN = new QHBox( GROUP_Username ); + BOX_TEXT = new QVBox( BOX_ALIGN ); + TEXT_Login = new QLabel( BOX_TEXT ); + TEXT_Password = new QLabel( BOX_TEXT ); + + TEXT_Login->setText( i18n("Login:") ); + TEXT_Password->setText( i18n("Password:") ); + + BOX_EDIT = new QVBox( BOX_ALIGN ); + EDIT_Login = new KLineEdit( BOX_EDIT ); + EDIT_Password = new KLineEdit( BOX_EDIT ); + + CHECKBOX_GUEST = new QCheckBox(i18n("Log in as guest"), GROUP_Username); + + EDIT_Password->setEchoMode( QLineEdit::Password ); + + connect(CHECKBOX_GUEST, SIGNAL(toggled(bool)), this, SLOT(slotGuestToggle(bool))); + + /* Init the buttons */ + showButtonCancel( TRUE ); + showButtonOK( TRUE ); + showButton( Help, TRUE ); + + enableButtonCancel( TRUE ); + enableButtonOK( TRUE ); + enableButton( Help, TRUE ); + setButtonOKText( i18n("Login"), i18n("Log in to the chess server using this name and password.") ); + setButtonCancelText( i18n("Cancel"), i18n("Abort logging into the server") ); + setHelp("prefs"); + disableResize(); + show(); + /* make sure the username for the default server is displayed */ + slotUpdateUser((*currentServer).Name); +} +/////////////////////////////////////// +// +// dlg_login::~dlg_login +// +/////////////////////////////////////// +dlg_login::~dlg_login() +{ +} +/////////////////////////////////////// +// +// dlg_login::slotOk +// +/////////////////////////////////////// +void dlg_login::slotOk( void ) +{ + if(BOX_ALIGN->isEnabled()) + { + emit login(EDIT_Login->text(), EDIT_Password->text()); + } + else + { + emit login("guest", ""); + } + emit okClicked(); + slotDelayedDestruct(); +} + +/////////////////////////////////////// +// +// dlg_login::slotGuestToggle +// +/////////////////////////////////////// +void dlg_login::slotGuestToggle( bool on ) +{ + BOX_ALIGN->setEnabled(!on); +} + +/////////////////////////////////////// +// +// dlg_login::slotUpdateUser +// +/////////////////////////////////////// +void dlg_login::slotUpdateUser(const QString &name) +{ + /* this function retrieves the correct serverResource from + the resources and uses that to fill in the username and + password fields */ + serverList::Iterator i; + + for(i = myResource->servers.begin(); i != myResource->servers.end(); i++) + { + if((*i).CurrentRef) + { + (*i).CurrentRef = FALSE; + } + if((*i).Name == name ) + { + (*i).CurrentRef = TRUE; + EDIT_Login->setText((*i).UserName); + EDIT_Password->setText((*i).Password); + server = &(*i); + } + } +} + +/////////////////////////////////////// +// +// dlg_login::slotUpdateUser +// +/////////////////////////////////////// +void dlg_login::disableServerSelect() +{ + COMBO_Select_Server->setEnabled(false); +} + + diff --git a/knights/dlg_login.h b/knights/dlg_login.h new file mode 100644 index 0000000..1c02f18 --- /dev/null +++ b/knights/dlg_login.h @@ -0,0 +1,73 @@ +/*************************************************************************** + dlg_login.h - description + ------------------- + begin : Sat Sep 29 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_LOGIN_H +#define DLG_LOGIN_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "resource.h" + +/** + *@author Troy Corbin Jr. / Alexander Wels + */ + +class dlg_login : public KDialogBase +{ + Q_OBJECT + + public: + dlg_login(QWidget *parent, const char *name=0, resource *rsrc = NULL); + ~dlg_login(); + void disableServerSelect(); + + public slots: + void slotOk( void ); + void slotGuestToggle( bool ); + void slotUpdateUser(const QString&); + + signals: + void login(QString userName, QString passWord); + + private: + QVBox *BOX_Parent; + QVBox *BOX_TEXT; + QVBox *BOX_EDIT; + QHBox *BOX_ALIGN; + KLineEdit *EDIT_Login; + KLineEdit *EDIT_Password; + QLabel *TEXT_Login; + QLabel *TEXT_Password; + QCheckBox *CHECKBOX_GUEST; + QGroupBox *GROUP_Select_Server; + QGroupBox *GROUP_Username; + KComboBox *COMBO_Select_Server; + + resource *myResource; + struct serverResource *server; +}; + +#endif diff --git a/knights/dlg_newmatch.cpp b/knights/dlg_newmatch.cpp new file mode 100644 index 0000000..ff85497 --- /dev/null +++ b/knights/dlg_newmatch.cpp @@ -0,0 +1,385 @@ +/*************************************************************************** + dlg_newmatch.cpp - description + ------------------- + begin : Tue Jun 25 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "dlg_newmatch.moc" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "dlg_selectengine.h" +#include "dlg_selectemail.h" + +#define _TYPE_HUMAN_ 0 +#define _TYPE_PC_ 1 +#define _TYPE_EMAIL_ 2 + +dlg_newmatch::dlg_newmatch(QWidget *parent, const char *name, resource *Rsrc ) : +KDialogBase(parent, name, TRUE, i18n("Start a New Match"), Cancel|Ok|Help, Ok, TRUE ) +{ + myResource = Rsrc; + Param = new match_param( myResource ); + BOX_Parent = makeHBoxMainWidget(); + BOX_Players = new QVBox( BOX_Parent ); + + BOX_White = new QGroupBox(3, Qt::Horizontal, i18n("White"), BOX_Players ); + BOX_Black = new QGroupBox(3, Qt::Horizontal, i18n("Black"), BOX_Players ); + + IMAGE_White = new QLabel( BOX_White ); + IMAGE_Black = new QLabel( BOX_Black ); + + BOX_White_Detail = new QVBox( BOX_White ); + BOX_Black_Detail = new QVBox( BOX_Black ); + + LABEL_White_Name = new QLabel( BOX_White_Detail ); + LABEL_Black_Name = new QLabel( BOX_Black_Detail ); + + GROUP_White_Type = new QButtonGroup( 3, Qt::Vertical, BOX_White_Detail ); + GROUP_White_Type->setExclusive( TRUE ); + RADIO_White_Human = new QRadioButton( i18n("Human"), GROUP_White_Type ); + RADIO_White_PC = new QRadioButton( i18n("Computer"), GROUP_White_Type ); + RADIO_White_Email = new QRadioButton( i18n("Email"), GROUP_White_Type ); + connect( GROUP_White_Type, SIGNAL( clicked(int)), this, SLOT( slotWhiteType(int))); + + GROUP_Black_Type = new QButtonGroup( 3, Qt::Vertical, BOX_Black_Detail ); + GROUP_Black_Type->setExclusive( TRUE ); + RADIO_Black_Human = new QRadioButton( i18n("Human"), GROUP_Black_Type ); + RADIO_Black_PC = new QRadioButton( i18n("Computer"), GROUP_Black_Type ); + RADIO_Black_Email = new QRadioButton( i18n("Email"), GROUP_Black_Type ); + connect( GROUP_Black_Type, SIGNAL( clicked(int)), this, SLOT( slotBlackType(int))); + + /* Disable Unconfigured Types */ + if( !myResource->engines.count() ) + { + RADIO_White_PC->setEnabled( FALSE ); + RADIO_Black_PC->setEnabled( FALSE ); + } + if( 1 ) + { + RADIO_White_Email->setEnabled( FALSE ); + RADIO_Black_Email->setEnabled( FALSE ); + } + + /* Time for White */ + GRID_White_Time = new QGrid( 2, Qt::Horizontal, BOX_White ); + LABEL_White_Base = new QLabel( i18n("Base Time:"), GRID_White_Time ); + SPIN_White_Base = new QSpinBox( 0, 120, 1, GRID_White_Time ); + SPIN_White_Base->setSuffix( i18n(" min.") ); + connect( SPIN_White_Base, SIGNAL( valueChanged(int)), this, SLOT( slotWhiteBase(int))); + + LABEL_White_Moves = new QLabel( i18n("Moves Per Base Time"), GRID_White_Time ); + SPIN_White_Moves = new QSpinBox( 0, 100, 5, GRID_White_Time ); + SPIN_White_Moves->setSuffix( i18n(" moves") ); + connect( SPIN_White_Moves, SIGNAL( valueChanged(int)), this, SLOT( slotWhiteMoves(int))); + + LABEL_White_Inc = new QLabel( i18n("Increment Per Move"), GRID_White_Time ); + SPIN_White_Inc = new QSpinBox( 0, 120, 1, GRID_White_Time ); + SPIN_White_Inc->setSuffix( i18n(" sec.") ); + connect( SPIN_White_Inc, SIGNAL( valueChanged(int)), this, SLOT( slotWhiteInc(int))); + + /* Time for Black */ + GRID_Black_Time = new QGrid( 2, Qt::Horizontal, BOX_Black ); + LABEL_Black_Base = new QLabel( i18n("Base Time:"), GRID_Black_Time ); + SPIN_Black_Base = new QSpinBox( 0, 120, 1, GRID_Black_Time ); + SPIN_Black_Base->setSuffix( i18n(" min.") ); + connect( SPIN_Black_Base, SIGNAL( valueChanged(int)), this, SLOT( slotBlackBase(int))); + + LABEL_Black_Moves = new QLabel( i18n("Moves Per Base Time"), GRID_Black_Time ); + SPIN_Black_Moves = new QSpinBox( 0, 100, 5, GRID_Black_Time ); + SPIN_Black_Moves->setSuffix( i18n(" moves") ); + connect( SPIN_Black_Moves, SIGNAL( valueChanged(int)), this, SLOT( slotBlackMoves(int))); + + LABEL_Black_Inc = new QLabel( i18n("Increment Per Move"), GRID_Black_Time ); + SPIN_Black_Inc = new QSpinBox( 0, 120, 1, GRID_Black_Time ); + SPIN_Black_Inc->setSuffix( i18n(" sec.") ); + connect( SPIN_Black_Inc, SIGNAL( valueChanged(int)), this, SLOT( slotBlackInc(int))); + + setTCP(); + setTypes(); + setNames(); + setImages(); + setHelp( QString( "new-match-dialog" ) ); +} + +dlg_newmatch::~dlg_newmatch() +{ +} + +/////////////////////////////////////// +// +// dlg_newmatch::setTCP +// +/////////////////////////////////////// +void dlg_newmatch::setTCP( void ) +{ + TCPList tmpList( Param->time(WHITE) ); + TCP tmpTCP = tmpList[0]; + + SPIN_White_Base->setValue( tmpTCP.Seconds / 60 ); + SPIN_White_Moves->setValue( tmpTCP.Moves ); + SPIN_White_Inc->setValue( tmpTCP.Increment ); + + tmpList = Param->time(BLACK); + tmpTCP = tmpList[0]; + + SPIN_Black_Base->setValue( tmpTCP.Seconds / 60 ); + SPIN_Black_Moves->setValue( tmpTCP.Moves ); + SPIN_Black_Inc->setValue( tmpTCP.Increment ); +} +/////////////////////////////////////// +// +// dlg_newmatch::setTypes +// +/////////////////////////////////////// +void dlg_newmatch::setTypes( void ) +{ + switch( Param->type(WHITE) ) + { + case PLAYERPC: + GROUP_White_Type->setButton( _TYPE_PC_ ); + break; + case PLAYEREMAIL: + GROUP_White_Type->setButton( _TYPE_EMAIL_ ); + break; + case PLAYERLOCAL: + default: + GROUP_White_Type->setButton( _TYPE_HUMAN_ ); + slotWhiteType( _TYPE_HUMAN_ ); + break; + } + if( GROUP_White_Type->selected() != _TYPE_HUMAN_ ) + { + if( !GROUP_White_Type->selected()->isEnabled() ) + { + GROUP_White_Type->setButton( _TYPE_HUMAN_ ); + slotWhiteType( _TYPE_HUMAN_ ); + } + } + else + { + Param->setType( WHITE, PLAYERLOCAL ); + GROUP_White_Type->setButton( _TYPE_HUMAN_ ); + } + + switch( Param->type(BLACK) ) + { + case PLAYERPC: + GROUP_Black_Type->setButton( _TYPE_PC_ ); + break; + case PLAYEREMAIL: + GROUP_Black_Type->setButton( _TYPE_EMAIL_ ); + break; + case PLAYERLOCAL: + default: + GROUP_Black_Type->setButton( _TYPE_HUMAN_ ); + slotBlackType( _TYPE_HUMAN_ ); + break; + } + if( GROUP_Black_Type->selected() != _TYPE_HUMAN_ ) + { + if( !GROUP_Black_Type->selected()->isEnabled() ) + { + GROUP_Black_Type->setButton( _TYPE_HUMAN_ ); + slotBlackType( _TYPE_HUMAN_ ); + } + } + else + { + Param->setType( BLACK, PLAYERLOCAL ); + GROUP_Black_Type->setButton( _TYPE_HUMAN_ ); + } +} + +/////////////////////////////////////// +// +// dlg_newmatch::setImages +// +/////////////////////////////////////// +void dlg_newmatch::setImages( void ) +{ + IMAGE_White->setPixmap( Param->image( WHITE ) ); + IMAGE_Black->setPixmap( Param->image( BLACK ) ); +} + +/////////////////////////////////////// +// +// dlg_newmatch::setNames +// +/////////////////////////////////////// +void dlg_newmatch::setNames( void ) +{ + LABEL_White_Name->setText( Param->name( WHITE ) ); + LABEL_Black_Name->setText( Param->name( BLACK ) ); +} + +/////////////////////////////////////// +// +// dlg_newmatch::slotWhiteType +// +/////////////////////////////////////// +void dlg_newmatch::slotWhiteType( int type ) +{ + if( type == _TYPE_PC_ ) + { + EngineSelect = new dlg_selectengine( this, myResource, WHITE ); + connect( EngineSelect, SIGNAL( valuesChanged() ), this, SLOT( slotReparse() ) ); + EngineSelect->exec(); + Param->setType( WHITE, PLAYERPC ); + } + else if( type == _TYPE_EMAIL_ ) + { + EmailSelect = new dlg_selectemail( this, myResource ); + connect( EmailSelect, SIGNAL( valuesChanged() ), this, SLOT( slotReparse() ) ); + EmailSelect->exec(); + Param->setType( WHITE, PLAYEREMAIL ); + } + else + { + Param->setType( WHITE, PLAYERLOCAL ); + } + setNames(); + setImages(); +} + +/////////////////////////////////////// +// +// dlg_newmatch::slotWhiteBase +// +/////////////////////////////////////// +void dlg_newmatch::slotWhiteBase( int time ) +{ + TCPList tmpList( Param->time(WHITE) ); + TCP tmpTCP = tmpList[0]; + tmpTCP.Seconds = time * 60; + tmpList[0] = tmpTCP; + Param->setTime( WHITE, tmpList ); +} + +/////////////////////////////////////// +// +// dlg_newmatch::slotWhiteMoves +// +/////////////////////////////////////// +void dlg_newmatch::slotWhiteMoves( int time ) +{ + TCPList tmpList( Param->time(WHITE) ); + TCP tmpTCP = tmpList[0]; + tmpTCP.Moves = time; + tmpList[0] = tmpTCP; + Param->setTime( WHITE, tmpList ); +} + +/////////////////////////////////////// +// +// dlg_newmatch::slotWhiteInc +// +/////////////////////////////////////// +void dlg_newmatch::slotWhiteInc( int time ) +{ + TCPList tmpList( Param->time(WHITE) ); + TCP tmpTCP = tmpList[0]; + tmpTCP.Increment = time; + tmpList[0] = tmpTCP; + Param->setTime( WHITE, tmpList ); +} + +/////////////////////////////////////// +// +// dlg_newmatch::slotBlackType +// +/////////////////////////////////////// +void dlg_newmatch::slotBlackType( int type ) +{ + if( type == _TYPE_PC_ ) + { + EngineSelect = new dlg_selectengine( this, myResource, BLACK ); + connect( EngineSelect, SIGNAL( valuesChanged() ), this, SLOT( slotReparse() ) ); + EngineSelect->exec(); + Param->setType( BLACK, PLAYERPC ); + } + else if( type == _TYPE_EMAIL_ ) + { + EmailSelect = new dlg_selectemail( this, myResource ); + connect( EmailSelect, SIGNAL( valuesChanged() ), this, SLOT( slotReparse() ) ); + EmailSelect->exec(); + Param->setType( BLACK, PLAYEREMAIL ); + } + else + { + Param->setType( BLACK, PLAYERLOCAL ); + } + setNames(); + setImages(); +} + +/////////////////////////////////////// +// +// dlg_newmatch::slotBlackBase +// +/////////////////////////////////////// +void dlg_newmatch::slotBlackBase( int time ) +{ + TCPList tmpList( Param->time(BLACK) ); + TCP tmpTCP = tmpList[0]; + tmpTCP.Seconds = time * 60; + tmpList[0] = tmpTCP; + Param->setTime( BLACK, tmpList ); +} +/////////////////////////////////////// +// +// dlg_newmatch::slotBlackMoves +// +/////////////////////////////////////// +void dlg_newmatch::slotBlackMoves( int time ) +{ + TCPList tmpList( Param->time(BLACK) ); + TCP tmpTCP = tmpList[0]; + tmpTCP.Moves = time; + tmpList[0] = tmpTCP; + Param->setTime( BLACK, tmpList ); +} +/////////////////////////////////////// +// +// dlg_newmatch::slotBlackInc +// +/////////////////////////////////////// +void dlg_newmatch::slotBlackInc( int time ) +{ + TCPList tmpList( Param->time(BLACK) ); + TCP tmpTCP = tmpList[0]; + tmpTCP.Increment = time; + tmpList[0] = tmpTCP; + Param->setTime( BLACK, tmpList ); +} +/////////////////////////////////////// +// +// dlg_newmatch::slotReparse +// +/////////////////////////////////////// +void dlg_newmatch::slotReparse( void ) +{ + setNames(); + setImages(); + Param->setStrength( WHITE, myResource->Strength[WHITE] ); + Param->setStrength( BLACK, myResource->Strength[BLACK] ); +} diff --git a/knights/dlg_newmatch.h b/knights/dlg_newmatch.h new file mode 100644 index 0000000..82b5e57 --- /dev/null +++ b/knights/dlg_newmatch.h @@ -0,0 +1,110 @@ +/*************************************************************************** + dlg_newmatch.h - description + ------------------- + begin : Tue Jun 25 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_NEWMATCH_H +#define DLG_NEWMATCH_H + +#include +#include + +#include "match_param.h" + +/** + *@author Troy Corbin Jr. + */ + +class dlg_selectengine; +class dlg_selectemail; +class resource; +class QLabel; +class QSpinBox; +class QRadioButton; +class QCheckBox; +class QVBox; +class QHBox; +class QGrid; +class QButtonGroup; +class QGroupBox; +class KComboBox; + +class dlg_newmatch : public KDialogBase +{ + Q_OBJECT + private: + resource *myResource; + match_param *Param; + dlg_selectengine *EngineSelect; + dlg_selectemail *EmailSelect; + + QHBox *BOX_Parent; + QVBox *BOX_Players; + QGroupBox *BOX_White; + QLabel *IMAGE_White; + QVBox *BOX_White_Detail; + QLabel *LABEL_White_Name; + QButtonGroup *GROUP_White_Type; + QRadioButton *RADIO_White_Human; + QRadioButton *RADIO_White_PC; + QRadioButton *RADIO_White_Email; + QGrid *GRID_White_Time; + QLabel *LABEL_White_Base; + QSpinBox *SPIN_White_Base; + QLabel *LABEL_White_Inc; + QSpinBox *SPIN_White_Inc; + QLabel *LABEL_White_Moves; + QSpinBox *SPIN_White_Moves; + QGroupBox *BOX_Black; + QLabel *IMAGE_Black; + QVBox *BOX_Black_Detail; + QLabel *LABEL_Black_Name; + QButtonGroup *GROUP_Black_Type; + QRadioButton *RADIO_Black_Human; + QRadioButton *RADIO_Black_PC; + QRadioButton *RADIO_Black_Email; + QGrid *GRID_Black_Time; + QLabel *LABEL_Black_Base; + QSpinBox *SPIN_Black_Base; + QLabel *LABEL_Black_Inc; + QSpinBox *SPIN_Black_Inc; + QLabel *LABEL_Black_Moves; + QSpinBox *SPIN_Black_Moves; + + public: + dlg_newmatch(QWidget *parent=0, const char *name=0, resource *Rsrc=0); + ~dlg_newmatch(); + match_param* paramaters( void ) { return Param; } + protected slots: + void slotWhiteType( int ); + void slotWhiteBase( int ); + void slotWhiteMoves( int ); + void slotWhiteInc( int ); + + void slotBlackType( int ); + void slotBlackBase( int ); + void slotBlackMoves( int ); + void slotBlackInc( int ); + + void slotReparse( void ); + + protected: + void setTCP( void ); + void setTypes( void ); + void setImages( void ); + void setNames( void ); +}; + +#endif diff --git a/knights/dlg_promote.cpp b/knights/dlg_promote.cpp new file mode 100644 index 0000000..d98ad83 --- /dev/null +++ b/knights/dlg_promote.cpp @@ -0,0 +1,123 @@ +/*************************************************************************** + dlg_promote.cpp - description + ------------------- + begin : Fri Jul 13 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "definitions.h" +#include "dlg_promote.moc" +#include "knightspixcache.h" +#include + +dlg_promote::dlg_promote(QWidget *parent, const char *name, resource *Rsrc ) : + QDialog( parent, name, TRUE, Qt::WStyle_Customize | Qt::WStyle_DialogBorder ) +{ + Resource = Rsrc; + Queen = new QPushButton( this ); + Bishop = new QPushButton( this ); + Knight = new QPushButton( this ); + Rook = new QPushButton( this ); + Description = new QLabel( this ); +} + +dlg_promote::~dlg_promote() +{ + delete Queen; + delete Bishop; + delete Knight; + delete Rook; + delete Description; +} + +void dlg_promote::Init( bool Army ) +{ + KnightsPixCache *cache = Resource->pixCache; + QImage tempImage; + QPixmap buffer; + int margin; + + margin = 2; + buffer.resize( Resource->ThemeSize, Resource->ThemeSize ); + Description->setFixedSize( Resource->ThemeSize * 2 , 20 ); + Queen->setFixedSize( Resource->ThemeSize, Resource->ThemeSize ); + Bishop->setFixedSize( Resource->ThemeSize, Resource->ThemeSize ); + Knight->setFixedSize( Resource->ThemeSize, Resource->ThemeSize ); + Rook->setFixedSize( Resource->ThemeSize, Resource->ThemeSize ); + setFixedSize( ( margin * 4 ) + ( Resource->ThemeSize * 2 ), + ( margin * 6 ) + ( Resource->ThemeSize * 2 ) + 20 ); + + Description->move( margin, margin ); + Queen->move( margin, ( margin * 3 ) + 20 ); + Bishop->move( ( margin * 3 ) + Resource->ThemeSize, ( margin * 3 ) + 20 ); + Knight->move( margin, ( margin * 5 ) + 20 + Resource->ThemeSize ); + Rook->move( ( margin * 3 ) + Resource->ThemeSize, ( margin * 5 ) + 20 + Resource->ThemeSize ); + + /* Queen */ + buffer = cache->SquareLight; + if( Army == WHITE ) bitBlt( &buffer, 0, 0, &cache->WhiteQueen, 0, 0, -1, -1, Qt::CopyROP, FALSE); + else bitBlt( &buffer, 0, 0, &cache->BlackQueen, 0, 0, -1, -1, Qt::CopyROP, FALSE); + Queen->setPixmap( buffer ); + Queen->show(); + + /* Bishop */ + buffer = cache->SquareDark; + if( Army == WHITE ) bitBlt( &buffer, 0, 0, &cache->WhiteBishop, 0, 0, -1, -1, Qt::CopyROP, FALSE); + else bitBlt( &buffer, 0, 0, &cache->BlackBishop, 0, 0, -1, -1, Qt::CopyROP, FALSE); + Bishop->setPixmap( buffer ); + Bishop->show(); + + /* Knight */ + buffer = cache->SquareDark; + if( Army == WHITE ) bitBlt( &buffer, 0, 0, &cache->WhiteKnight, 0, 0, -1, -1, Qt::CopyROP, FALSE); + else bitBlt( &buffer, 0, 0, &cache->BlackKnight, 0, 0, -1, -1, Qt::CopyROP, FALSE); + Knight->setPixmap( buffer ); + Knight->show(); + + /* Rook */ + buffer = cache->SquareLight; + if( Army == WHITE ) bitBlt( &buffer, 0, 0, &cache->WhiteRook, 0, 0, -1, -1, Qt::CopyROP, FALSE); + else bitBlt( &buffer, 0, 0, &cache->BlackRook, 0, 0, -1, -1, Qt::CopyROP, FALSE); + Rook->setPixmap( buffer ); + Rook->show(); + + Description->setText( i18n( "Promote your pawn to..." ) ); + Description->show(); + connect( Queen, SIGNAL( clicked() ), this, SLOT( queenClick() ) ); + connect( Bishop, SIGNAL( clicked() ), this, SLOT( bishopClick() ) ); + connect( Knight, SIGNAL( clicked() ), this, SLOT( knightClick() ) ); + connect( Rook, SIGNAL( clicked() ), this, SLOT( rookClick() ) ); + Queen->setFocus(); + setCaption( i18n( "Pawn Promotion" ) ); +} + +void dlg_promote::queenClick( void ) +{ + done( 'q' ); +} + +void dlg_promote::bishopClick( void ) +{ + done( 'b' ); +} + +void dlg_promote::knightClick( void ) +{ + done( 'n' ); +} + +void dlg_promote::rookClick( void ) +{ + done( 'r' ); +} + diff --git a/knights/dlg_promote.h b/knights/dlg_promote.h new file mode 100644 index 0000000..0eb117e --- /dev/null +++ b/knights/dlg_promote.h @@ -0,0 +1,58 @@ +/*************************************************************************** + dlg_promote.h - description + ------------------- + begin : Fri Jul 13 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_PROMOTE_H +#define DLG_PROMOTE_H + +#include +#include +#include +#include +#include +#include +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ + +class dlg_promote : public QDialog +{ + Q_OBJECT + public: + + dlg_promote(QWidget *parent=0, const char *name=0, resource *Rsrc=0 ); + ~dlg_promote(); + + void Init( bool Army ); + + public slots: + void queenClick( void ); + void bishopClick( void ); + void knightClick( void ); + void rookClick( void ); + + private: + resource *Resource; + QLabel *Description; + QPushButton *Queen; + QPushButton *Bishop; + QPushButton *Knight; + QPushButton *Rook; +}; + +#endif diff --git a/knights/dlg_selectemail.cpp b/knights/dlg_selectemail.cpp new file mode 100644 index 0000000..5c7b583 --- /dev/null +++ b/knights/dlg_selectemail.cpp @@ -0,0 +1,46 @@ +/*************************************************************************** + dlg_selectemail.cpp - description + ------------------- + begin : Sun Oct 27 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "dlg_selectemail.moc" +#include +#include +#include "resource.h" + +dlg_selectemail::dlg_selectemail(QWidget *parent, resource *Rsrc ) : + KDialogBase( parent, + 0, + TRUE, + i18n("Select Email Address"), + Help|Ok, + Ok, + TRUE ) +{ + myResource = Rsrc; + BOX_Parent = makeVBoxMainWidget(); + + EDIT_Email = new QLineEdit( BOX_Parent ); + EDIT_Email->setText( myResource->Email_Address ); + connect( EDIT_Email, SIGNAL( returnPressed() ), this, SLOT( changeValue() ) ); +} +dlg_selectemail::~dlg_selectemail() +{ +} +void dlg_selectemail::changeValue( void ) +{ + myResource->Email_Address = EDIT_Email->text(); + emit valuesChanged(); +} diff --git a/knights/dlg_selectemail.h b/knights/dlg_selectemail.h new file mode 100644 index 0000000..6abf799 --- /dev/null +++ b/knights/dlg_selectemail.h @@ -0,0 +1,52 @@ +/*************************************************************************** + dlg_selectemail.h - description + ------------------- + begin : Sun Oct 27 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_SELECTEMAIL_H +#define DLG_SELECTEMAIL_H + +#include +#include + +/** + *@author Troy Corbin Jr. + */ + +class resource; +class QVBox; +class QLineEdit; + +class dlg_selectemail : public KDialogBase +{ + Q_OBJECT + public: + dlg_selectemail(QWidget *parent, resource *Rsrc ); + ~dlg_selectemail(); + + signals: + void valuesChanged( void ); + + protected slots: + void changeValue( void ); + + private: + resource *myResource; + + QVBox *BOX_Parent; + QLineEdit *EDIT_Email; +}; + +#endif diff --git a/knights/dlg_selectengine.cpp b/knights/dlg_selectengine.cpp new file mode 100644 index 0000000..e827184 --- /dev/null +++ b/knights/dlg_selectengine.cpp @@ -0,0 +1,201 @@ +/*************************************************************************** + dlg_selectengine.cpp - description + ------------------- + begin : Wed Aug 28 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "dlg_selectengine.moc" +#include +#include +#include +#include +#include +#include "resource.h" + +dlg_selectengine::dlg_selectengine(QWidget *parent, resource *Rsrc, bool army ) : + KDialogBase( parent, + 0, + TRUE, + i18n("Select Computer Player"), + Help|Ok, + Ok, + TRUE ) +{ + Resource = Rsrc; + Army = army; + BOX_Parent = makeVBoxMainWidget(); + + BOX_Engine = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Computer Players" ), + BOX_Parent ); + COMBO_Engine = new KComboBox( BOX_Engine ); + COMBO_Engine->setEditable( FALSE ); + +// BOX_EngineHelper = new QGroupBox( 1, +// Qt::Horizontal, +// i18n( "Computer Players' Helper" ), +// BOX_Parent ); +// COMBO_EngineHelper = new KComboBox( BOX_Engine ); +// COMBO_EngineHelper->setEditable( FALSE ); + + buildEngineData(); + + connect( COMBO_Engine, SIGNAL( activated(int) ), this, SLOT( slotCurrent(int) ) ); +// connect( COMBO_EngineHelper, SIGNAL( activated(int) ), this, SLOT( slotCurrentHelper(int) ) ); + + + GROUP_Strength = new QGroupBox( 3, + Qt::Horizontal, + i18n( "Player Strength" ), + BOX_Parent ); + LABEL_Str_Min = new QLabel( i18n( "Weak" ), GROUP_Strength ); + SLIDER_Strength = new QSlider ( 1, + 7, + 1, + Resource->Strength[ 1 * ( Army == BLACK ) ], + QSlider::Horizontal, + GROUP_Strength ); + LABEL_Str_Max = new QLabel( i18n( "Strong" ), GROUP_Strength ); + SLIDER_Strength->setTickmarks( QSlider::Below ); + connect( SLIDER_Strength, SIGNAL( valueChanged(int) ), this, SLOT( slotStrength(int) ) ); +} +dlg_selectengine::~dlg_selectengine() +{ +} +/////////////////////////////////////// +// +// dlg_selectengine::buildEngineData +// +/////////////////////////////////////// +void dlg_selectengine::buildEngineData( void ) +{ + bool FLAG1(FALSE); +// bool FLAG2(FALSE); + int Index(0); + QStringList EngineList; + engineList::Iterator enginesIT; + + /* Clear Comboboxes */ + COMBO_Engine->clear(); +// COMBO_EngineHelper->clear(); + + /* Handle status of Book-engine boxes */ +// White_Use_Book->setChecked( Resource->OPTION_Book_White ); +// Engines_White_Book->setEnabled( Resource->OPTION_Book_White ); + + if( Army == WHITE ) + { + Engine1F = ENGINE_WHITE; + Engine2F = ENGINE_WHITE_BK; + } + else + { + Engine1F = ENGINE_BLACK; + Engine2F = ENGINE_BLACK_BK; + } + + /* Read the engine list */ + if( Resource->engines.isEmpty() ) return; + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + EngineList.append( (*enginesIT).Name ); + } + + /* Insert engines into comboboxes */ + EngineList.sort(); + COMBO_Engine->insertStringList( EngineList ); +// COMBO_EngineHelper->insertStringList( EngineList ); + + /* Now run the list again, setting the current engine for each combobox */ + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).CurrentRef & Engine1F ) + for( Index = 0; Index < COMBO_Engine->count(); Index++ ) + if( COMBO_Engine->text(Index) == (*enginesIT).Name ) + { + COMBO_Engine->setCurrentItem(Index); + FLAG1 = TRUE; + } +// if( (*enginesIT).CurrentRef & Engine2F ) +// for( Index = 0; Index < COMBO_Engine->count(); Index++ ) +// if( COMBO_EngineHelper->text(Index) == (*enginesIT).Name ) +// { +// COMBO_EngineHelper->setCurrentItem(Index); +// FLAG2 = TRUE; +// } + } + + /* + This prevents a bug where you had to modify the + current_engine_comboboxes before you could get any engines to run. + */ + if( ( !FLAG1 ) && ( COMBO_Engine->count() ) ) slotCurrent( COMBO_Engine->currentItem() ); +// if( ( !FLAG2 ) && ( COMBO_EngineHelper->count() ) ) slotCurrentHelper( COMBO_EngineHelper->currentItem() ); +} +/////////////////////////////////////// +// +// dlg_selectengine::slotCurrent +// +/////////////////////////////////////// +void dlg_selectengine::slotCurrent( int Index ) +{ + QString Name; + engineList::Iterator enginesIT; + + Name = COMBO_Engine->text(Index); + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).CurrentRef & Engine1F ) (*enginesIT).CurrentRef -= Engine1F; + if( (*enginesIT).Name == Name ) (*enginesIT).CurrentRef |= Engine1F; + } + emit valuesChanged(); +} +/////////////////////////////////////// +// +// dlg_selectengine::slotCurrentHelper +// +/////////////////////////////////////// +void dlg_selectengine::slotCurrentHelper( int Index ) +{ + QString Name; + engineList::Iterator enginesIT; + + Name = COMBO_EngineHelper->text(Index); + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).CurrentRef & Engine2F ) (*enginesIT).CurrentRef -= Engine2F; + if( (*enginesIT).Name == Name ) (*enginesIT).CurrentRef |= Engine2F; + } + emit valuesChanged(); +} +/////////////////////////////////////// +// +// dlg_selectengine::strength +// +/////////////////////////////////////// +int dlg_selectengine::strength( void ) +{ + return SLIDER_Strength->value(); +} +/////////////////////////////////////// +// +// dlg_selectengine::slotStrength +// +/////////////////////////////////////// +void dlg_selectengine::slotStrength( int value ) +{ + Resource->Strength[Army] = value; + emit valuesChanged(); +} diff --git a/knights/dlg_selectengine.h b/knights/dlg_selectengine.h new file mode 100644 index 0000000..a9dffdb --- /dev/null +++ b/knights/dlg_selectengine.h @@ -0,0 +1,72 @@ +/*************************************************************************** + dlg_selectengine.h - description + ------------------- + begin : Wed Aug 28 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_SELECTENGINE_H +#define DLG_SELECTENGINE_H + +#include +#include +#include "definitions.h" + +/** + *@author Troy Corbin Jr. + */ + +class QVBox; +class QSlider; +class QLabel; +class KComboBox; +class QGroupBox; +class resource; + +class dlg_selectengine : public KDialogBase +{ + Q_OBJECT + public: + dlg_selectengine(QWidget *parent, resource *Rsrc, bool army ); + ~dlg_selectengine(); + int strength( void ); + bool Army; + + protected: + void buildEngineData( void ); + + protected slots: + void slotCurrent( int Index ); + void slotCurrentHelper( int Index ); + void slotStrength( int ); + + signals: + void valuesChanged( void ); + + private: + resource *Resource; + int Engine1F; + int Engine2F; + + QVBox *BOX_Parent; + QGroupBox *BOX_Engine; + KComboBox *COMBO_Engine; + QGroupBox *BOX_EngineHelper; + KComboBox *COMBO_EngineHelper; + QGroupBox *GROUP_Strength; + QLabel *LABEL_Str_Min; + QSlider *SLIDER_Strength; + QLabel *LABEL_Str_Max; +}; + +#endif diff --git a/knights/dlg_server.cpp b/knights/dlg_server.cpp new file mode 100644 index 0000000..89073cb --- /dev/null +++ b/knights/dlg_server.cpp @@ -0,0 +1,240 @@ +/*************************************************************************** + dlg_server.cpp - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include "dlg_server.moc" + +dlg_server::dlg_server(QWidget *parent, const char *name, resource *Rsrc, QString ItemName ) : + KDialogBase( parent, + name, + TRUE, + i18n("Configure Server"), + Help|Ok|Apply|Cancel, + Ok, + TRUE ) +{ + Resource = Rsrc; + Name = ItemName; + + BOX_Parent = makeVBoxMainWidget(); + + BOX_Name = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Server Name" ), + BOX_Parent ); + EDIT_Name = new KLineEdit( BOX_Name ); + + BOX_URLPort = new QHBox( BOX_Parent ); + BOX_URL = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Server URL" ), + BOX_URLPort ); + EDIT_URL = new KLineEdit( BOX_URL ); + BOX_Port = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Server Port" ), + BOX_URLPort ); + EDIT_Port = new KLineEdit( BOX_Port ); + + BOX_UNameStore = new QHBox( BOX_Parent ); + BOX_UserName = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Username" ), + BOX_UNameStore ); + EDIT_UserName = new KLineEdit( BOX_UserName ); + CHECK_StorePass = new QCheckBox( i18n( "Remember My Password" ), BOX_UNameStore ); + + BOX_Pass = new QHBox( BOX_Parent ); + BOX_Password = new QGroupBox( 1, + Qt::Vertical, + i18n( "Password" ), + BOX_Pass ); + EDIT_Password = new KLineEdit( BOX_Password ); + EDIT_Password->setEchoMode( QLineEdit::Password ); + + BOX_PasswordRetype = new QGroupBox( 1, + Qt::Vertical, + i18n( "Confirm Password" ), + BOX_Pass ); + EDIT_PasswordRetype = new KLineEdit( BOX_PasswordRetype ); + EDIT_PasswordRetype->setEchoMode( QLineEdit::Password ); + + /* Use Timeseal? */ + GROUP_Timeseal = new QGroupBox( 2, + Qt::Horizontal, + i18n( "Timeseal" ), + BOX_Parent ); + EDIT_Timeseal = new KLineEdit( GROUP_Timeseal ); + BUTTON_Timeseal = new QPushButton( GROUP_Timeseal ); + BUTTON_Timeseal->setPixmap( Resource->LoadIcon( QString( "fileopen" ), KIcon::Toolbar ) ); + connect( BUTTON_Timeseal, SIGNAL( clicked() ), this, SLOT( slot_Timeseal() ) ); + + BOX_LogFile = new QGroupBox( 2, + Qt::Horizontal, + i18n( "Log File" ), + BOX_Parent ); + EDIT_LogFile = new KLineEdit( BOX_LogFile ); + BUTTON_LogFile = new QPushButton( BOX_LogFile ); + + setMainWidget( BOX_Parent ); + BUTTON_LogFile->setPixmap( Resource->LoadIcon( QString( "fileopen" ), KIcon::Toolbar ) ); + EDIT_Name->setMinimumWidth( 120 ); + EDIT_URL->setMinimumWidth( 120 ); + EDIT_UserName->setMinimumWidth( 120 ); + EDIT_Password->setMinimumWidth( 120 ); + EDIT_PasswordRetype->setMinimumWidth( 120 ); + /* Load in data if this is a modification */ + if( !Name.isEmpty() ) + { + for ( serversIT = Resource->servers.begin(); serversIT != Resource->servers.end(); ++serversIT ) + { + if( (*serversIT).Name == Name ) break; + } + EDIT_Name->setText( (*serversIT).Name ); + EDIT_URL->setText( (*serversIT).URL ); + EDIT_Port->setText( QString("").setNum( (*serversIT).Port ) ); + EDIT_UserName->setText( (*serversIT).UserName ); + CHECK_StorePass->setChecked( (*serversIT).StorePass ); + EDIT_Password->setText( (*serversIT).Password ); + EDIT_PasswordRetype->setText( (*serversIT).Password ); + EDIT_LogFile->setText( (*serversIT).LogFile ); + EDIT_Timeseal->setText( (*serversIT).Timeseal ); + } + if( CHECK_StorePass->isChecked() ) + { + EDIT_Password->setEnabled( TRUE ); + EDIT_PasswordRetype->setEnabled( TRUE ); + } + else + { + EDIT_Password->setEnabled( FALSE ); + EDIT_PasswordRetype->setEnabled( FALSE ); + } + /* Init the buttons */ + showButtonCancel( TRUE ); + showButtonOK( TRUE ); + showButtonApply( TRUE ); + showButton( Help, TRUE ); + + enableButtonCancel( TRUE ); + enableButtonOK( TRUE ); + enableButtonApply( FALSE ); + enableButton( Help, TRUE ); + + setHelp( QString( "configure-servers" ) ); + /* Make Connections */ + connect( BUTTON_LogFile, SIGNAL( clicked() ), this, SLOT( slotLogFileDialog() ) ); + connect( CHECK_StorePass, SIGNAL( toggled(bool) ), this, SLOT( slotStorePass(bool) ) ); + connect( EDIT_Name, SIGNAL( textChanged( const QString&) ), this, SLOT( slotEnableApply( const QString&) ) ); + connect( EDIT_URL, SIGNAL( textChanged( const QString&) ), this, SLOT( slotEnableApply( const QString&) ) ); + connect( EDIT_Port, SIGNAL( textChanged( const QString&) ), this, SLOT( slotEnableApply( const QString&) ) ); + connect( EDIT_UserName, SIGNAL( textChanged( const QString&) ), this, SLOT( slotEnableApply( const QString&) ) ); + connect( EDIT_Password, SIGNAL( textChanged( const QString&) ), this, SLOT( slotEnableApply( const QString&) ) ); + connect( EDIT_Timeseal, SIGNAL( textChanged( const QString&) ), this, SLOT( slotEnableApply( const QString&) ) ); + show(); +} +dlg_server::~dlg_server() +{ +} + +void dlg_server::slotOk( void ) +{ + slotApply(); + slotDelayedDestruct(); +} + +void dlg_server::slotApply( void ) +{ + serverResource newServer; + + if( ( EDIT_Password->text() != EDIT_PasswordRetype->text() ) && ( CHECK_StorePass->isChecked() ) ) + { + return; + } + if( Name.isEmpty() ) + { + serversIT = Resource->servers.append( newServer ); + Name = "notemptyanymore"; + (*serversIT).CurrentRef = 0; + } + (*serversIT).Name = EDIT_Name->text(); + (*serversIT).URL = EDIT_URL->text(); + (*serversIT).Port = QString( EDIT_Port->text() ).toInt(); + (*serversIT).UserName = EDIT_UserName->text(); + (*serversIT).Password = EDIT_Password->text(); + (*serversIT).LogFile = EDIT_LogFile->text(); + (*serversIT).StorePass = CHECK_StorePass->isChecked(); + (*serversIT).Timeseal = EDIT_Timeseal->text(); + + enableButtonApply( FALSE ); +} + +void dlg_server::slotCancel( void ) +{ + slotDelayedDestruct(); +} + +void dlg_server::slotLogFileDialog( void ) +{ + QString temp; + + temp = KFileDialog::getOpenFileName( QString::null, + QString( "*" ), + this, + QString( "Find Log..." ) ); + if( temp.isEmpty() ) return; + EDIT_LogFile->setText( temp ); + enableButtonApply( TRUE ); +} + +void dlg_server::slotEnableApply( const QString& ) +{ + enableButtonApply( TRUE ); +} + +void dlg_server::slotStorePass( bool ) +{ + if( CHECK_StorePass->isChecked() ) + { + EDIT_Password->setEnabled( TRUE ); + EDIT_PasswordRetype->setEnabled( TRUE ); + } + else + { + EDIT_Password->setEnabled( FALSE ); + EDIT_PasswordRetype->setEnabled( FALSE ); + } + enableButtonApply( TRUE ); +} +/////////////////////////////////////// +// +// dlg_server::slot_Timeseal +// +/////////////////////////////////////// +void dlg_server::slot_Timeseal( void ) +{ + QString temp; + + temp = KFileDialog::getOpenFileName( QString::null, + QString( "*" ), + 0, + QString( "Find Timeseal..." ) ); + if( temp.isEmpty() ) return; + EDIT_Timeseal->setText( temp ); + enableButtonApply( TRUE ); +} + diff --git a/knights/dlg_server.h b/knights/dlg_server.h new file mode 100644 index 0000000..5d9c316 --- /dev/null +++ b/knights/dlg_server.h @@ -0,0 +1,92 @@ +/*************************************************************************** + dlg_server.h - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_SERVER_H +#define DLG_SERVER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "definitions.h" +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ + +class dlg_server : public KDialogBase +{ + Q_OBJECT + public: + dlg_server(QWidget *parent=0, const char *name=0, resource *Rsrc=0, QString ItemName="" ); + ~dlg_server(); + + public slots: + void slotOk( void ); + void slotApply( void ); + void slotCancel( void ); + void slotLogFileDialog( void ); + void slotEnableApply( const QString& ); + void slotStorePass( bool state ); + void slot_Timeseal( void ); + + private: + serverList::Iterator serversIT; + resource *Resource; + QString Name; + + QVBox *BOX_Parent; + QHBox *BOX_URLPort; + QHBox *BOX_UNameStore; + QHBox *BOX_Pass; + + QGroupBox *BOX_Name; + KLineEdit *EDIT_Name; + + QGroupBox *BOX_URL; + KLineEdit *EDIT_URL; + + QGroupBox *BOX_Port; + KLineEdit *EDIT_Port; + + QGroupBox *BOX_UserName; + KLineEdit *EDIT_UserName; + QCheckBox *CHECK_StorePass; + + QGroupBox *BOX_Password; + KLineEdit *EDIT_Password; + + QGroupBox *BOX_PasswordRetype; + KLineEdit *EDIT_PasswordRetype; + + QGroupBox *GROUP_Timeseal; + KLineEdit *EDIT_Timeseal; + QPushButton *BUTTON_Timeseal; + + QGroupBox *BOX_LogFile; + KLineEdit *EDIT_LogFile; + QPushButton *BUTTON_LogFile; +}; + +#endif diff --git a/knights/dlg_settings.cpp b/knights/dlg_settings.cpp new file mode 100644 index 0000000..82fa117 --- /dev/null +++ b/knights/dlg_settings.cpp @@ -0,0 +1,201 @@ +/*************************************************************************** + dlg_settings.cpp - description + ------------------- + begin : Mon Jul 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include "definitions.h" +#include "dlg_settings.moc" +#include "setpagedisplay.h" +#include "setpageaudio.h" +#include "setpageengines.h" +#include "setpageservers.h" +#include "setpagegeneral.h" + +/////////////////////////////////////// +// +// dlg_settings::Constructor +// +/////////////////////////////////////// +dlg_settings::dlg_settings(QWidget *parent, const char *name, resource *Rsrc ) : + KDialogBase( IconList, + i18n("Configure"), + Help|Ok|Apply|Cancel, + Ok, + parent, + name, + FALSE, + FALSE ) +{ + QString buffer; + Resource = Rsrc; + Resource->ConfigWrite(); + + /* General Page */ + FRAME_General = addPage( i18n( "General" ), + i18n( "Various aspects of Knights get configured here." ), + QPixmap( locate( "data", "knights/icon-general.png" ) ) ); + PAGE_General = new setPageGeneral( FRAME_General, Resource ); + connect( PAGE_General, SIGNAL( enableApply() ), this, SLOT( slotEnableApply() ) ); + + /* Display Page */ + FRAME_Display = addPage( i18n( "Display" ), + i18n( "These settings determine how Knights displays itself to you." ), + QPixmap( locate( "data", "knights/icon-display.png" ) ) ); + PAGE_Display = new setPageDisplay( FRAME_Display, Resource ); + connect( PAGE_Display, SIGNAL( enableApply() ), this, SLOT( slotEnableApply() ) ); + + /* Audio Page */ + FRAME_Audio = addPage( i18n( "Audio" ), + i18n( "These settings determine what Knights sounds like." ), + Resource->LoadIcon( QString("multimedia"), KIcon::Panel ) ); + PAGE_Audio = new setPageAudio( FRAME_Audio, Resource ); + connect( PAGE_Audio, SIGNAL( enableApply() ), this, SLOT( slotEnableApply() ) ); + + /* Engines Page */ + FRAME_Engines = addPage( i18n( "Computer Opponents" ), + i18n( "Configure your chess engines here." ), + Resource->LoadIcon( QString("gear"), KIcon::Panel ) ); + PAGE_Engines = new setPageEngines( FRAME_Engines, Resource ); + connect( PAGE_Engines, SIGNAL( enableApply() ), this, SLOT( slotEnableApply() ) ); + + /* Servers Page */ + FRAME_Servers = addPage( i18n( "Chess Servers" ), + i18n( "Configure your internet chess servers here." ), + Resource->LoadIcon( QString("network"), KIcon::Panel ) ); + PAGE_Servers = new setPageServers( FRAME_Servers, Resource ); + connect( PAGE_Servers, SIGNAL( enableApply() ), this, SLOT( slotEnableApply() ) ); + + connect( this, SIGNAL( aboutToShowPage( QWidget* ) ), this, SLOT( slotPageChanging( QWidget* ) ) ); + + /* Init the buttons */ + showButtonCancel( TRUE ); + showButtonOK( TRUE ); + showButtonApply( TRUE ); + showButton( Help, TRUE ); + + enableButtonCancel( TRUE ); + enableButtonOK( TRUE ); + enableButtonApply( FALSE ); + enableButton( Help, TRUE ); + + setHelp( QString( "configure" ) ); + show(); +} +/////////////////////////////////////// +// +// dlg_settings::Destructor +// +/////////////////////////////////////// +dlg_settings::~dlg_settings() +{ +} +/////////////////////////////////////// +// +// dlg_settings::slotOk +// +/////////////////////////////////////// +void dlg_settings::slotOk( void ) +{ + slotApply(); + slotDelayedDestruct(); +} +/////////////////////////////////////// +// +// dlg_settings::slotApply +// +/////////////////////////////////////// +void dlg_settings::slotApply( void ) +{ + if( PAGE_Display->changeTheme ) + { + PAGE_Display->changeTheme = FALSE; + emit themeChanged( PAGE_Display->NewBoards, PAGE_Display->NewChessmen ); + } + if( PAGE_Display->refreshBoard ) + { + PAGE_Display->refreshBoard = FALSE; + emit redrawBoard(); + } + if( PAGE_Display->rebuildConsole ) + { + Resource->buildStyle(); + PAGE_Display->rebuildConsole = FALSE; + emit rebuildConsole(); + } + if( PAGE_Audio->changeTheme ) + { + PAGE_Audio->changeTheme = FALSE; + Resource->setAudio( PAGE_Audio->NewSounds ); + } + if( PAGE_Servers->resetServer ) + { + PAGE_Servers->resetServer = FALSE; + emit resetServer(); + } + Resource->ConfigWrite(); + enableButtonApply( FALSE ); +} +/////////////////////////////////////// +// +// dlg_settings::slotCancel +// +/////////////////////////////////////// +void dlg_settings::slotCancel( void ) +{ + Resource->ConfigRead(); + slotDelayedDestruct(); +} +/////////////////////////////////////// +// +// dlg_settings::slotEnableApply +// +/////////////////////////////////////// +void dlg_settings::slotEnableApply( void ) +{ + enableButtonApply( TRUE ); +} +/////////////////////////////////////// +// +// dlg_settings::slotThemesAdded +// +/////////////////////////////////////// +void dlg_settings::slotThemesAdded( void ) +{ + PAGE_Display->buildThemeList(); + PAGE_Audio->buildThemeList(); +} +/////////////////////////////////////// +// +// dlg_settings::slotPageChanging +// +/////////////////////////////////////// +void dlg_settings::slotPageChanging( QWidget *page ) +{ + if( page == FRAME_General ) + setHelp( QString( "configure-general" ) ); + else if( page == FRAME_Display ) + setHelp( QString( "configure-display" ) ); + else if( page == FRAME_Audio ) + setHelp( QString( "configure-audio" ) ); + else if( page == FRAME_Engines ) + setHelp( QString( "configure-engines" ) ); + else if( page == FRAME_Servers ) + setHelp( QString( "configure-servers" ) ); +} + + + diff --git a/knights/dlg_settings.h b/knights/dlg_settings.h new file mode 100644 index 0000000..997db07 --- /dev/null +++ b/knights/dlg_settings.h @@ -0,0 +1,80 @@ +/*************************************************************************** + dlg_settings.h - description + ------------------- + begin : Mon Jul 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef DLG_SETTINGS_H +#define DLG_SETTINGS_H + +#include +#include +#include +#include +#include +#include +#include "definitions.h" +#include "resource.h" + +class setPageDisplay; +class setPageAudio; +class setPageEngines; +class setPageServers; +class setPageGeneral; + +/** + *@author Troy Corbin Jr. + */ + +class dlg_settings : public KDialogBase +{ + Q_OBJECT + public: + dlg_settings(QWidget *parent=0, const char *name=0, resource *Rsrc=0); + ~dlg_settings(); + + public slots: + void slotOk( void ); + void slotApply( void ); + void slotCancel( void ); + void slotEnableApply( void ); + void slotThemesAdded( void ); + void slotPageChanging( QWidget* ); + + signals: + void themeChanged( int, int ); + void redrawBoard( void ); + void rebuildConsole( void ); + void resetServer( void ); + + private: + resource *Resource; + + QFrame *FRAME_General; + setPageGeneral *PAGE_General; + + QFrame *FRAME_Display; + setPageDisplay *PAGE_Display; + + QFrame *FRAME_Audio; + setPageAudio *PAGE_Audio; + + QFrame *FRAME_Engines; + setPageEngines *PAGE_Engines; + + QFrame *FRAME_Servers; + setPageServers *PAGE_Servers; +}; + +#endif diff --git a/knights/idmanager.cpp b/knights/idmanager.cpp new file mode 100644 index 0000000..dd979c3 --- /dev/null +++ b/knights/idmanager.cpp @@ -0,0 +1,37 @@ +/*************************************************************************** + idmanager.cpp - description + ------------------- + begin : Wed Jun 26 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "idmanager.h" + +IDManager::IDManager() +{ + counter = 0; +} + + +IDManager::~IDManager() +{ + counter = 0; +} + +unsigned int IDManager::getNewID() +{ + counter++; + return counter; + /* this might be a problem if there are more than MAX + unsigned int matches going on at the same time */ +} diff --git a/knights/idmanager.h b/knights/idmanager.h new file mode 100644 index 0000000..04be2c1 --- /dev/null +++ b/knights/idmanager.h @@ -0,0 +1,42 @@ +/*************************************************************************** + idmanager.h - description + ------------------- + begin : Wed Jun 26 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef IDMANAGER_H +#define IDMANAGER_H + +#include + +/** + *@author Alexander Wels + */ + +///////////////////////////////////////////////////// +// This class generates and manages ID's for matches +// The ID's generated are unsigned integers +///////////////////////////////////////////////////// + +class IDManager : public QObject +{ +public: + IDManager(); + ~IDManager(); + unsigned int getNewID(); +private: + unsigned int counter; +}; + +#endif diff --git a/knights/io_base.cpp b/knights/io_base.cpp new file mode 100644 index 0000000..db62330 --- /dev/null +++ b/knights/io_base.cpp @@ -0,0 +1,57 @@ +/*************************************************************************** + io_base.cpp - description + ------------------- + begin : Tue Jun 18 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "io_base.moc" + +io_base::io_base(resource *resc) +{ + this->myResource = resc; +} + +io_base::io_base(resource *resc, int ID) +{ + this->myResource = resc; + this->myID = ID; +} + +io_base::io_base(QWidget* parent, resource *rsrc) +{ + this->myParent = parent; + this->myResource = rsrc; +} + +io_base::~io_base() +{ + +} + +void io_base::setID(const int ID) +{ + this->myID = ID; +} + +int io_base::getID() +{ + return myID; +} + +int io_base::getType() +{ + return myType; +} + + diff --git a/knights/io_base.h b/knights/io_base.h new file mode 100644 index 0000000..7feeff0 --- /dev/null +++ b/knights/io_base.h @@ -0,0 +1,68 @@ +/*************************************************************************** + io_base.h - description + ------------------- + begin : Tue Jun 18 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef IO_BASE_H +#define IO_BASE_H + + +#include "definitions.h" +#include "resource.h" +#include "command.h" +#include "match_param.h" + +#include +#include +/** + *@author Alexander Wels. + */ + +class io_base : public QObject +{ + Q_OBJECT + +public: + + enum ioType + { + INTERNET = 0, + LOCAL = 1 + }; + + io_base(QWidget *parent=NULL, resource *rsrc=NULL); + io_base(resource *rsrc); + io_base(resource *rsrc, int ID); + virtual ~io_base(); + int getID( void ); + void setID( const int ID ); + int getType( void ); + +public slots: + virtual void recvCMD(const Command& command) = 0; // sub classes have to implement this + +signals: + virtual void sendCMD(const Command& command) = 0; // sub classes have to implement this + + +protected: + // The knightio object needs to know its ID + QWidget *myParent; + int myID; + resource *myResource; + ioType myType; +}; + +#endif diff --git a/knights/io_engine.cpp b/knights/io_engine.cpp new file mode 100644 index 0000000..d9a15a7 --- /dev/null +++ b/knights/io_engine.cpp @@ -0,0 +1,312 @@ +/*************************************************************************** + io_engine.cpp - description + ------------------- + begin : Sat Jun 30 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include + +#include +#include + +#include +#include +#include + +#include "io_engine.moc" +#include "definitions.h" +#include "proto_base.h" +#include "proto_xboard.h" +#include "proto_uci.h" + +io_engine::io_engine( QWidget *parent, resource *Rsrc ) : io_base( parent, Rsrc ) +{ + myType = io_base::LOCAL; + engine = NULL; + Log = NULL; + proto = NULL; + SafeToSend = TRUE; + CleanBuffer = TRUE; + SendSIGINT = FALSE; + Forced = TRUE; + Protocol = XBoard; + FIFO_In = ""; + FIFO_Out = ""; +} +// +io_engine::~io_engine() +{ + if( engine ) + { + Kill(); + } + if( Log ) + { + Log->close(); + delete Log; + } + if( proto ) + { + delete proto; + } +} +/////////////////////////////////////// +// +// io_engine::Start +// +/////////////////////////////////////// +void io_engine::Start( const int side ) +{ + QStringList args; + unsigned int tmp; + int ID; + bool Army; + + /* Stop accidents */ + if( engine != NULL ) + return; + engine = new KProcess(); + + /* Convert 'side' to 'ID' */ + if( side == WHITE ) + { + ID = ENGINE_WHITE; + Army = WHITE; + } + else if( side == BLACK ) + { + ID = ENGINE_BLACK; + Army = BLACK; + } + else if( side == WHITE_HELPER ) + { + ID = ENGINE_WHITE_BK; + Army = WHITE; + } + else + { + ID = ENGINE_BLACK_BK; + Army = BLACK; + } + + /* Get and parse engine config from resource */ + for( IT = myResource->engines.begin(); IT != myResource->engines.end(); ++IT ) + { + if( (*IT).CurrentRef & ID ) + break; + } + if( IT == myResource->engines.end() ) + { + kdError() << "io_engine::Start: Can not find engine resource ID " << ID << endl; + return; + } + + /* ...protocol */ + Protocol = (*IT).Protocol; + switch( Protocol ) + { + case UCI: + proto = new proto_uci( myID ); + break; + case XBoard: + default: + proto = new proto_xboard( myID ); + break; + } + connect( proto, SIGNAL( output( const QString& ) ), this, SLOT( WriteFIFO( const QString& ) ) ); + connect( proto, SIGNAL( output( const Command& ) ), this, SLOT( recvProtoCMD( const Command& ) ) ); + + /* ...engine's display name */ + proto->parse( Command( myID, CMD_Set_Name, (*IT).Name ) ); + + /* ...engine file name */ + (*engine) << (*IT).Filename; + + /* ...command line arguments */ + args = QStringList::split( QString(" "), (*IT).Arguments, FALSE ); + for( tmp = 0; tmp < args.count(); tmp++ ) + { + (*engine) << args[tmp]; + } + + /* ...log file */ + if( !(*IT).LogFile.isEmpty() ) + { + Log = new QFile( (*IT).LogFile ); + if( !Log->open( IO_WriteOnly | IO_Append ) ) + if( !Log->open( IO_WriteOnly ) ) + kdError() << "io_engine::Start: Can not open " << (*IT).LogFile << " for writing." << endl; + } + + /* Showtime */ + if( !engine->start( KProcess::NotifyOnExit, KProcess::All ) ) + { + kdError() << "io_engine::Start: Can not run the engine: " << (*IT).Filename << endl; + return; + } + connect( engine, SIGNAL( wroteStdin( KProcess* ) ), this, SLOT( SendClear( KProcess* ) ) ); + connect( engine, SIGNAL( receivedStdout( KProcess*, char*, int ) ), this, SLOT( Recv( KProcess*, char*, int ) ) ); + connect( engine, SIGNAL( receivedStderr( KProcess*, char*, int ) ), this, SLOT( Recv( KProcess*, char*, int ) ) ); + + proto->parse( Command( myID, CMD_Init ) ); + + if( myResource->OPTION_Ponder ) + proto->parse( Command( myID, CMD_Ponder ) ); + else + proto->parse( Command( myID, CMD_No_Pondering ) ); + + proto->parse( Command( myID, CMD_NewGame ) ); + + if( Army == WHITE ) + proto->parse( Command( myID, CMD_Play_White ) ); + else + proto->parse( Command( myID, CMD_Play_Black ) ); + return; +} +/////////////////////////////////////// +// +// io_engine::Kill +// +/////////////////////////////////////// +void io_engine::Kill( void ) +{ + proto->parse( Command( myID, CMD_Exit ) ); + if( engine != NULL ) + delete engine; +} +/////////////////////////////////////// +// +// io_engine::sendToChild +// +/////////////////////////////////////// +void io_engine::sendToChild( void ) +{ + if( !SafeToSend || FIFO_Out.isEmpty() || !engine->isRunning() ) + return; + + /* Interrupt those engines that want or need it */ + if( SendSIGINT ) + { + engine->kill( SIGINT ); + SendSIGINT = FALSE; + } + + /* Write it */ + SafeToSend = FALSE; + if( engine->writeStdin( FIFO_Out.latin1(), FIFO_Out.length() ) ) + { + /* Print the output to the log file */ + if( Log ) + { + FIFO_Out.prepend( "<- " ); + Log->writeBlock( FIFO_Out.latin1(), FIFO_Out.length() ); + } + FIFO_Out = ""; + } + else + kdError() << "io_engine::sendToChild: Could not write to engine." << endl; +} +/////////////////////////////////////// +// +// io_engine::Recv +// +/////////////////////////////////////// +void io_engine::Recv( KProcess*, char *buffer, int bufLen ) +{ + char *newBuff = new char[bufLen + 1]; + strncpy( newBuff, buffer, bufLen ); + newBuff[bufLen] = 0; + FIFO_In += newBuff; + delete newBuff; + + if( FIFO_In.contains( QChar('\n') ) ) + { + QString proc = FIFO_In.left( FIFO_In.findRev( QChar('\n') ) ); + FIFO_In = FIFO_In.right( FIFO_In.length() - proc.length() ); + + /* Split and Parse Full Lines of Input */ + QStringList strList = QStringList::split( "\n", proc ); + for( unsigned int loop = 0; loop < strList.count(); loop++ ) + { + /* Print the input to the log file */ + if( Log ) + { + QString data = "-> " + strList[loop] + "\n"; + Log->writeBlock( data.latin1(), data.length() ); + } + proto->parse( strList[loop] ); + } + } + return; +} +/////////////////////////////////////// +// +// io_engine::WriteFIFO +// +/////////////////////////////////////// +void io_engine::WriteFIFO( const QString &Data ) +{ + QString data = Data; + if( data.isEmpty() ) + return; + if( data.right(1) != "\n" ) + data += "\n"; + FIFO_Out += data; + sendToChild(); + return; +} +/////////////////////////////////////// +// +// io_engine::recvCMD +// +/////////////////////////////////////// +void io_engine::recvCMD( const Command &command ) +{ + proto->parse( command ); +} + +/////////////////////////////////////// +// +// io_engine::recvProtoCMD +// +/////////////////////////////////////// +void io_engine::recvProtoCMD( const Command &command ) +{ + Command cmd = command; + + switch( cmd.getCommand() ) + { + /* Command: Send_SIGTERM */ + case CMD_Send_SIGTERM: + engine->kill(); + break; + /* Command: Send_SIGINT */ + case CMD_Send_SIGINT: + SendSIGINT = TRUE; + break; + /* Command to Core */ + default: + emit sendCMD( command ); + break; + } +} + +void io_engine::SendClear( KProcess* ) +{ + SafeToSend = TRUE; + if( !FIFO_Out.isEmpty() ) + sendToChild(); +} + diff --git a/knights/io_engine.h b/knights/io_engine.h new file mode 100644 index 0000000..3952d60 --- /dev/null +++ b/knights/io_engine.h @@ -0,0 +1,81 @@ +/*************************************************************************** + io_engine.h - description + ------------------- + begin : Sat Jun 30 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef IO_ENGINE_H +#define IO_ENGINE_H + +#include +#include +#include "io_base.h" + +/** + *@author Troy Corbin Jr. + */ + +class QFile; +class KProcess; +class resource; +class proto_base; + +class io_engine : public io_base +{ + Q_OBJECT + public: + io_engine( QWidget *parent=NULL, resource *Rsrc=0 ); + ~io_engine(); + + void Start( const int side ); + + public slots: + virtual void recvCMD( const Command& command ); + void recvProtoCMD( const Command& command ); + void SendClear( KProcess* ); + void Recv( KProcess*, char*, int ); + + signals: + virtual void sendCMD(const Command& command); + + protected slots: + void sendToChild( void ); + void WriteFIFO( const QString &Data ); + + protected: + void Kill( void ); + + private: + + engineList::Iterator IT; + proto_base *proto; + + /* States */ + bool SafeToSend; + bool SendSIGINT; + bool CleanBuffer; + bool Forced; + + /* References */ + QFile *Log; + int Protocol; + ChessMove Move; + + /* Data */ + KProcess *engine; + QString FIFO_In; + QString FIFO_Out; +}; + +#endif diff --git a/knights/io_internet.cpp b/knights/io_internet.cpp new file mode 100644 index 0000000..e5325cd --- /dev/null +++ b/knights/io_internet.cpp @@ -0,0 +1,1138 @@ +/*************************************************************************** + io_internet.cpp - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +/* KDE */ +#include +#include +#include + +/* Qt */ +#include +#include +#include +#include +#include +#include + +/* Local */ +#include "io_internet.moc" +#include "resource.h" +#include "dlg_login.h" +#include "dlg_challenge.h" +#include "match.h" +#include "core.h" +#include "audio.h" +#include "../config.h" + +static const int TXT_Std = 0; +static const int TXT_Pvt = 1; +static const int TXT_Ch = 2; +static const int TXT_Sht = 3; +static const int TXT_Wsp = 4; +static const int TXT_Not = 5; + +io_internet::io_internet( QWidget *parent, resource *rsrc ) +{ + myResource = rsrc; + challenge = NULL; + myTimeseal = NULL; + socket = NULL; + loginStage = LOGIN_STAGE_NAME; + lineBuffer = ""; + Log = NULL; + + /* set type */ + this->myType = io_base::INTERNET; + + /* initialize various variables */ + this->waiting_for_move_list = false; + this->myParent = parent; + connected = false; /* we are not connected to a server */ + + /* create the login dialog and show it to the user */ + loginDlg = new dlg_login( myParent, "LoginDialog", myResource); + connect(loginDlg, SIGNAL( okClicked() ), this, SLOT( connectToServer() ) ); + connect(loginDlg, SIGNAL( cancelClicked() ), this, SLOT( selfDestruct() ) ); + connect(loginDlg, SIGNAL( login(QString, QString) ), this, SLOT( setUserInfo(QString, QString) ) ); +} + +/////////////////////////////////////////////////////////// +// Destructor +/////////////////////////////////////////////////////////// +io_internet::~io_internet() +{ + TabMap::Iterator i; + + /* Close and remove socket */ + if( socket != NULL ) + { + if(socket->socket() != -1) + { + send("quit"); + } + delete socket; + } + /* Close and remove logfile */ + if( Log ) + { + Log->close(); + delete Log; + Log = NULL; + } + /* Remove Timeseal */ + if( myTimeseal != NULL ) + { + myTimeseal->kill(); + delete myTimeseal; + } + /* Close and remove Tabs */ + + for(i = myTabList.begin(); i != myTabList.end(); i++) + { + if(myResource->tabManager->isTab(*i)) + { + myResource->tabManager->removeTab(*i); + } + } +} + +void io_internet::connectToServer() +{ + serverList::iterator i; + QWidget *tempTab; + QWidget *consoleTab; + QValueList::iterator j; + + qApp->mainWidget()->setCursor( myResource->CURSOR_Thinking ); + /* Get and parse server config from resource */ + myServer = NULL; + for( i = myResource->servers.begin(); i != myResource->servers.end(); i++ ) + { + if( (*i).CurrentRef ) + { + myServer = &(*i); + } + } + if(myServer == NULL) + { + /* No server configured. Notify User and die gracefully */ + qApp->mainWidget()->setCursor( myResource->CURSOR_Standard ); + kdError() << "internetio::internetio: Can not find server resource CurrentRef " << endl; + KMessageBox::sorry( (QWidget*)myParent, i18n( "There are no servers configured.\nPlease make sure you have at least one server configured." ), i18n( "Cannot find a server.")); + QApplication::postEvent( qApp->mainWidget(), new QCustomEvent( EVENT_Del_IO_Net ) ); + return; + } + + if(myServer->Port == 0) + { + myServer->Port = 5000; + } + + if(!myServer->Timeseal.isEmpty()) + { + myTimeseal = new KProcess(); + (*myTimeseal) << myServer->Timeseal << myServer->URL << QString().setNum( myServer->Port ) + << QString( "-p" ) << QString().setNum(myServer->Port + 1); + if(!myTimeseal->start()) + { + /* Couldn't start Timeseal. Notify User and die gracefully */ + qApp->mainWidget()->setCursor( myResource->CURSOR_Standard ); + KMessageBox::sorry( (QWidget*)myParent, i18n( "Knights can not start Timeseal.\nPlease make sure you have the correct path and filename configured." ), i18n( "Cannot find Timeseal.")); + QApplication::postEvent( qApp->mainWidget(), new QCustomEvent( EVENT_Del_IO_Net ) ); + return; + } + socket = new KSocket("127.0.0.1", myServer->Port + 1, 30); + if(socket->socket() == -1) + { + /* try again on a different port, somehow the port hasn't been freed yet */ + delete socket; + myTimeseal->kill(); + + myTimeseal = new KProcess(); + (*myTimeseal) << myServer->Timeseal << myServer->URL << QString().setNum( myServer->Port ) + << QString( "-p" ) << QString().setNum(myServer->Port + 2); + if(!myTimeseal->start()) + { + /* Couldn't start Timeseal. Notify User and die gracefully */ + qApp->mainWidget()->setCursor( myResource->CURSOR_Standard ); + KMessageBox::sorry( (QWidget*)myParent, i18n( "Knights can not start Timeseal.\nPlease make sure you have the correct path and filename configured." ), i18n( "Cannot find Timeseal.")); + QApplication::postEvent( qApp->mainWidget(), new QCustomEvent( EVENT_Del_IO_Net ) ); + return; + } + socket = new KSocket("127.0.0.1", myServer->Port + 2, 30); + if(socket->socket() == -1) + { + /* if we can't do it the second time, give up */ + /* Couldn't connect to server through Timeseal. Notify User and die gracefully */ + qApp->mainWidget()->setCursor( myResource->CURSOR_Standard ); + KMessageBox::sorry( (QWidget*)myParent, i18n( "Knights is unable to connect to the server.\n Please make sure your internet connection is working and try again."), i18n( "Cannot connect to server(timeseal).")); + QApplication::postEvent( qApp->mainWidget(), new QCustomEvent( EVENT_Del_IO_Net ) ); + return; + } + } + } + else + { + socket = new KSocket(myServer->URL, myServer->Port, 30); + if(socket->socket() == -1) + { + /* Couldn't connect to server. Notify User and die gracefully */ + qApp->mainWidget()->setCursor( myResource->CURSOR_Standard ); + KMessageBox::sorry( (QWidget*)myParent, i18n( "Knights is unable to connect to the server.\n Please make sure your internet connection is working and try again."), i18n( "Cannot connect to server.")); + QApplication::postEvent( qApp->mainWidget(), new QCustomEvent( EVENT_Del_IO_Net ) ); + return; + } + } + socket->enableRead(true); + socket->enableWrite(true); + + /* connect a signal to readReady */ + connect(socket, SIGNAL(readEvent(KSocket *)), this, SLOT(readCommand(KSocket *))); + + /* setup the seekTimer and turn it off by default */ + seekTimer = new QTimer(this); + connect(seekTimer, SIGNAL(timeout()), this, SLOT(processSeekTimer())); + + /* succesfully connected to the server, turn connected on and flush the command buffer */ + connected = true; + for(j = myCommandBuffer.begin(); j != myCommandBuffer.end(); j++) + { + recvCMD(*j); + } + + /* + Create ICS Related Tabs + + These will need to be moved into thier own functions because we want to be able to open + and close these tabs at will, or have multiple open at once. ALL communication to our tabs + needs to be done with SIGNALS & SLOTS to facilitate this. + */ + consoleTab = new Console( 0, myServer->Name, myResource ); + myTabList[consoleTab] = consoleTab; + myResource->tabManager->addTab( myTabList[consoleTab], i18n( "%1 Console" ).arg( myServer->Name ) ); + connect( myTabList[consoleTab], SIGNAL( sendCMD( const Command& ) ), this, SLOT( recvCMD( const Command& ) ) ); + connect( this, SIGNAL( sendCMD( const Command& ) ), myTabList[consoleTab], SLOT( recvCMD( const Command& ) ) ); + + tempTab = new tab_SeekList( 0, "seekList", myResource ); + myTabList[tempTab] = tempTab; + myResource->tabManager->addTab( myTabList[tempTab], i18n( "Sought Matches List" ) ); + connect( myTabList[tempTab], SIGNAL( sendCMD( const Command& ) ), this, SLOT( recvCMD( const Command& ) ) ); + connect( this, SIGNAL( sendCMD( const Command& ) ), myTabList[tempTab], SLOT( recvCMD( const Command& ) ) ); + + tempTab = new Challenge_Graph( 0, "seekGraph", myResource ); + myTabList[tempTab] = tempTab; + myResource->tabManager->addTab( myTabList[tempTab], i18n( "Sought Matches Graph" ) ); + connect( myTabList[tempTab], SIGNAL( sendCMD( const Command& ) ), this, SLOT( recvCMD( const Command& ) ) ); + connect( this, SIGNAL( sendCMD( const Command& ) ), myTabList[tempTab], SLOT( recvCMD( const Command& ) ) ); + + myResource->tabManager->showTab(consoleTab); + + /* ...log file */ + if( !myServer->LogFile.isEmpty() ) + { + Log = new QFile( myServer->LogFile ); + if( !Log->open( IO_WriteOnly | IO_Append ) ) + { + if( !Log->open( IO_WriteOnly ) ) + { + kdError() << "Can not open " << myServer->LogFile << " for writing." << endl; + } + } + } + qApp->mainWidget()->setCursor( myResource->CURSOR_Standard ); +} + +void io_internet::recvCMD(const Command& command) +{ + QString error_message; + + if(!connected) + { + myCommandBuffer.push_back(command); + return; + } + + switch(((Command)command).getCommand()) + { + case CMD_Move: + send(((Command)command).getMove().SAN); + break; + case CMD_Reset_Server: + sendUserSettings(); + break; + case CMD_Toggle_Seek: + if(seekTimer->isActive()) + { + /* timer running stop it */ + seekTimer->stop(); + emit sendCMD( Command( 0, CMD_Hide_Sought_List ) ); + } + else + { + /* timer not running start it */ + seekTimer->start(myResource->Seek_Timer * 100); + /* send a sought now */ + processSeekTimer(); + } + break; + case CMD_Player_Finger: + send("$finger " + ((Command)command).getData()); + break; + case CMD_Add_Friend: + send("$+notify " + ((Command)command).getData()); + break; + case CMD_Ignore_Player: + send("$+censor " + ((Command)command).getData()); + break; + case CMD_Player_History: + send("$history " + ((Command)command).getData()); + break; + case CMD_Start_Match: + send("$play " + ((Command)command).getData()); + break; + case CMD_Assess: + send("$assess " + ((Command)command).getData()); + break; + case CMD_Set_Input: + sendCMD( command ); + break; + case CMD_Send_To_ICS: + if(((Command)command).getData().contains(QRegExp("^(?:\\.|tell)"))) + { + writeToConsole(((Command)command).getData(), "K_PVT"); + } + send(((Command)command).getData()); + break; + case CMD_Examine_Forward: + send("$forward 1"); + break; + case CMD_Examine_Backward: + send("$backward 1"); + break; + case CMD_White_Resign: + case CMD_Black_Resign: + send("$resign"); + break; + case CMD_Offer_Draw: + send("$draw"); + break; + case CMD_Reject_Draw: + send("$decline t draw"); + break; + default: + /* do nothing unknown command */ + kdWarning() << "InternetIO::sendCMD received an unknown command: " << ((Command)command).getCommand() << endl; + } +} + +/////////////////////////////////////// +// +// io_internet::send +// +/////////////////////////////////////// +void io_internet::send(const QString& msg) +{ + QString tmp(msg); + ssize_t len; + + /* Attach events to specific outgoing text */ + if( ( tmp == "accept" ) || + ( tmp == "decline" ) || + ( tmp.left(6) == "match " ) ) + { + if( challenge != NULL ) + { + delete challenge; + nullifyChallenge(); + } + } + if( tmp.right(1) != "\n" ) + { + tmp += "\n"; + } + + len = write(socket->socket(), tmp.latin1(), tmp.length() ); + + if( Log ) + { + Log->writeBlock( QString("<< ").latin1(), 3 ); + Log->writeBlock( tmp.latin1(), tmp.length() ); + } + if( len < (signed)tmp.length() ) + { + kdWarning() << "io_internet::Send: Failed to write full block of data to socket." << endl; + } +} + +/////////////////////////////////////// +// +// io_internet::readCommand +// +/////////////////////////////////////// +void io_internet::readCommand(KSocket* socket) +{ + char buffer[READ_BUFFER_SIZE]; + QString tmp; + QStringList lines; + + memset(buffer, 0, READ_BUFFER_SIZE); + read(socket->socket(), buffer, READ_BUFFER_SIZE); + tmp = buffer; + + tmp = lineBuffer + tmp; + if( Log ) + { + Log->writeBlock( tmp.latin1(), tmp.length() ); + } + if(loginStage != LOGIN_STAGE_LOGGED_IN) + { + // route all the data to the login parser + parseLoginData(tmp); + this->parseMode = NORMAL_MODE; + } + else + { + lines = QStringList::split( QRegExp("\n\r?"), tmp, FALSE ); + if(!(tmp.endsWith("\n\r") || tmp.endsWith("\n"))) + { + lineBuffer = (*(--lines.end())); + } + else + { + lineBuffer = ""; + } + for(QStringList::iterator i = lines.begin(); i != lines.end(); i++) + { + if(lineBuffer == "" || i != --lines.end()) + { + (*i).replace( QRegExp( "\\a" ), "" ); + parseLine(*i); + } + } + } +} +/////////////////////////////////////// +// +// io_internet::sendUserName +// +/////////////////////////////////////// +void io_internet::sendUserName() +{ + loginStage = LOGIN_STAGE_PASSWORD; + send(userName); +} +/////////////////////////////////////// +// +// io_internet::sendPassword +// +/////////////////////////////////////// +void io_internet::sendPassword() +{ + send(passWord); +} + +/////////////////////////////////////// +// +// io_internet::parseLoginData +// +/////////////////////////////////////// +void io_internet::parseLoginData( QString data ) +{ + QStringList lines; + + if(loginStage == LOGIN_STAGE_NAME) + { + if(data.contains( "login:" )) + { + sendUserName(); + } + lines = QStringList::split( QRegExp("\n\r?"), data, FALSE ); + for(QStringList::iterator i = lines.begin(); i != lines.end(); i++) + { + writeToConsole((*i), "K_STD"); + } + } + else if(loginStage == LOGIN_STAGE_PASSWORD) + { + if(data.contains("**** Invalid password! ****") || + data.contains("Sorry, names can only consist of lower and upper case letters. Try again.") || + data.contains("If you are not a registered player, enter guest or a unique ID.")) + { + loginDlg = new dlg_login( myParent, "LoginDialog", myResource); + loginDlg->disableServerSelect(); + connect(loginDlg, SIGNAL( okClicked() ), this, SLOT( sendUserName() ) ); + connect(loginDlg, SIGNAL( cancelClicked() ), this, SLOT( selfDestruct() ) ); + connect(loginDlg, SIGNAL( login(QString, QString) ), this, SLOT( setUserInfo(QString, QString) ) ); + } + else if(data.contains("Press return to enter the server as")) + { + QRegExp guestName("Logging you in as \"(\\w*)\""); + int pos = guestName.search(data); + if(pos > -1) + { + userName = guestName.cap(1); + } + send("\n"); + } + else if(data.contains("password:")) + { + sendPassword(); + } + else + { + loginStage = LOGIN_STAGE_LOGGED_IN; + sendUserSettings(); + } + lines = QStringList::split( QRegExp("\n\r?"), data, FALSE ); + for(QStringList::iterator i = lines.begin(); i != lines.end(); i++) + { + writeToConsole((*i), "K_STD"); + } + } + else + { + lines = QStringList::split( QRegExp("\n\r?"), data, FALSE ); + for(QStringList::iterator i = lines.begin(); i != lines.end(); i++) + { + writeToConsole((*i), "K_STD"); + } + } +} + +/////////////////////////////////////// +// +// io_internet::ParseLine +// +/////////////////////////////////////// +void io_internet::parseLine( QString line ) +{ + int i, j; + QString tmp; + + switch(parseMode) + { + case NORMAL_MODE: /* determine which mode we should go into */ + if(line.contains(QRegExp("^\\s*\\d{1,3}\\s+(?:\\d{1,4}|\\+\\+\\+\\+|\\-\\-\\-\\-)\\s+\\w{3,17}(\\(C\\))?\\s+\\d{1,3}\\s+\\d{1,3}"))) + { + updateSoughtList(line); + parseMode = UPDATE_SOUGHT_MODE; + } + /* CHALLENGE */ + else if( line.contains(QRegExp("^\\s*Challenge: "))) + { + myResource->play( SND_CHALLENGE ); + if( challenge != NULL ) + { + delete challenge; + } + challenge = new dlg_challenge( 0, "Challenge", myResource ); + connect( challenge, SIGNAL( destroyed() ), this, SLOT( nullifyChallenge() ) ); + connect( challenge, SIGNAL( user1Clicked() ), this, SLOT( acceptChallenge() ) ); + connect( challenge, SIGNAL( user2Clicked() ), this, SLOT( declineChallenge() ) ); + line.replace(QRegExp("^\\s*Challenge: "), ""); + challenge->setValues( line, userName ); + parseMode = CHALLENGE_MODE; + } + else if( ( line.left(15) == "Challenge from " ) && ( line.right(9) == " removed." ) ) + { + if( challenge != NULL ) + { + delete challenge; + } + } + /* SOUGHT GAME */ + else if(line.contains("seeking")) + { + // writeToConsole("seeking", "K_CH"); + } + /* PRIVATE TELL */ + else if(line.contains(QRegExp(".+ tells you: .*"))) + { + /* First grab the user name so we can auto-respond later */ + emit sendCMD( Command( 0, CMD_Set_Src_Tell, line.section(' ', 0, 0) ) ); + myResource->play( SND_TELL ); + writeToConsole(line, "K_PVT"); + } + /* SAY */ + else if(line.contains( QRegExp(".+ says: .*"))) + { + myResource->play(SND_SAY); + writeToConsole(line, "K_PVT"); + return; + } + /* WHISPER & KIBITZ */ + else if(line.contains(QRegExp(".+ whispers: .*")) || line.contains(QRegExp(".+ kibitzes: .*"))) + { + writeToConsole(line, "K_WSP"); + } + /* Important System Messages: Use Whisper Color */ + else if(line.contains(QRegExp("declines the draw request\\.$" ))) + { + writeToConsole(line, "K_WSP"); + } + /* DRAW OFFER */ + else if(line.right(19) == " offers you a draw.") + { + writeToConsole(line, "K_WSP"); + } + else if( line.contains( QRegExp(".+rating adjustment:.+" ) ) ) + { + writeToConsole(line, "K_WSP"); + } + /* SHOUTS */ + else if( line.contains( QRegExp("^c?t?s?-?shouts: ") ) ) + { + writeToConsole(line, "K_SHT"); + } + /* NOTIFY */ + else if((line.contains(QRegExp("\\s*Notification:"))) || + (line.contains(QRegExp("\\s*Present company includes:"))) || + (line.contains(QRegExp("\\s*Your arrival was noted by:")))) + { + writeToConsole(line, "K_NOT"); + myResource->play( SND_NOTIFICATION ); + } + /* CHANNEL TELLS */ + else if(line.contains(QRegExp( ".\\(\\d+\\):" ))) + { + /* First grab the channel # so we can auto-respond later */ + j = line.find(QString("):")); + i = line.findRev(QString("("), j) + 1; + emit sendCMD( Command( 0, CMD_Set_Src_Channel, line.mid(i, j - i) ) ); + writeToConsole(line, "K_CH"); + } + else if(line.contains(QRegExp("^<12>\\s"))) + { + /* a game move */ + parseStyle12(line, PARSE12_MODE_MOVE); + } + else if(line.contains(QRegExp("^\\s"))) + { + /* a bughouse piece has been passed or a piece has been captured in crazyhouse */ + writeToConsole(line, "K_CH"); + } + else if(line.contains(QRegExp("^\\\\"))) + { + writeToConsole(line, lastTag); + } + else if(line.contains(QRegExp("^\\{?Game \\d+")) && line.contains("Creating", TRUE)) + { + parseMode = NEW_GAME_MODE; + } + else if(line.contains("You are now observing game")) + { + parseMode = OBSERVE_GAME_MODE; + } + else if(line.startsWith("Movelist for game")) + { + QRegExp gameNumber("\\d+"); + int pos = gameNumber.search(line); + if(pos > -1) + { + ficsMoveListNumber = gameNumber.cap(0).toInt(); + } + parseMode = PARSE_MOVE_LIST_MODE; + } + else if((line.contains(QRegExp("^\\{?Game \\d+")) || line.contains(QRegExp("Game \\d+"))) && + ( + line.contains(" forfeits by disconnection", TRUE) || + line.contains(" forfeits by disconnection}", TRUE) || + line.contains(" forfeits on time} ", TRUE) || + line.contains(" forfeits on time ", TRUE) || + line.contains(" resigns} ", TRUE) || + line.contains(" resigns ", TRUE) || + line.contains(" Game drawn by mutual agreement ", TRUE) || + line.contains(" Game drawn by mutual agreement} ", TRUE) || + line.contains(", has lost contact or quit.", TRUE) || + line.contains(" checkmated ", TRUE) || + line.contains(" checkmated} ", TRUE) || + line.contains("lost connection", TRUE) || + line.contains("has no material to mate", TRUE) + ) + ) + { + sendEndOfGameCommand(line); + } + else + { + /* don't know what to do with it, just send it to the console */ + /* don't write the prompt to the console */ + if( line.contains( QRegExp( "^a?d?f?g?s?z?ics% " ) ) || + line.contains( QRegExp( "^cex% " ) ) || + line.contains( QRegExp( "^chess% " ) ) ) + break; + writeToConsole(line, "K_STD"); + } + break; + case UPDATE_SOUGHT_MODE: + if(line.contains(QRegExp("\\d+\\s+ads? displayed."))) + { + updateSoughtList(line); + parseMode = NORMAL_MODE; + } + else + { + updateSoughtList(line); + } + break; + case NEW_GAME_MODE: + if(line.contains(QRegExp("<12>\\s"))) + { + /* a game move */ + parseStyle12(line, PARSE12_MODE_NEW); + } + else if((line.startsWith("fics%") && line.length() == 6)) + { + parseMode = NORMAL_MODE; + } + break; + case OBSERVE_GAME_MODE: + if(line.contains(QRegExp("<12>\\s"))) + { + /* a game move */ + parseStyle12(line, PARSE12_MODE_NEW); + send("moves"); + parseMode = NORMAL_MODE; + } + break; + case CHALLENGE_MODE: + if(line.startsWith("You can \"accept\" or \"decline\", or propose")) + { + parseMode = NORMAL_MODE; + } + break; + case PARSE_MOVE_LIST_MODE: + if(!line.contains("{Still in progress}")) + { + if(line.contains(QRegExp("\\d\\."))) + { + parseMoveList(line); + } + } + else + { + parseMode = NORMAL_MODE; + } + break; + default: /* do nothing */ + break; + }; +} + +/////////////////////////////////////// +// +// io_internet::ParseStyle12 +// +/////////////////////////////////////// +void io_internet::parseStyle12(QString line, const unsigned int Mode) +{ +// kdWarning() << line << endl; + + struct ChessMove move; + QStringList fields; + QString position_line = ""; + match_param *param = NULL; + Command::clearMove(&move); + switch(Mode) + { + case PARSE12_MODE_NEW: + { + /* a new game that we are playing, or observing */ + param = new match_param(this->myResource); + fields = QStringList::split( QChar(' '), line, FALSE ); + + /* set white time control */ + TCPList tmpListWhite(param->time(WHITE)); + TCP tmpTCPWhite = tmpListWhite[0]; + tmpTCPWhite.Seconds = fields[20].toInt() * 60; + tmpTCPWhite.Increment = fields[21].toInt(); + tmpListWhite[0] = tmpTCPWhite; + param->setTime(WHITE, tmpListWhite); + + /* set black time control */ + TCPList tmpListBlack(param->time(BLACK)); + TCP tmpTCPBlack = tmpListBlack[0]; + tmpTCPBlack.Seconds = fields[20].toInt() * 60; + tmpTCPBlack.Increment = fields[21].toInt(); + tmpListBlack[0] = tmpTCPBlack; + param->setTime(BLACK, tmpListBlack); + + if((userName.upper() == fields[17].upper()) && + ((fields[19].toInt() == -1) || (fields[19].toInt() == 1))) + { + /* I am playing white */ + param->setType(WHITE, PLAYERLOCAL); + } + else if(fields[19].toInt() != 2) + { + /* I am not playing white */ + param->setType(WHITE, PLAYERTCP); + } + + if((userName.upper() == fields[18].upper()) && + ((fields[19].toInt() == -1) || (fields[19].toInt() == 1))) + { + /* I am playing black */ + param->setType(BLACK, PLAYERLOCAL); + } + else if(fields[19].toInt() != 2) + { + /* I am not playing black */ + param->setType(BLACK, PLAYERTCP); + } + + if(fields[19].toInt() == 2) + { + param->setType(WHITE, PLAYEREXAMINE); + param->setType(BLACK, PLAYEREXAMINE); + } + //param->setVariation(something); figure out how to get the variation + param->setName(WHITE, fields[17]); + param->setName(BLACK, fields[18]); + /* tell core to connect us to a new match */ + fics_to_knights[fields[16].toInt()] = ((core*)myParent)->newMatch(param)->getID(); + } + case PARSE12_MODE_MOVE: + { + fields = QStringList::split( QChar(' '), line, FALSE ); + + /* various ICS stuff for ChessMove */ + move.ICS_ClockTicking = fields[31].toInt(); + move.ICS_PawnPushFile = fields[10].toShort(); + move.ICS_MoveCounter = fields[15].toInt(); + if(fields[9] == "W") + { + move.ICS_OnMove = BLACK; + } + else if( fields[9] == "B" ) + { + move.ICS_OnMove = WHITE; + } + + switch( fields[19].toInt() ) + { + /* Examining a game */ + case 2: + move.ICS_Mode = ICS_Examine; + if(fics_to_knights[fields[16].toInt()] == 0) + { + /* no new game started yet, call parsestyle 12 with a different mode */ + parseStyle12(line, PARSE12_MODE_NEW); + return; + } + break; + /* Observing a game */ + case -2: + case 0: + move.ICS_Mode = ICS_Observe; + break; + /* Playing a game */ + default: + move.ICS_Mode = ICS_Normal; + break; + } + + /* Verbose Coordinate Notation of previous move ( USE AS CAN ) */ + strcpy(move.CAN, fields[27].right(fields[27].length() - 2).replace(QRegExp("-"), "")); + /* SAN */ + strcpy(move.SAN, fields[29].replace(QRegExp("\\+"), "").replace(QRegExp("#"), "")); + + /* fill the line for the command */ + position_line += fields[1]; /* Internal Rank #7 */ + position_line += fields[2]; /* Internal Rank #6 */ + position_line += fields[3]; /* Internal Rank #5 */ + position_line += fields[4]; /* Internal Rank #4 */ + position_line += fields[5]; /* Internal Rank #3 */ + position_line += fields[6]; /* Internal Rank #2 */ + position_line += fields[7]; /* Internal Rank #1 */ + position_line += fields[8]; /* Internal Rank #0 */ + /* Can White Castle Short (boolean) */ + position_line += fields[11]; + /* Can White Castle Long (boolean) */ + position_line += fields[12]; + /* Can Black Castle Short (boolean) */ + position_line += fields[13]; + /* Can Black Castle Long (boolean) */ + position_line += fields[14]; + + Command command(fics_to_knights[fields[16].toInt()], CMD_Move, fields[24].toInt() * 100, + fields[25].toInt() * 100, move); + command.setData(position_line); + emit sendCMD(command); + break; + } + default: + break; + } +} + +/////////////////////////////////////// +// +// io_internet::ParsePlayer +// +/////////////////////////////////////// +//void io_internet::ParsePlayer( QString Handle ) +//{ +// player.Raw = Handle; + /* SysAdmin */ +// if( Handle.contains( QRegExp("\\(\\*\\)") ) ) +// { +// player.SysAdmin = TRUE; +// Handle.replace( QRegExp("\\(\\*\\)"), QString("") ); +// } +// else player.SysAdmin = FALSE; + /* ServiceRep */ +// if( Handle.contains( QRegExp("\\(SR\\)") ) ) +// { +// player.ServiceRep = TRUE; +// Handle.replace( QRegExp("\\(SR\\)"), QString("") ); +// } +// else player.ServiceRep = FALSE; + /* Computer */ +// if( Handle.contains( QRegExp("\\(C\\)") ) ) +// { +// player.Computer = TRUE; +// Handle.replace( QRegExp("\\(C\\)"), QString("") ); +// } +// else player.Computer = FALSE; + /* Unregistered */ +// if( Handle.contains( QRegExp("\\(U\\)") ) ) +// { +// player.Unregistered = TRUE; +// Handle.replace( QRegExp("\\(U\\)"), QString("") ); +// } +// else player.Unregistered = FALSE; +// return; +//} +/////////////////////////////////////// +// +// io_internet::nullifyChallenge +// +/////////////////////////////////////// +void io_internet::nullifyChallenge( void ) +{ + challenge = NULL; +} + +/////////////////////////////////////// +// +// io_internet::declineChallenge +// +/////////////////////////////////////// +void io_internet::declineChallenge( void ) +{ + send( "decline" ); + delete challenge; + challenge = NULL; +} +/////////////////////////////////////// +// +// io_internet::acceptChallenge +// +/////////////////////////////////////// +void io_internet::acceptChallenge( void ) +{ + send( challenge->values() ); + delete challenge; + challenge = NULL; +} + +/////////////////////////////////////// +// +// io_internet::writeToConsole +// +/////////////////////////////////////// +void io_internet::writeToConsole(QString text, QString tag) +{ + lastTag = tag; + /* Remove Bells */ + text.replace( QRegExp("\\x0007") , "" ); + /* Replace misc characters with rich-text friendly counterparts */ + text.replace( QRegExp("\\x003c"), "<" ); + text.replace( QRegExp("\\x007c"), "|" ); + text.replace( QRegExp( "\\f"), ""); + text.replace( QRegExp( "\\n"), ""); + text.replace( QRegExp( "\\r*" ), "" ); + emit sendCMD( Command( 0, CMD_Append_To_Console, "<" + tag + ">" + text + "" ) ); +} + +/////////////////////////////////////// +// +// io_internet::updateSoughtList +// +/////////////////////////////////////// +void io_internet::updateSoughtList(QString soughtLine) +{ + /* "ADS DISPLAYED" MESSAGE */ + if(soughtLine.contains(QRegExp("\\d+\\s+ads? displayed."))) + { + emit sendCMD( Command( 0, CMD_Show_Sought_List ) ); + } + else + { + emit sendCMD( Command( 0, CMD_Add_Sought_Match, soughtLine ) ); + } +} + +/////////////////////////////////////// +// +// io_internet::sendUserSettings() +// +/////////////////////////////////////// +void io_internet::sendUserSettings() +{ + send("set style 12"); + send(QString("set interface Knights %1").arg(_VERSION_)); + send(QString("set private %1").arg(myResource->OPTION_Private)); + send(QString("set kibitz %1").arg(myResource->OPTION_Kibitz)); + send(QString("set tell %1").arg(myResource->OPTION_Tell)); + send(QString("set shout %1").arg(myResource->OPTION_Shout)); + send(QString("set seek %1").arg(myResource->OPTION_Seek)); + send(QString("set tolerance %1").arg(myResource->OPTION_Profanity)); +} + +/////////////////////////////////////// +// +// io_internet::parseMoveList(QString data) +// +/////////////////////////////////////// +void io_internet::parseMoveList(QString line) +{ + QStringList two_plys; + struct ChessMove move; + Command command; + int move_counter = 0; + + /* white */ + two_plys = QStringList::split(QRegExp("\\s+"), line, FALSE); + Command::clearMove(&move); + move_counter = two_plys[0].left(two_plys[0].length() - 1).length(); /* remove the . */ + move.ICS_MoveCounter = move_counter; + move.ICS_Mode = ICS_Movelist; + move.ICS_OnMove = WHITE; + strcpy(move.SAN, two_plys[1]); + command.setCommand((int&)CMD_Move); + command.setID(fics_to_knights[ficsMoveListNumber]); + command.setMove(move); + emit sendCMD(command); + + /* black */ + if(two_plys.size() > 3) + { + Command::clearMove(&move); + move.ICS_MoveCounter = move_counter; + move.ICS_Mode = ICS_Movelist; + move.ICS_OnMove = BLACK; + strcpy(move.SAN, two_plys[3]); + command.setCommand((int&)CMD_Move); + command.setID(fics_to_knights[ficsMoveListNumber]); + command.setMove(move); + emit sendCMD(command); + } +} + +/////////////////////////////////////// +// +// io_internet::sendEndOfGameCommand(QString line) +// +/////////////////////////////////////// +void io_internet::sendEndOfGameCommand(QString line) +{ + QStringList fields; + Command command; + + fields = QStringList::split( QChar(' '), line, FALSE ); + if(fields[1].endsWith(":")) + { + fields[1] = fields[1].left(fields[1].length() - 1); + } + command.setID(fics_to_knights[fields[1].toInt()]); + fields[fields.count() - 1] = fields[fields.count() - 1].stripWhiteSpace(); + if(fields[fields.count() - 1] == "1-0" ) + { + if(fields[fields.count() - 2].contains("resigns")) + { + command.setCommand((int&)CMD_Black_Resign); + } + else if(fields[fields.count() - 2].contains("time")) + { + command.setCommand((int&)CMD_White_Called_Flag); + } + else + { + command.setCommand((int&)CMD_Result_White); + } + } + else if(fields[fields.count() - 1] == "0-1") + { + if(fields[fields.count() - 2].contains("resigns")) + { + command.setCommand((int&)CMD_White_Resign); + } + else if(fields[fields.count() - 2].contains("time")) + { + command.setCommand((int&)CMD_Black_Called_Flag); + } + else + { + command.setCommand((int&)CMD_Result_Black); + } + } + else if(fields[fields.count() - 1] == "1/2-1/2") + { + command.setCommand((int&)CMD_Result_Draw); + } + else + { + command.setCommand((int&)CMD_Lost_Contact); + } + emit sendCMD(command); +} + +/////////////////////////////////////// +// +// io_internet::processSeekTimer() +// +/////////////////////////////////////// +void io_internet::processSeekTimer() +{ + /* timer timed out, send out a sought */ + send("sought"); +} + +/////////////////////////////////////// +// +// io_internet::selfDestruct() +// +/////////////////////////////////////// +void io_internet::selfDestruct() +{ + /* cause the io_internet to delete itself */ + QApplication::postEvent( qApp->mainWidget(), new QCustomEvent( EVENT_Del_IO_Net ) ); +} + +/////////////////////////////////////// +// +// io_internet::setUserInfo() +// +/////////////////////////////////////// +void io_internet::setUserInfo(QString userName, QString passWord) +{ + this->userName = userName; + this->passWord = passWord; +} + diff --git a/knights/io_internet.h b/knights/io_internet.h new file mode 100644 index 0000000..cf56379 --- /dev/null +++ b/knights/io_internet.h @@ -0,0 +1,138 @@ +/*************************************************************************** + io_internet.h - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef IO_INTERNET_H +#define IO_INTERNET_H + +/* Local */ +#include "definitions.h" +#include "io_base.h" +#include "match_param.h" +#include "command.h" + +/* Tabs */ +#include "tabmanager.h" +#include "console.h" +#include "challenge_graph.h" +#include "tab_seeklist.h" + +class KSocket; +class KProcess; +class resource; +class core; +class dlg_login; +class dlg_challenge; + +#include + +/** + *@author Troy Corbin Jr / Alexander Wels. + */ + +struct MatchRecord +{ + int knightsID; + int serverID; + bool observing; + bool examining; + bool finished; +}; + +const int READ_BUFFER_SIZE = 64 * 1024; /* 64k is max ip packet size */ + +const int LOGIN_STAGE_NAME = 1; +const int LOGIN_STAGE_PASSWORD = 2; +const int LOGIN_STAGE_LOGGED_IN = 3; + +const unsigned int NORMAL_MODE = 1; +const unsigned int UPDATE_SOUGHT_MODE = 2; +const unsigned int NEW_GAME_MODE = 3; +const unsigned int OBSERVE_GAME_MODE = 4; +const unsigned int CHALLENGE_MODE = 5; +const unsigned int PARSE_MOVE_LIST_MODE = 6; + +const unsigned int PARSE12_MODE_NEW = 1; +const unsigned int PARSE12_MODE_MOVE = 2; + +typedef QMap TabMap; + +class io_internet : public io_base +{ + Q_OBJECT + public: + io_internet(QWidget *parent = NULL, resource *Rsrc = NULL); + ~io_internet(); + + public slots: + virtual void recvCMD(const Command& command); + void readCommand(KSocket *); + void sendUserName(void); + void sendPassword(void); + void send(const QString&); + void nullifyChallenge( void ); + void acceptChallenge( void ); + void declineChallenge( void ); + void processSeekTimer( void ); + void connectToServer( void ); + void selfDestruct( void ); + void setUserInfo(QString userName, QString passWord); + signals: + virtual void sendCMD(const Command& command); + void setLastPrivateSource( const QString& ); + void setLastChannelSource( const QString& ); + + protected: + void parseLine(QString command); + void parseLoginData(QString command); + void writeToConsole(QString text, QString tag); + void updateSoughtList(QString text); + void parseStyle12(QString line, const unsigned int mode); + void sendUserSettings(void); + void parseMoveList(QString data); + void sendEndOfGameCommand(QString line); + private: + + dlg_login *loginDlg; + dlg_challenge *challenge; + + /* These are used to handle the automagic seek command */ + QTimer *seekTimer; + + /* These are used for the connection & logon */ + QFile *Log; + KSocket *socket; + KProcess *myTimeseal; + struct serverResource *myServer; + int loginStage; + unsigned int parseMode; + QString lastTag; + int ficsMoveListNumber; + QString lineBuffer; + bool connected; + QString userName; + QString passWord; + + /* communication with the server */ + QStringList command_list; /* this is a temp buffer while waiting for the movelist */ + bool waiting_for_move_list; + QMap fics_ids; + QMap fics_to_knights; /* maps fics id's to knights id's */ + TabMap myTabList; /* maintains the list of the tabs currently owned by this io_internet */ + QValueList myCommandBuffer; /* this is a buffer for all the commands io_internet received while not connected to a server */ +}; + +#endif diff --git a/knights/knights.cpp b/knights/knights.cpp new file mode 100644 index 0000000..ae68539 --- /dev/null +++ b/knights/knights.cpp @@ -0,0 +1,1024 @@ +/*************************************************************************** + knights.cpp - description + ------------------- + begin : Thu Mar 1 10:43:51 CST 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +/* Local */ +#include "knights.moc" +#include "core.h" +#include "wiz_setup.h" +#include "pgn.h" +#include "splash.h" +#include "dlg_settings.h" +#include "dlg_newmatch.h" +/* KDE */ +#include +#include +#include +#include +#include +#include +#include +/* KFile */ +#include +/* Qt */ +#include +#include +#include +#include +#include + +Knights::Knights(KCmdLineArgs *Args, QWidget *parent, const char *name) : KMainWindow(parent, name) +{ + InitAll = TRUE; + ResizeFlag = TRUE; + Minimized = FALSE; + args = Args; + SplashScreen = NULL; + setFocusPolicy( ClickFocus ); +} +Knights::~Knights() +{ + if( !InitAll ) + KillAll(); +} +/////////////////////////////////////// +// +// Knights::BirthAll +// +/////////////////////////////////////// +void Knights::BirthAll(void) +{ + SettingsDialog = NULL; + Resource = new resource(args); + + if( Resource->OPTION_Show_Splash ) + SplashScreen = new splash(); + + aboutData = new KAboutData( "knights", I18N_NOOP("Knights"), _VERSION_ ); + topMenu = menuBar(); + myAccel = new Accel( this, Resource->myAccel ); + help = helpMenu(); + fileMenu = new KPopupMenu( this , "fileMenu"); + settingsMenu = new KPopupMenu( this, "settingsMenu"); + matchMenu = new KPopupMenu( this, "matchMenu"); + drawMenu = new KPopupMenu( this, "drawMenu"); + tutorialMenu = new KPopupMenu( this, "tutorialMenu"); + MainFrame = new QFrame( this, "MainFrame" ); + Core = new core( MainFrame, "Core", Resource ); + Message = new QLabel( MainFrame, "Message"); + whiteTimeLabel = new QLabel( MainFrame, "whiteTimeLabel"); + blackTimeLabel = new QLabel( MainFrame, "blackTimeLabel"); + notationBar = new KComboBox( MainFrame, "notationBar"); + + /* Connect all Signals & Slots */ + connect( Core, SIGNAL( requestResize() ), this, SLOT( resizeMainFrame() ) ); + connect( Core, SIGNAL( setStatusBar(const int&, const QString& ) ), this, SLOT( setStatusBar(const int&, const QString& ) ) ); + connect( Core, SIGNAL( setNotation() ), this, SLOT( setNotation() ) ); + connect( Core, SIGNAL( initMatch() ), this, SLOT( initMatch() ) ); + connect( Core, SIGNAL( setClocks() ), this, SLOT( setClocks() ) ); + connect( Core, SIGNAL( serverDestroyed() ), this, SLOT( netConnect() ) ); + connect( notationBar, SIGNAL( activated(int) ), Core, SLOT( review(int) ) ); +} +/////////////////////////////////////// +// +// Knights::menuClose +// +/////////////////////////////////////// +void Knights::menuClose(void) +{ + if( !queryClose() ) + return; + qApp->quit(); +} +/////////////////////////////////////// +// +// Knights::queryClose +// +/////////////////////////////////////// +bool Knights::queryClose(void) +{ + return Core->clearAll(); +} +/////////////////////////////////////// +// +// Knights::KillAll +// +/////////////////////////////////////// +void Knights::KillAll(void) +{ + delete Core; + delete fileMenu; + delete matchMenu; + delete drawMenu; + delete tutorialMenu; + delete settingsMenu; + delete whiteTimeLabel; + delete blackTimeLabel; + delete notationBar; + delete Message; + delete aboutData; + delete MainFrame; + delete myAccel; + delete Resource; + InitAll = TRUE; +} +/////////////////////////////////////// +// +// Knights::init +// +/////////////////////////////////////// +bool Knights::init( void ) +{ + wiz_setup *Wizard; + QColorGroup GroupWhite; + QColorGroup GroupBlack; + + BirthAll(); + SelectTheme(-1,-1); + Resource->setAudio(); + ResizeFlag = FALSE; + + /* + Connect Accelerators + */ + connect( Resource->myAccel, SIGNAL( board_up() ), this, SLOT( boardBigger() ) ); + connect( Resource->myAccel, SIGNAL( board_down() ), this, SLOT( boardSmaller() ) ); + connect( Resource->myAccel, SIGNAL( move_prev() ), this, SLOT( PrevNotation() ) ); + connect( Resource->myAccel, SIGNAL( move_next() ), this, SLOT( NextNotation() ) ); + connect( this, SIGNAL( focus( const QChar& ) ), Resource->myAccel, SIGNAL( focus( const QChar& ) ) ); + + initMenus(); + + /* Init Message */ + Message->setAlignment( Qt::AlignAuto | Qt::AlignVCenter | Qt::SingleLine ); + + /* Init White Time Label */ + GroupWhite.setColor( QColorGroup::Background, Resource->COLOR_White ); + GroupWhite.setColor( QColorGroup::Foreground, Resource->COLOR_Black ); + whiteTimeLabel->setPalette( QPalette( GroupWhite, GroupWhite, GroupWhite ) ); + whiteTimeLabel->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); + whiteTimeLabel->setAlignment( Qt::AlignCenter | Qt::SingleLine ); + + /* Init Black Time Label */ + GroupBlack.setColor( QColorGroup::Background, Resource->COLOR_Black ); + GroupBlack.setColor( QColorGroup::Foreground, Resource->COLOR_White ); + blackTimeLabel->setPalette( QPalette( GroupBlack, GroupBlack, GroupBlack ) ); + blackTimeLabel->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); + blackTimeLabel->setAlignment( Qt::AlignCenter | Qt::SingleLine ); + + /* Configure self */ + setCentralWidget( MainFrame ); + InitAll = FALSE; + resizeMainFrame(); + show(); + setStatusBar( READY ); + + /* Remove the Splash Screen */ + if( SplashScreen != NULL ) + { + delete SplashScreen; + } + + /* Run the Setup Wizard if needed */ + if( Resource->Config_Version < CONFIG_VERSION ) + { + Wizard = new wiz_setup( this, "wiz_setup", Resource ); + Wizard->exec(); + delete Wizard; + resizeMainFrame(); + /* if( !Resource->Accepted_License ) + return FALSE;*/ + Resource->Config_Version = CONFIG_VERSION; + } + + /* Begin loading file from command line */ + if( args->count() ) + { + Core->load( QString( args->arg( 0 ) ) ); + } + else + { + /* Bring up a match or pgn file */ + switch( Resource->OPTION_On_Init ) + { + case MENU_SOLITARE: + Core->newMatch( new match_param( Resource, PLAYERLOCAL, PLAYERLOCAL ) ); + break; + case MENU_VS_PC: + if( Resource->engines.count() ) + { + Core->newMatch( new match_param( Resource, PLAYERLOCAL, PLAYERPC ) ); + } + break; + case MENU_CONNECT: + netConnect(); + break; + default: + break; + } + } + return TRUE; +} +/////////////////////////////////////// +// +// Knights::initMenus +// +/////////////////////////////////////// +void Knights::initMenus( void ) +{ + /* + matchMenu menu + */ + matchMenu->setCheckable(TRUE); + // MENU_DRAW + matchMenu->insertItem( i18n( "&Draw" ), drawMenu, MENU_DRAW ); + matchMenu->setItemEnabled( MENU_DRAW, FALSE ); + // MENU_RETRACT + matchMenu->insertItem( QIconSet( Resource->LoadIcon( QString("undo"), KIcon::Small ) ), + i18n( "&Retract Move" ), Core, SLOT(matchMenu(int)), 0, MENU_RETRACT ); + matchMenu->setItemEnabled( MENU_RETRACT, FALSE ); + matchMenu->setWhatsThis( MENU_RETRACT, i18n( "Select this to retract your last move." ) ); + // MENU_RESIGN + matchMenu->insertItem( i18n( "Resign" ), Core, SLOT(matchMenu(int)), 0, MENU_RESIGN ); + matchMenu->setItemEnabled( MENU_RESIGN, FALSE ); + matchMenu->setWhatsThis( MENU_RESIGN, i18n( "Use this to concede the match to your opponent." ) ); + // MENU_CALL_FLAG + matchMenu->insertItem( i18n( "&Call Flag" ), Core, SLOT(matchMenu(int)), 0, MENU_CALL_FLAG ); + matchMenu->setItemEnabled( MENU_CALL_FLAG, FALSE ); + matchMenu->setWhatsThis( MENU_CALL_FLAG, i18n( "Use this to declare the match over, due to your opponent being out of time." ) ); + // MENU_HINT + matchMenu->insertItem( i18n( "&Hint" ), Core, SLOT(matchMenu(int)), 0, MENU_HINT ); + matchMenu->setItemEnabled( MENU_HINT, FALSE ); + matchMenu->setWhatsThis( MENU_HINT, i18n( "This will ask your opponent for a hint." ) ); + // MENU_MOVE_NOW + matchMenu->insertItem( i18n( "Move &Now" ), Core, SLOT(matchMenu(int)), 0, MENU_MOVE_NOW ); + matchMenu->setItemEnabled( MENU_MOVE_NOW, FALSE ); + matchMenu->setWhatsThis( MENU_MOVE_NOW, i18n( "Clicking this option will force your opponent to move immediately." ) ); + // MENU_ORIENTATION + matchMenu->insertItem( i18n( "&Flip View" ), Core, SLOT(matchMenu(int)), Key_F2, MENU_ORIENTATION ); + matchMenu->setItemEnabled( MENU_ORIENTATION, FALSE ); + matchMenu->setWhatsThis( MENU_ORIENTATION, i18n( "This will reverse the chessboard's orientation by 180 degrees." ) ); + // MENU_PONDER + matchMenu->insertItem( i18n( "&Ponder" ), this, SLOT(Settings(int)), 0, MENU_PONDER ); + matchMenu->setItemChecked( MENU_PONDER, Resource->OPTION_Ponder ); + matchMenu->setItemEnabled( MENU_PONDER, FALSE ); + matchMenu->setWhatsThis( MENU_PONDER, i18n( "This toggles your opponent's ability to think while it's your turn." ) ); + matchMenu->insertSeparator(); + // MENU_PAUSE + matchMenu->insertItem( QIconSet( Resource->LoadIcon( QString("player_pause"), KIcon::Small ) ), + i18n( "Pause" ), this, SLOT( Settings(int) ), Key_F12, MENU_PAUSE ); + matchMenu->setItemEnabled( MENU_PAUSE, FALSE ); + matchMenu->setWhatsThis( MENU_PAUSE, i18n( "Select this to pause the clock for this match." ) ); + /* + drawMenu menu + */ + // MENU_OFFER_DRAW + drawMenu->insertItem( i18n( "&Offer Draw" ), Core, SLOT(matchMenu(int)), 0, MENU_OFFER_DRAW ); + drawMenu->setWhatsThis( MENU_OFFER_DRAW, i18n( "Clicking this will inform your opponent that you are willing draw the match." ) ); + // MENU_ACCEPT_DRAW + drawMenu->insertItem( i18n( "&Accept Draw" ), Core, SLOT(matchMenu(int)), 0, MENU_ACCEPT_DRAW ); + drawMenu->setWhatsThis( MENU_ACCEPT_DRAW, i18n( "Clicking this will accept a draw offered by your opponent." ) ); + // MENU_REJECT_DRAW + drawMenu->insertItem( i18n( "&Reject Draw" ), Core, SLOT(matchMenu(int)), 0, MENU_REJECT_DRAW ); + drawMenu->setWhatsThis( MENU_REJECT_DRAW, i18n( "Clicking this will reject a draw offered by your opponent." ) ); + // MENU_IGNORE_DRAW + drawMenu->insertItem( i18n( "&Ignore Draw" ), Core, SLOT(matchMenu(int)), 0, MENU_IGNORE_DRAW ); + drawMenu->setWhatsThis( MENU_IGNORE_DRAW, i18n( "Clicking this will ignore future draw offers from your opponent." ) ); + /* + fileMenu menu + */ + // MENU_NEWGAME + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("filenew"), KIcon::Small ) ), + i18n( "&New Match..." ), this, SLOT( openNewMatchDialog() ), CTRL+Key_N, MENU_NEWGAME ); + fileMenu->setWhatsThis( MENU_NEWGAME, i18n( "This allows you to begin a new match." ) ); + // MENU_LOAD + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("fileopen"), KIcon::Small ) ), + i18n( "&Load Match..." ), Core, SLOT( load() ), CTRL+Key_L, MENU_LOAD ); + fileMenu->setWhatsThis( MENU_LOAD, i18n( "The Load command will allow you to select a previously saved match and play it again." ) ); + fileMenu->insertSeparator(); + // MENU_SAVE + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("filesave"), KIcon::Small ) ), + i18n( "&Save Match" ), this, SLOT( SaveGame() ), CTRL+Key_S, MENU_SAVE ); + fileMenu->setItemEnabled( MENU_SAVE, FALSE ); + fileMenu->setWhatsThis( MENU_SAVE, i18n( "The Save command will allow you to store a copy of your current match for later use." ) ); + // MENU_SAVEAS + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("filesave"), KIcon::Small ) ), + i18n( "Save Match &As..." ), this, SLOT( SaveGameAs() ), CTRL+Key_A, MENU_SAVEAS ); + fileMenu->setItemEnabled( MENU_SAVEAS, FALSE ); + fileMenu->setWhatsThis( MENU_SAVEAS, i18n( "The Save command will allow you to store a copy of your current match for later use." ) ); + fileMenu->insertSeparator(); + // MENU_CONNECT + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("connect_creating"), KIcon::Small ) ), + i18n( "Connect to Server" ), this, SLOT( netConnect() ), CTRL+Key_C, MENU_CONNECT ); + fileMenu->setWhatsThis( MENU_CONNECT, i18n( "Clicking this will connect Knights with an internet chess server." ) ); + fileMenu->insertSeparator(); + // MENU_PRINT + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("fileprint"), KIcon::Small ) ), + i18n( "&Print Notation..." ), Core, SLOT( print() ), CTRL+Key_P, MENU_PRINT ); + fileMenu->setItemEnabled( MENU_PRINT, FALSE ); + fileMenu->setWhatsThis( MENU_PRINT, i18n( "The Print command will allow you to print this game's notation on your printer." ) ); + fileMenu->insertSeparator(); + // MENU_CLOSE + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("fileclose"), KIcon::Small ) ), + i18n( "&Close Match" ), Core, SLOT( clearMatch() ), CTRL+Key_W, MENU_CLOSE ); + fileMenu->setItemEnabled( MENU_CLOSE, FALSE ); + fileMenu->setWhatsThis( MENU_CLOSE, i18n( "This command removes the current match." ) ); + // MENU_CLOSEALL + fileMenu->insertItem( i18n( "Close All" ), Core, SLOT( clearAll() ), 0, MENU_CLOSEALL ); + fileMenu->setItemEnabled( MENU_CLOSEALL, FALSE ); + fileMenu->setWhatsThis( MENU_CLOSEALL, i18n( "This command will remove all matches that are currently loaded." ) ); + fileMenu->insertSeparator(); + // MENU_QUIT + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("exit"), KIcon::Small ) ), + i18n( "&Quit" ), this, SLOT(menuClose()), CTRL+Key_Q, MENU_QUIT ); + fileMenu->setWhatsThis( MENU_QUIT, i18n( "The Quit command will stop all matches and exit Knights." ) ); + /* + settingsMenu menu + */ + // MENU_INSTALL_THEMES + settingsMenu->insertItem( i18n( "&Install Themes" ), this, SLOT(installThemes()), 0, MENU_INSTALL_THEMES ); + settingsMenu->setWhatsThis( MENU_INSTALL_THEMES, i18n( "This lets you install downloaded themes into Knights." ) ); + // MENU_BINDINGS_DIALOG + settingsMenu->insertItem( QIconSet( Resource->LoadIcon( QString("key_bindings"), KIcon::Small ) ), + i18n( "Configure &Key Bindings..." ), this, SLOT(openKeyBindingDialog()), 0, MENU_BINDINGS_DIALOG ); + settingsMenu->setWhatsThis( MENU_BINDINGS_DIALOG, i18n( "Click this if you want to change the keyboard shortcuts that Knights uses." ) ); + // MENU_SETTINGS_DIALOG + settingsMenu->insertItem( QIconSet( Resource->LoadIcon( QString("configure"), KIcon::Small ) ), + i18n( "&Configure Knights..." ), this, SLOT(openSettingsDialog()), 0, MENU_SETTINGS_DIALOG ); + settingsMenu->setWhatsThis( MENU_SETTINGS_DIALOG, i18n( "This opens a new window which allows you to customize Knights to your particular tastes." ) ); + /* + tutorialMenu menu + */ + tutorialMenu->setCheckable(TRUE); + // MENU_OPEN_TUTORIAL + tutorialMenu->insertItem( i18n( "Begin a Tutorial" ), this, SLOT(Settings(int)), 0, MENU_OPEN_TUTORIAL ); +// tutorialMenu->setWhatsThis( MENU_OPEN_TUTORIAL, i18n( "" ) ); + /* + topMenu menu + */ + topMenu->insertItem( i18n( "&File" ), fileMenu ); + topMenu->insertItem( i18n( "&Match" ), matchMenu ); + topMenu->insertItem( i18n( "&Settings" ), settingsMenu ); +// topMenu->insertItem( i18n( "&Tutorials" ), tutorialMenu ); + topMenu->insertSeparator(); + topMenu->insertItem( i18n( "&Help" ), help ); +} +/////////////////////////////////////// +// +// Knights::resizeMainFrame +// +/////////////////////////////////////// +void Knights::resizeMainFrame(void) +{ + QStyle& Style = QApplication::style(); + QSize S_Message; + QSize S_Menu; + + int statusY(0); + int statusX(0); + int statusHeight(0); + + /* Get some numbers */ + margin = Style.defaultFrameWidth(); + /* Take care of the Core first */ + Core->move( 0, 0 ); + Core->resize(); + /* Get our size hints */ + S_Message = Message->sizeHint(); + S_Menu = topMenu->sizeHint(); + statusHeight = S_Message.height() + ( margin << 1 ); + statusY += Core->height() + margin + statusHeight + margin; + statusX = Core->width(); + + MainFrame->setFixedSize( statusX, statusY ); + setFixedSize( statusX, statusY + S_Menu.height() ); + + /* enable or disable games in the menu */ + if( Resource->servers.count() ) + { + fileMenu->setItemEnabled( MENU_CONNECT, TRUE ); + } + else + { + fileMenu->setItemEnabled( MENU_CONNECT, FALSE ); + } +} +/////////////////////////////////////// +// +// Knights::event +// +/////////////////////////////////////// +bool Knights::event( QEvent *e ) +{ + if( e->type() == EVENT_Del_IO_Net ) + { + netConnect(); + return TRUE; + } + return KMainWindow::event( e ); +} +/////////////////////////////////////// +// +// Knights::resizeEvent +// +/////////////////////////////////////// +void Knights::resizeEvent( QResizeEvent * ) +{ + QSize S_Message; + int tmp(0); + int statusHeight(0); + int statusY(0); + int statusX(0); + int gridX(0); + + if( ResizeFlag ) return; + /* Get the height & Y of the status bar */ + gridX = Core->width() >> 3; + S_Message = Message->sizeHint() + QSize( 2, 2 ); + statusHeight = S_Message.height() + ( margin << 1 ); + Resource->Widget_Height = statusHeight; + statusY += Core->height() + margin; + + if( InitAll ) return; + /* Do the Message box */ + tmp = gridX * 3; + Message->setFixedSize( tmp - ( margin << 1 ), statusHeight ); + Message->move( margin, statusY ); + statusX = tmp; + /* Do the White Time */ + tmp = gridX + ( gridX >> 1 ); + whiteTimeLabel->setFixedSize( tmp - margin, statusHeight ); + whiteTimeLabel->move( statusX, statusY ); + statusX += tmp; + /* Do the Black Time */ + tmp = gridX + ( gridX >> 1 ); + blackTimeLabel->setFixedSize( tmp - margin, statusHeight ); + blackTimeLabel->move( statusX, statusY ); + statusX += tmp; + /* Do the Notation Bar */ + tmp = gridX << 1; + notationBar->setFixedSize( tmp - margin, statusHeight ); + notationBar->move( statusX, statusY ); + statusX += tmp; +} +/////////////////////////////////////// +// +// Knights::keyPressEvent +// +/////////////////////////////////////// +void Knights::keyPressEvent( QKeyEvent *e ) +{ + QChar input; + + if( ( e->state() | Qt::ShiftButton ) == Qt::ShiftButton ) + { + input = e->text().at(0); + if( input.isLetterOrNumber() ) + { + emit focus( input ); + e->accept(); + return; + } + } + e->ignore(); +} +/////////////////////////////////////// +// +// Knights::hideEvent +// +/////////////////////////////////////// +void Knights::hideEvent( QHideEvent* ) +{ + if( !Resource->OPTION_Pause_On_Minimize ) + return; + Core->matchMenu( MENU_PAUSEALL ); + Minimized = TRUE; +} +/////////////////////////////////////// +// +// Knights::showEvent +// +/////////////////////////////////////// +void Knights::showEvent( QShowEvent* ) +{ + if( !Minimized ) + return; + Core->matchMenu( MENU_PAUSEALL ); + Minimized = FALSE; +} +/////////////////////////////////////// +// +// Knights::wheelEvent +// +/////////////////////////////////////// +void Knights::wheelEvent( QWheelEvent *event ) +{ + event->accept(); + if( event->delta() > 0 ) PrevNotation(); + if( event->delta() < 0 ) NextNotation(); +} +/////////////////////////////////////// +// +// Knights::SelectTheme +// +/////////////////////////////////////// +void Knights::SelectTheme( int boardIndex, int chessmenIndex ) +{ + Resource->setTheme( boardIndex, chessmenIndex ); + resizeMainFrame(); +} +/////////////////////////////////////// +// +// Knights::setStatusBar +// +/////////////////////////////////////// +void Knights::setStatusBar( const int &ID, const QString &MSG ) +{ + /* Game comments as specified in http://www.schachprobleme.de/chessml/faq/pgn/ + Section 10: Numeric Annotation Glyphs */ + if( ( ID & COMMENT ) == COMMENT ) + { + Message->setText( pgn::getNAG( ID - COMMENT ) ); + return; + } + /* Knights specific messages */ + switch( ID ) + { + /* Error Codes */ + case BOOK_ERROR_1: + Message->setText( i18n( "Error with white engine" ) ); + KMessageBox::sorry( this, + i18n("You selected %1 to play white,\nbut it can only be used as a book engine.\nPlease select another engine to play white.").arg( MSG ), + i18n("White Engine Problem") ); + break; + case BOOK_ERROR_2: + Message->setText( i18n( "Error with white book engine" ) ); + KMessageBox::sorry( this, + i18n("You selected %1 to play white's book,\nbut it can only be used as a regular engine.\nPlease select another engine to play white's book.").arg( MSG ), + i18n("White Book Engine Problem") ); + break; + case BOOK_ERROR_3: + Message->setText( i18n( "Error with black engine" ) ); + KMessageBox::sorry( this, + i18n("You selected %1 to play black,\nbut it can only be used as a book engine.\nPlease select another engine to play black.").arg( MSG ), + i18n("Black Engine Problem") ); + break; + case BOOK_ERROR_4: + Message->setText( i18n( "Error with black book engine" ) ); + KMessageBox::sorry( this, + i18n("You selected %1 to play black's book,\nbut it can only be used as a regular engine.\nPlease select another engine to play black's book.").arg( MSG ), + i18n("Black Book Engine Problem") ); + break; + case ENGINE_DIED_ERROR: + Message->setText( i18n( "The computer opponent assigned to play %1 has crashed" ).arg( MSG ) ); + break; + case LOAD_ERROR: + Message->setText( i18n( "There was an error while loading the file" ) ); + break; + case SAVE_ERROR: + Message->setText( i18n( "There was an error while saving the file" ) ); + break; + /* Standard Codes */ + case LOAD_OK: + Message->setText( i18n( "Loading complete" ) ); + break; + case SAVE_OK: + Message->setText( i18n( "Saving complete" ) ); + break; + case READING_FILE: + Message->setText( i18n( "Reading File" ) ); + break; + case NO_MOVE_WHILE_REVIEW: + Message->setText( i18n( "Can not move a chessman while reviewing the match" ) ); + break; + case ILLEGAL_MOVE: + Message->setText( i18n( "Illegal Move" ) ); + break; + case WHITE_TURN: + Message->setText( i18n( "White's turn" ) ); + break; + case BLACK_TURN: + Message->setText( i18n( "Black's turn" ) ); + break; + case WHITE_WIN: + Message->setText( i18n( "White wins" ) ); + break; + case BLACK_WIN: + Message->setText( i18n( "Black wins" ) ); + break; + case WHITE_CHECKMATE: + Message->setText( i18n( "Checkmate, White wins" ) ); + break; + case BLACK_CHECKMATE: + Message->setText( i18n( "Checkmate, Black wins" ) ); + break; + case WHITE_RESIGN: + Message->setText( i18n( "White resigns" ) ); + break; + case BLACK_RESIGN: + Message->setText( i18n( "Black resigns" ) ); + break; + case WHITE_FLAG: + Message->setText( i18n( "White's flag fell" ) ); + break; + case BLACK_FLAG: + Message->setText( i18n( "Black's flag fell" ) ); + break; + case WHITE_CALL_FLAG: + Message->setText( i18n( "Black's flag was called, White wins" ) ); + break; + case BLACK_CALL_FLAG: + Message->setText( i18n( "White's flag was called, Black wins" ) ); + break; + case GAME_DRAW: + Message->setText( i18n( "Draw match" ) ); + break; + case GAME_50_MOVES: + Message->setText( i18n( "50 moves rule, draw match" ) ); + break; + case WAITING: + Message->setText( i18n( "Starting computer players, please wait" ) ); + break; + case PAUSED: + Message->setText( i18n( "Match paused" ) ); + break; + case WHITE_DRAW_OFFER: + Message->setText( i18n( "White has offered a draw" ) ); + break; + case BLACK_DRAW_OFFER: + Message->setText( i18n( "Black has offered a draw" ) ); + break; + case LOST_CONTACT: + Message->setText( i18n( "Lost contact with opponent" ) ); + case READY: + default: + Message->setText( i18n( "Ready" ) ); + break; + } +} +/////////////////////////////////////// +// +// Knights::setClocks +// +/////////////////////////////////////// +void Knights::setClocks( void ) +{ + whiteTimeLabel->setText( Core->clock( WHITE ) ); + blackTimeLabel->setText( Core->clock( BLACK ) ); + if( Core->flag( WHITE ) ) + if( Core->blackInput() == PLAYERLOCAL ) + matchMenu->setItemEnabled( MENU_CALL_FLAG, TRUE ); + else + matchMenu->setItemEnabled( MENU_CALL_FLAG, FALSE ); + if( Core->flag( BLACK ) ) + if( Core->whiteInput() == PLAYERLOCAL ) + matchMenu->setItemEnabled( MENU_CALL_FLAG, TRUE ); + else + matchMenu->setItemEnabled( MENU_CALL_FLAG, FALSE ); +} +/////////////////////////////////////// +// +// Knights::setNotation +// +/////////////////////////////////////// +void Knights::setNotation( void ) +{ + QStringList *list; + QStringList::Iterator IT; + int count(0); + + setCaption( Core->caption() ); + notationBar->clear(); + list = Core->notation(); + /* + Several menu items' status changes based upon the availability + of notation data. Therefore, we'll enable & disable those here + since we've gathered the notation data anyway. + */ + if( list == NULL ) + { + /* Disable Save & Print Functions */ + fileMenu->setItemEnabled( MENU_SAVE, FALSE ); + fileMenu->setItemEnabled( MENU_SAVEAS, FALSE ); + fileMenu->setItemEnabled( MENU_PRINT, FALSE ); + matchMenu->setItemEnabled( MENU_RETRACT, FALSE ); + return; + } + if( Core->modified() ) + fileMenu->setItemEnabled( MENU_SAVE, TRUE ); + else + fileMenu->setItemEnabled( MENU_SAVE, FALSE ); + /* Core->onMove is called before it is updated by Match->slot_Move. Because of this, the following + if statement checks for the wrong player's turn. On purpose */ + if( ( Core->inputOnMove() == PLAYERLOCAL ) && ( Core->inputOnMove(TRUE) == PLAYERPC ) && list->count() ) + matchMenu->setItemEnabled( MENU_RETRACT, TRUE ); + else + matchMenu->setItemEnabled( MENU_RETRACT, FALSE ); + fileMenu->setItemEnabled( MENU_SAVEAS, TRUE ); + fileMenu->setItemEnabled( MENU_PRINT, TRUE ); + + /* Create the List */ + for( IT = list->begin(); IT != list->end(); ++IT ) + { + notationBar->insertItem( (*IT), count++ ); + } + notationBar->setCurrentItem( --count ); + delete list; +} +/////////////////////////////////////// +// +// Knights::PrevNotation +// +/////////////////////////////////////// +void Knights::PrevNotation( void ) +{ + int tmp( notationBar->currentItem() - 1 ); + Core->review( tmp ); // Do this before the bounds checking in case this is examine mode + if( tmp < 0 ) + return; + notationBar->setCurrentItem( tmp ); +} +/////////////////////////////////////// +// +// Knights::NextNotation +// +/////////////////////////////////////// +void Knights::NextNotation( void ) +{ + int tmp( notationBar->currentItem() + 1 ); + Core->review( tmp ); // Do this before the bounds checking in case this is examine mode + if( tmp > ( notationBar->count() - 1 ) ) + return; + notationBar->setCurrentItem( tmp ); +} +/////////////////////////////////////// +// +// Knights::initMatch +// +/////////////////////////////////////// +void Knights::initMatch( void ) +{ + setNotation(); + + /* Are there any players? ( ie - is this a match or a null? */ + if( ( Core->whiteInput() == Null ) || ( Core->blackInput() == Null ) ) + { + fileMenu->setItemEnabled( MENU_CLOSE, FALSE ); + fileMenu->setItemEnabled( MENU_CLOSEALL, FALSE ); + matchMenu->setItemEnabled( MENU_ORIENTATION, FALSE ); + whiteTimeLabel->setText( "" ); + blackTimeLabel->setText( "" ); + setStatusBar( READY ); + } + else + { + fileMenu->setItemEnabled( MENU_CLOSE, TRUE ); + fileMenu->setItemEnabled( MENU_CLOSEALL, TRUE ); + matchMenu->setItemEnabled( MENU_ORIENTATION, TRUE ); + } + + /* Is there a local player? */ + if( ( Core->whiteInput() == PLAYERLOCAL ) || ( Core->blackInput() == PLAYERLOCAL ) ) + { + matchMenu->setItemEnabled( MENU_DRAW, TRUE ); + matchMenu->setItemEnabled( MENU_RESIGN, TRUE ); + /* Is there also a PC player? */ + if( ( Core->whiteInput() == PLAYERPC ) || ( Core->blackInput() == PLAYERPC ) ) + { + } + } + else + { + matchMenu->setItemEnabled( MENU_DRAW, FALSE ); + matchMenu->setItemEnabled( MENU_RESIGN, FALSE ); + } + /* Is there a PC player? */ + if( ( Core->whiteInput() == PLAYERPC ) || ( Core->blackInput() == PLAYERPC ) ) + { + matchMenu->setItemEnabled( MENU_MOVE_NOW, TRUE ); + matchMenu->setItemEnabled( MENU_HINT, TRUE ); + matchMenu->setItemEnabled( MENU_PONDER, TRUE ); + matchMenu->setItemEnabled( MENU_PAUSE, TRUE ); + } + else + { + matchMenu->setItemEnabled( MENU_MOVE_NOW, FALSE ); + matchMenu->setItemEnabled( MENU_HINT, FALSE ); + matchMenu->setItemEnabled( MENU_PONDER, FALSE ); + matchMenu->setItemEnabled( MENU_PAUSE, FALSE ); + } + /* Is there a TCP player? */ +// if( ( Core->whiteInput() == PLAYERTCP ) || ( Core->blackInput() == PLAYERTCP ) ) +// { +// } +// else +// { +// } +} +/////////////////////////////////////// +// +// Knights::netConnect +// +/////////////////////////////////////// +void Knights::netConnect( void ) +{ + if(Core->isOnline()) + { + fileMenu->changeItem( MENU_CONNECT, QIconSet( Resource->LoadIcon( QString("connect_creating"), + KIcon::Small ) ), i18n( "Connect to Server" )); + Core->goOffline(); + setCursor( Resource->CURSOR_Standard ); + } + else + { + fileMenu->changeItem( MENU_CONNECT, QIconSet( Resource->LoadIcon( QString("connect_no"), + KIcon::Small ) ), i18n( "Disconnect from Server" ) ); + /* + By passing Null as the ID, we're telling core that we're + creating a new internetio, not reusing an exsisting one. + */ + Core->createNewIO( PLAYERTCP, Null); + } +} +/////////////////////////////////////// +// +// Knights::openSettingsDialog +// +/////////////////////////////////////// +void Knights::openSettingsDialog( void ) +{ + SettingsDialog = new dlg_settings( this, "settings", Resource ); + connect( SettingsDialog, SIGNAL( themeChanged(int,int) ), this, SLOT( SelectTheme(int,int) ) ); + connect( SettingsDialog, SIGNAL( redrawBoard() ), Core, SLOT( resize() ) ); + connect( SettingsDialog, SIGNAL( resetServer() ), Core, SLOT( resetServer() ) ); + connect( this, SIGNAL( themesAdded() ), SettingsDialog, SLOT( slotThemesAdded() ) ); + SettingsDialog->show(); +} +/////////////////////////////////////// +// +// Knights::openNewMatchDialog +// +/////////////////////////////////////// +void Knights::openNewMatchDialog( void ) +{ + NewMatch = new dlg_newmatch( this, "NewMatch", Resource ); + connect( NewMatch, SIGNAL( okClicked() ), this, SLOT( newMatch() ) ); + NewMatch->show(); +} +/////////////////////////////////////// +// +// Knights::newMatch +// +/////////////////////////////////////// +void Knights::newMatch( void ) +{ + Core->newMatch( NewMatch->paramaters() ); +} +/////////////////////////////////////// +// +// Knights::openKeyBindingDialog +// +/////////////////////////////////////// +void Knights::openKeyBindingDialog( void ) +{ + KKeyDialog::configureKeys( myAccel, TRUE, this ); +} +/////////////////////////////////////// +// +// Knights::Settings +// +/////////////////////////////////////// +void Knights::Settings(int opt) +{ + switch(opt) + { + case MENU_PONDER: + Resource->OPTION_Ponder = 1 - Resource->OPTION_Ponder; + matchMenu->setItemChecked(MENU_PONDER, Resource->OPTION_Ponder ); + Core->matchMenu( MENU_PONDER ); + break; + case MENU_PAUSE: + if( Core->paused() ) + { + matchMenu->changeItem( MENU_PAUSE, + QIconSet( Resource->LoadIcon( QString("player_pause"), KIcon::Small ) ), + i18n( "Pause" ) ); + } + else + { + matchMenu->changeItem( MENU_PAUSE, + QIconSet( Resource->LoadIcon( QString("1rightarrow"), KIcon::Small ) ), + i18n( "Resume" ) ); + } + Core->matchMenu( MENU_PAUSE ); + break; + default: + break; + } +} +/////////////////////////////////////// +// +// Knights::SaveGame & Variants +// +/////////////////////////////////////// +bool Knights::SaveGame( void ) +{ + /* We use 'Null' to indicate the current match */ + return Core->save( Null, FALSE, FALSE ); +} +bool Knights::SaveGamePrompt( void ) +{ + return Core->save( Null, TRUE, FALSE ); +} +bool Knights::SaveGameAs( void ) +{ + return Core->save( Null, FALSE, TRUE ); +} +/////////////////////////////////////// +// +// Knights::boardBigger +// +/////////////////////////////////////// +void Knights::boardBigger( void ) +{ + Resource->resizeTheme( Resource->ThemeSize + 8 ); + resizeMainFrame(); +} +/////////////////////////////////////// +// +// Knights::boardSmaller +// +/////////////////////////////////////// +void Knights::boardSmaller( void ) +{ + Resource->resizeTheme( Resource->ThemeSize - 8 ); + resizeMainFrame(); +} + +/////////////////////////////////////// +// +// Knights::installThemes +// +/////////////////////////////////////// +void Knights::installThemes( void ) +{ + bool localFlag(FALSE); + bool installError(FALSE); + unsigned int loop; + QString allerror; + QString fileFilter( "KB* KC* KS*|" ); + fileFilter += i18n( "Knights Themes" ); + KURL::List files = KFileDialog::getOpenURLs( QString::null, fileFilter, this, i18n( "Install Theme..." ) ); + for( loop = 0; loop < files.count(); loop++ ) + { + /* Try writing to the global theme dir */ + if( !KIO::NetAccess::copy( files[loop], KURL( QString( Resource->themeDir() + files[loop].filename() ) ) ) ) + { + /* Nope... Try a local .knights dir */ + allerror += "\n\n" + QString( Resource->themeDir() + files[loop].filename() ) + + " - " + KIO::NetAccess::lastErrorString(); + if( !KIO::NetAccess::exists( KURL( QString( QDir::homeDirPath() + "/.knights" ) ) ) ) + { + /* Create local .knights dir */ + KIO::NetAccess::mkdir( KURL( QString( QDir::homeDirPath() + "/.knights" ) ) ); + } + if( !KIO::NetAccess::copy( files[loop], KURL( QString( QDir::homeDirPath() + "/.knights/" + files[loop].filename() ) ) ) ) + { + /* Nope, can't copy it anywhere */ + installError = TRUE; + allerror += "\n\n" + QString( QDir::homeDirPath() + "/.knights/" + + files[loop].filename() ) + " - " + KIO::NetAccess::lastErrorString(); + } + else + { + localFlag = TRUE; + } + } + } + if( localFlag ) + { + KMessageBox::sorry( this, + i18n("You do not have permission to install this theme systemwide, so Knights installed it locally."), + i18n("Installed theme locally") ); + } + if( installError ) + { + KMessageBox::sorry( this, + i18n("The theme could not be installed:\n%1").arg( allerror ), + i18n("Can not install theme") ); + } + return; +} diff --git a/knights/knights.desktop b/knights/knights.desktop new file mode 100644 index 0000000..603108c --- /dev/null +++ b/knights/knights.desktop @@ -0,0 +1,16 @@ +[Desktop Entry] +Type=Application +Exec=knights +Icon=knights.png +MiniIcon=knights.png +Name=Knights +Name[de]=Knights +Comment=A graphical chess interface +Comment[de]=A graphical chess interface +InitialPreference=1 +MimeType=application/x-chess-pgn,Application +ServiceTypes= +DocPath=knights/index.html +Terminal=false + + diff --git a/knights/knights.h b/knights/knights.h new file mode 100644 index 0000000..a17aaa6 --- /dev/null +++ b/knights/knights.h @@ -0,0 +1,145 @@ +/*************************************************************************** + knights.h - description + ------------------- + begin : Thu Mar 1 10:43:51 CST 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNIGHTS_H +#define KNIGHTS_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +/* KDEBase */ +#include +#include +#include +#include +#include +#include +/* QT */ +#include +#include +#include +#include +/* Local */ +#include "definitions.h" +#include "resource.h" +#include "accel.h" + +class KMenuBar; +class KPopupMenu; +class KComboBox; +class QLabel; +class QFrame; +class dlg_settings; +class dlg_newmatch; +class core; +class splash; + +/** + Knights is the top-level widget of the project. + It is responsable for creating the menu bar and it's contents, + as well as creating an instance of the game itself ( class Grid ) +**/ +class Knights : public KMainWindow +{ + Q_OBJECT + public: + KAboutData *aboutData; + resource *Resource; + + Knights( KCmdLineArgs *Args, QWidget* parent=0, const char *name=0 ); + ~Knights(); + bool init( void ); + void initMenus( void ); + void BirthAll( void ); + void keyPressEvent( QKeyEvent* ); + + public slots: + void KillAll( void ); + void menuClose( void ); + /** Yeah, they're sloppy, but I need my own geometry managment routines + because I don't like the "default" look my statusbar was getting + ( double-height ). Plus, I want the console to appear only when needed. */ + void resizeMainFrame( void ); + + bool event( QEvent* ); + void resizeEvent( QResizeEvent* ); + void hideEvent( QHideEvent* ); + void showEvent( QShowEvent* ); + void wheelEvent( QWheelEvent* ); + + void setStatusBar( const int &ID, const QString& MSG=QString::null ); + + void setClocks( void ); + void initMatch( void ); + + void setNotation( void ); + void PrevNotation( void ); + void NextNotation( void ); + + void SelectTheme( int boardIndex, int chessmenIndex ); + void Settings( int opt ); + void openSettingsDialog( void ); + void openNewMatchDialog( void ); + void openKeyBindingDialog( void ); + bool SaveGame( void ); + bool SaveGamePrompt( void ); + bool SaveGameAs( void ); + + void netConnect( void ); + + signals: + void themesAdded( void ); + void focus( const QChar& ); + + protected: + bool queryClose( void ); + + protected slots: + void boardSmaller( void ); + void boardBigger( void ); + void installThemes( void ); + void newMatch( void ); + + private: + KCmdLineArgs *args; + KMenuBar *topMenu; + KPopupMenu *help; + KPopupMenu *fileMenu; + KPopupMenu *settingsMenu; + KPopupMenu *matchMenu; + KPopupMenu *drawMenu; + KPopupMenu *tutorialMenu; + KComboBox *notationBar; + QFrame *MainFrame; + QLabel *whiteTimeLabel; + QLabel *blackTimeLabel; + QLabel *Message; + dlg_settings *SettingsDialog; + dlg_newmatch *NewMatch; + core *Core; + splash *SplashScreen; + Accel *myAccel; + + int NotationIndex; + bool InitAll; + bool Minimized; + bool ResizeFlag; + int margin; +}; + +#endif diff --git a/knights/knightsmap.h b/knights/knightsmap.h new file mode 100644 index 0000000..a3b1d3d --- /dev/null +++ b/knights/knightsmap.h @@ -0,0 +1,178 @@ +/*************************************************************************** + knightsmap.h - description + ------------------- + begin : Sun Aug 25 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include + +#ifndef KNIGHTSMAP_H +#define KNIGHTSMAP_H + +/** + *@author Troy Corbin Jr. + */ + +template +class KnightsMap +{ +public: + typedef Key KeyType; + typedef T DataType; + typedef struct Pair + { + KeyType key; + DataType data; + }; + +private: + QValueList pairList; + + Key searchKey; + unsigned int searchIndex; + T nullValue; + T tempValue; + +public: + /* + Constructor + */ + KnightsMap() + { + nullValue = 0; + clear(); + } + + /* + Destructor + */ + ~KnightsMap() + { clear(); } + + /* + Returns the number of items in the map + */ +unsigned int count( void ) + { return pairList.count(); } + + /* + Clears the map + */ +void clear( void ) + { + searchIndex = 0; + pairList.clear(); + } + + /* + Add a Key/Value pair to the map + */ +void add( KeyType key, DataType data ) + { + Pair newPair; + newPair.key = key; + newPair.data = data; + pairList.append( newPair ); + } + + /* + Return the next Value associated with the Key given + in the last call to 'find'. If there are none, then + NULL is returned. + */ +T& findNext( void ) + { + unsigned int maxIndex( pairList.count() ); + for( ; searchIndex < maxIndex ; searchIndex++ ) + { + if( searchKey != pairList[searchIndex].key ) + { + continue; + } + return pairList[searchIndex++].data; + } + return nullValue; + } + + /* + Lookup a Value by it's key. This will always return + the first Value that's associated with the given Key. + If no Value has the given Key, NULL is returned. + */ +T& find( KeyType key ) + { + searchKey = key; + searchIndex = 0; + return findNext(); + } + + /* Removes all Values that are associated with Key */ +T& remove( KeyType key ) + { + QValueListIterator IT( pairList.begin() ); + while( IT != pairList.end() ) + { + if( (*IT).key == key ) + { + tempValue = (*IT).data; + IT = pairList.remove( IT ); + return tempValue; + } + IT++; + } + return nullValue; + } + + /* Return the Value stored at Index i */ +T& operator[]( unsigned int i ) + { return pairList[i].data; } + + /* Return the Key stored at Index i */ +Key& keyAt( unsigned int i ) + { return pairList[i].key; } + + /* + Return the Value stored one Index position previous + to the last returned search Value. If already at the + begining of the Map, then NULL is returned. + */ +T& operator--( void ) + { + if( searchIndex > 1 ) + { + searchIndex -= 2; + } + else + { + return nullValue; + } + return pairList[searchIndex++].data; + } + + /* + Return the Value stored one Index position after + the last returned search Value. If already at the + end of the Map, then NULL is returned. + */ +T& operator++( void ) + { + if( searchIndex >= count() ) + { + return nullValue; + } + return pairList[searchIndex++].data; + } +}; + +#endif diff --git a/knights/knightspixcache.cpp b/knights/knightspixcache.cpp new file mode 100644 index 0000000..5f7a26e --- /dev/null +++ b/knights/knightspixcache.cpp @@ -0,0 +1,156 @@ +/*************************************************************************** + knightspixcache.cpp - description + ------------------- + begin : Mon Aug 20 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knightspixcache.h" +#include "definitions.h" + +KnightsPixCache::KnightsPixCache() +{ + bytesTotal = 1024 * 1024; + bytesUsed = 0; +} +KnightsPixCache::~KnightsPixCache() +{ + clear(); + bytesUsed = 0; +} +/////////////////////////////////////// +// +// KnightsPixCache::cacheLimit +// +/////////////////////////////////////// +unsigned int KnightsPixCache::cacheLimit( void ) +{ + return ( bytesTotal / 1024 ); +} +/////////////////////////////////////// +// +// KnightsPixCache::setCacheLimit +// +/////////////////////////////////////// +void KnightsPixCache::setCacheLimit( const unsigned int &limit ) +{ + bytesTotal = limit * 1024; +} +/////////////////////////////////////// +// +// KnightsPixCache::clear +// +/////////////////////////////////////// +void KnightsPixCache::clear( void ) +{ + list.clear(); +} +/////////////////////////////////////// +// +// KnightsPixCache::cleanCache +// +/////////////////////////////////////// +void KnightsPixCache::cleanCache( const unsigned int &space ) +{ + pixmapList::Iterator tmpIT; + register unsigned int age; + + while( bytesUsed + space > bytesTotal ) + { + if( list.count() == 0 ) return; + age = 0; + for( IT = list.begin(); IT != list.end(); ++IT ) + { + if( (*IT).age > age ) + { + age = (*IT).age; + tmpIT = IT; + } + } + bytesUsed -= (*tmpIT).bytes; + list.remove( tmpIT ); + } +} +/////////////////////////////////////// +// +// KnightsPixCache::add +// +/////////////////////////////////////// +void KnightsPixCache::add( const QString &label, const QPixmap &pixmap ) +{ + unsigned int tmp; + cacheItem newItem; + + if( pixmap.isNull() ) + return; + tmp = ( pixmap.width() * pixmap.height() * pixmap.depth() ) >> 3; + if( ( bytesUsed + tmp ) > bytesTotal ) + cleanCache(tmp); + + newItem.label = label; + newItem.bytes = tmp; + newItem.item = pixmap; + newItem.age = 0; + list.append( newItem ); + bytesUsed += tmp; +} +/////////////////////////////////////// +// +// KnightsPixCache::find +// +/////////////////////////////////////// +bool KnightsPixCache::find( const QString &label, QPixmap &pixmap ) +{ + bool status(FALSE); + for( IT = list.begin(); IT != list.end(); ++IT ) + { + if( (*IT).label == label ) + { + pixmap = (*IT).item; + (*IT).age = 0; + status = TRUE; + } + else + (*IT).age++; + } + return status; +} +/////////////////////////////////////// +// +// KnightsPixCache::resize +// +/////////////////////////////////////// +void KnightsPixCache::resize( const int &size ) +{ + SquareLight.convertFromImage( Orig_SquareLight.smoothScale( size, size ) ); + SquareDark.convertFromImage( Orig_SquareDark.smoothScale( size, size ) ); + HighlightSelect.convertFromImage( Orig_HighlightSelect.smoothScale( size, size ) ); + HighlightMove.convertFromImage( Orig_HighlightMove.smoothScale( size, size ) ); + HighlightAttack.convertFromImage( Orig_HighlightAttack.smoothScale( size, size ) ); + BlackKing.convertFromImage( Orig_BlackKing.smoothScale( size, size ) ); + BlackQueen.convertFromImage( Orig_BlackQueen.smoothScale( size, size ) ); + BlackBishop.convertFromImage( Orig_BlackBishop.smoothScale( size, size ) ); + BlackKnight.convertFromImage( Orig_BlackKnight.smoothScale( size, size ) ); + BlackRook.convertFromImage( Orig_BlackRook.smoothScale( size, size ) ); + BlackPawn.convertFromImage( Orig_BlackPawn.smoothScale( size, size ) ); + WhiteKing.convertFromImage( Orig_WhiteKing.smoothScale( size, size ) ); + WhiteQueen.convertFromImage( Orig_WhiteQueen.smoothScale( size, size ) ); + WhiteBishop.convertFromImage( Orig_WhiteBishop.smoothScale( size, size ) ); + WhiteKnight.convertFromImage( Orig_WhiteKnight.smoothScale( size, size ) ); + WhiteRook.convertFromImage( Orig_WhiteRook.smoothScale( size, size ) ); + WhitePawn.convertFromImage( Orig_WhitePawn.smoothScale( size, size ) ); + Border.convertFromImage( Orig_Border.smoothScale( size * 9, size * 9) ); + BorderLightOn.convertFromImage( Orig_BorderLightOn.smoothScale( size / 2, size / 2) ); + BorderLightOff.convertFromImage( Orig_BorderLightOff.smoothScale( size / 2, size / 2) ); + return; +} diff --git a/knights/knightspixcache.h b/knights/knightspixcache.h new file mode 100644 index 0000000..75b9cc7 --- /dev/null +++ b/knights/knightspixcache.h @@ -0,0 +1,104 @@ +/*************************************************************************** + knightspixcache.h - description + ------------------- + begin : Mon Aug 20 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNIGHTSPIXCACHE_H +#define KNIGHTSPIXCACHE_H + +#include +#include +#include + +/** + *@author Troy Corbin Jr. + */ + +typedef struct cacheItem +{ + QString label; + QPixmap item; + unsigned int bytes; + unsigned int age; +}; + +typedef QValueList pixmapList; + +class KnightsPixCache +{ + public: + QPixmap SquareLight; + QPixmap SquareDark; + QPixmap HighlightSelect; + QPixmap HighlightMove; + QPixmap HighlightAttack; + QPixmap BlackKing; + QPixmap BlackQueen; + QPixmap BlackBishop; + QPixmap BlackKnight; + QPixmap BlackRook; + QPixmap BlackPawn; + QPixmap WhiteKing; + QPixmap WhiteQueen; + QPixmap WhiteBishop; + QPixmap WhiteKnight; + QPixmap WhiteRook; + QPixmap WhitePawn; + QPixmap Border; + QPixmap BorderLightOn; + QPixmap BorderLightOff; + + QImage Orig_SquareLight; + QImage Orig_SquareDark; + QImage Orig_HighlightSelect; + QImage Orig_HighlightMove; + QImage Orig_HighlightAttack; + QImage Orig_BlackKing; + QImage Orig_BlackQueen; + QImage Orig_BlackBishop; + QImage Orig_BlackKnight; + QImage Orig_BlackRook; + QImage Orig_BlackPawn; + QImage Orig_WhiteKing; + QImage Orig_WhiteQueen; + QImage Orig_WhiteBishop; + QImage Orig_WhiteKnight; + QImage Orig_WhiteRook; + QImage Orig_WhitePawn; + QImage Orig_Border; + QImage Orig_BorderLightOn; + QImage Orig_BorderLightOff; + + KnightsPixCache(); + ~KnightsPixCache(); + void clear( void ); + void setCacheLimit( const unsigned int &limit ); + unsigned int cacheLimit( void ); + void add( const QString &label, const QPixmap &pixmap ); + bool find( const QString &label, QPixmap &pixmap); + void resize( const int &size ); + + private: + + pixmapList list; + pixmapList::Iterator IT; + + unsigned int bytesUsed; + unsigned int bytesTotal; + + void cleanCache( const unsigned int &space ); +}; + +#endif diff --git a/knights/knightstextview.cpp b/knights/knightstextview.cpp new file mode 100644 index 0000000..dc14936 --- /dev/null +++ b/knights/knightstextview.cpp @@ -0,0 +1,238 @@ +/*************************************************************************** + knightstextview.cpp - description + ------------------- + begin : Sun Dec 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "knightstextview.moc" +#include "definitions.h" +#include "resource.h" +#include +#include +#include +#include +#include + +// Used for printing functionality +#include +#include +#include +#include +#include + +KnightsTextView::KnightsTextView(QWidget *parent, resource *Rsrc ) : QTextBrowser(parent) +{ + myResource = Rsrc; + setReadOnly( TRUE ); + setTextFormat( Qt::RichText ); + menuView = new KPopupMenu( this ); + /* + Configure functions in the View right click menu + */ + menuView->insertItem( QIconSet( Rsrc->LoadIcon( QString("editcopy"), KIcon::Small ) ), + i18n( "&Copy" ), this, SLOT( menuFunct(int) ), CTRL+Key_C, MENU_COPY ); + menuView->insertItem( i18n("Select &All"), this, SLOT( menuFunct(int) ), CTRL+Key_A, MENU_SELECT_ALL ); + menuView->insertSeparator(); + menuView->insertItem( QIconSet( Rsrc->LoadIcon( QString("fileprint"), KIcon::Small ) ), + i18n( "&Print" ), this, SLOT( menuFunct(int) ), CTRL+Key_P, MENU_PRINT ); +// menuView->insertItem( QIconSet( Rsrc->LoadIcon( QString("find"), KIcon::Small ) ), +// i18n( "&Find" ), this, SLOT( menuFunct(int) ), CTRL+Key_F, MENU_FIND ); +// menuView->insertItem( QIconSet( Rsrc->LoadIcon( QString("next"), KIcon::Small ) ), +// i18n( "Find &Next" ), this, SLOT( menuFunct(int) ), Key_F3, MENU_FIND_NEXT ); +// menuView->insertSeparator(); + menuView->insertSeparator(); + menuView->insertItem( QIconSet( Rsrc->LoadIcon( QString("viewmag+"), KIcon::Small ) ), + i18n( "Zoom &In" ), this, SLOT( menuFunct(int) ), 0, MENU_ZOOM_IN ); + menuView->insertItem( QIconSet( Rsrc->LoadIcon( QString("viewmag-"), KIcon::Small ) ), + i18n( "Zoom &Out" ), this, SLOT( menuFunct(int) ), 0, MENU_ZOOM_OUT ); + + /* disconnect the linkClicked signal so we can replace it with our own */ + disconnect(this, SIGNAL(linkClicked(const QString&)),this ,0); + /* connect the linkClicked signal to displayLink slot */ + connect(this, SIGNAL(linkClicked(const QString&)), this, SLOT(displayLink(const QString&))); + + show(); +} + +KnightsTextView::~KnightsTextView() +{ + delete menuView; +} + +/////////////////////////////////////// +// +// KnightsTextView::viewportMousePressEvent +// +/////////////////////////////////////// +void KnightsTextView::viewportMousePressEvent( QMouseEvent *e ) +{ + if( e->button() == RightButton ) + { + emit rightButtonClicked( e->globalPos() ); + display_menuView( e->globalPos() ); + } + QTextEdit::viewportMousePressEvent( e ); +} +/////////////////////////////////////// +// +// KnightsTextView::display_menuView +// +/////////////////////////////////////// +void KnightsTextView::display_menuView( const QPoint &Pos ) +{ + if( hasSelectedText() ) + { + menuView->setItemEnabled( MENU_COPY, TRUE ); + } + else + { + menuView->setItemEnabled( MENU_COPY, FALSE ); + } + menuView->popup( Pos ); +} +/////////////////////////////////////// +// +// KnightsTextView::menuFunct +// +/////////////////////////////////////// +void KnightsTextView::menuFunct( int funct ) +{ + switch( funct ) + { + case MENU_COPY: + copy(); + break; + case MENU_SELECT_ALL: + selectAll(); + break; + case MENU_ZOOM_IN: + zoomIn(); + break; + case MENU_ZOOM_OUT: + zoomOut(); + break; + case MENU_PRINT: + print(); + break; + default: + break; + } +} +/////////////////////////////////////// +// +// KnightsTextView::pageMove +// +/////////////////////////////////////// +void KnightsTextView::pageMove( Qt::Key key ) +{ + int NewY; + if( key == Key_PageUp ) + { + NewY = contentsY() - visibleHeight(); + if( NewY < 0 ) + NewY = 0; + } + else + { + NewY = contentsY() + visibleHeight(); + if( NewY > ( contentsHeight() - visibleHeight() ) ) + NewY = contentsHeight() - visibleHeight(); + } + setContentsPos( 0, NewY ); + updateContents( 0, NewY, visibleWidth(), visibleHeight() ); +} + +/////////////////////////////////////// +// +// KnightsTextView::displayLink(QString url) +// +/////////////////////////////////////// +void KnightsTextView::displayLink(const QString& urlString) +{ + KURL url(urlString); + new KRun(url); +} + +/////////////////////////////////////// +// +// KnightsTextView::print +// +/////////////////////////////////////// +void KnightsTextView::print( void ) +{ + KPrinter printer( true, QPrinter::ScreenResolution ); + viewport()->setCursor( waitCursor ); + + /* Make sure we want to print */ + if( printer.setup() ) + { + QPainter paint( &printer ); + QPaintDeviceMetrics pageMetrics( paint.device() ); + + /* Setup sizes */ + int dpix = pageMetrics.logicalDpiX(); + int dpiy = pageMetrics.logicalDpiY(); + const int margin = 36; // pt + QRect body( margin * dpix / 72, margin * dpiy / 72, + pageMetrics.width() - margin * dpix / 72 * 2, + pageMetrics.height() - margin * dpiy / 72 * 2 ); + QRect view( body ); + + printer.setFullPage( true ); + printer.setCreator( "Knights" ); + QSimpleRichText simpText( this->text(), this->font() ); + simpText.setWidth( view.width() ); + + /* Count Pages */ + int currentPage = 1; + int totalPages = simpText.height() / view.height(); + if( view.height() * totalPages < simpText.height() ) + { + totalPages++; + } + + /* Print */ + while( 1 ) + { + /* Print the Contents */ + paint.setClipRect( body ); + simpText.draw( &paint, body.left(), body.top(), view, colorGroup() ); + paint.setClipping( false ); + view.moveBy( 0, body.height() ); + paint.translate( 0, -body.height() ); + + /* Print the Page Number */ + paint.setFont( myResource->FONT_Standard ); + paint.setPen( myResource->COLOR_Black ); + QString pageCount = i18n( "Page %1 of %2" ).arg( currentPage ).arg( totalPages ); + paint.drawText( view.width() - paint.fontMetrics().width( pageCount ), + view.bottom() + paint.fontMetrics().ascent() + 5, pageCount ); + if( view.top() >= simpText.height() ) + { + break; + } + printer.newPage(); + currentPage++; + } + } + + /* Restore Playground */ + viewport()->unsetCursor(); +} + +void QTextBrowser::setSource(const QString&) +{ + /* overwrote this to stop clicked links from clearing the + console */ +} diff --git a/knights/knightstextview.h b/knights/knightstextview.h new file mode 100644 index 0000000..f76db25 --- /dev/null +++ b/knights/knightstextview.h @@ -0,0 +1,54 @@ +/*************************************************************************** + knightstextview.h - description + ------------------- + begin : Sun Dec 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef KNIGHTSTEXTVIEW_H +#define KNIGHTSTEXTVIEW_H + +#include +#include + +/** + *@author Troy Corbin Jr./Alexander Wels + */ + +class KPopupMenu; +class resource; + +class KnightsTextView : public QTextBrowser +{ + Q_OBJECT + public: + KnightsTextView(QWidget *parent, resource *Rsrc ); + ~KnightsTextView(); + void pageMove( Qt::Key key=Key_PageUp ); + + public slots: + void display_menuView( const QPoint& ); + void menuFunct( int ); + void displayLink(const QString& urlString); + void print( void ); + + signals: + void rightButtonClicked( const QPoint& ); + + protected: + void viewportMousePressEvent( QMouseEvent *e ); + resource *myResource; + KPopupMenu *menuView; +}; + +#endif diff --git a/knights/list_pgn.cpp b/knights/list_pgn.cpp new file mode 100644 index 0000000..57be536 --- /dev/null +++ b/knights/list_pgn.cpp @@ -0,0 +1,145 @@ +/*************************************************************************** + list_pgn.cpp - description + ------------------- + begin : Thu Dec 13 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "list_pgn.moc" +#include +#include +#include +#include +#include "resource.h" +#include "match_param.h" + +list_pgn::list_pgn(QWidget *parent, const char *name) : QVBox(parent,name) +{ + listView = new KListView( this, "listView" ); + listView->addColumn( i18n( "Result" ) ); + listView->addColumn( i18n( "White" ) ); + listView->addColumn( i18n( "Black" ) ); + listView->addColumn( i18n( "Round" ) ); + listView->addColumn( i18n( "Site" ) ); + listView->addColumn( i18n( "Date" ) ); + listView->setSorting( 1 ); + listView->setAllColumnsShowFocus( TRUE ); + listView->setMultiSelection( FALSE ); + listView->setShowSortIndicator( TRUE ); + listView->restoreLayout( kapp->config(), "PGN_ListView" ); + listView->show(); + connect( listView, SIGNAL( executed( QListViewItem* ) ), this, SLOT( slot_selected( QListViewItem* ) ) ); + + /* + Showing listView while scanning can mean the difference between + a 12 second load time and a 40 second load time. dummyView is + just a placeholder for listView while scanning. + */ + dummyView = new KListView( this, "dummyView" ); + dummyView->addColumn( i18n( "Result" ) ); + dummyView->addColumn( i18n( "White" ) ); + dummyView->addColumn( i18n( "Black" ) ); + dummyView->addColumn( i18n( "Round" ) ); + dummyView->addColumn( i18n( "Site" ) ); + dummyView->addColumn( i18n( "Date" ) ); + dummyView->restoreLayout( kapp->config(), "PGN_ListView" ); + dummyView->hide(); + + statusBox = new QHBox( this, "statusBox" ); + status = new KStatusBar( statusBox, "status" ); + + progress = new KProgress( statusBox, "progress" ); + progress->setValue( 0 ); + + show(); +} +list_pgn::~list_pgn() +{ + listView->saveLayout( kapp->config(), "PGN_ListView" ); +} +/////////////////////////////////////// +// +// list_pgn::setURL +// +/////////////////////////////////////// +void list_pgn::setURL( QString URL ) +{ + myURL = URL; + listView->clear(); + setCaption( URL ); + + if( tmpPGN.open( URL ) == FALSE ) + { + status->message( i18n( "Can not open %1" ).arg( URL ) ); + return; + } + listView->hide(); + dummyView->show(); + startTimer( 0 ); +} +/////////////////////////////////////// +// +// list_pgn::setProgress +// +/////////////////////////////////////// +void list_pgn::setProgress( const int num ) +{ + progress->setValue( num ); + if( num == 100 ) + progress->setEnabled( FALSE ); + else + progress->setEnabled( TRUE ); +} +/////////////////////////////////////// +// +// list_pgn::slot_selected +// +/////////////////////////////////////// +void list_pgn::slot_selected( QListViewItem *item ) +{ + emit selected( myURL, item->text(6).toInt() ); +} +/////////////////////////////////////// +// +// list_pgn::timerEvent +// +/////////////////////////////////////// +void list_pgn::timerEvent( QTimerEvent* ) +{ + int fileProgress; + + fileProgress = tmpPGN.scan(); + setProgress( fileProgress ); + if( tmpPGN.TAG_White.isEmpty() ) + { + if( listView->childCount() == 1 ) + { + emit selected( myURL, 0 ); + } + killTimers(); + listView->show(); + dummyView->hide(); + } + else + { + (void) new KListViewItem( listView, + tmpPGN.TAG_Result, + tmpPGN.TAG_White, + tmpPGN.TAG_Black, + tmpPGN.TAG_Round, + tmpPGN.TAG_Site, + tmpPGN.TAG_Date, + QString::number(tmpPGN.File_Position) ); + status->message( i18n( QString( "%1 matches found." ).arg( listView->childCount() ) ) ); + } +} diff --git a/knights/list_pgn.h b/knights/list_pgn.h new file mode 100644 index 0000000..f8712b5 --- /dev/null +++ b/knights/list_pgn.h @@ -0,0 +1,66 @@ +/*************************************************************************** + list_pgn.h - description + ------------------- + begin : Thu Dec 13 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef LIST_PGN_H +#define LIST_PGN_H + +#include +#include +#include "pgn.h" + +/** + *@author Troy Corbin Jr. + */ + +class match_param; +class KStatusBar; +class KProgress; +class KListView; +class QHBox; + +class list_pgn : public QVBox +{ + Q_OBJECT + public: + list_pgn(QWidget *parent=0, const char *name=0); + void setURL( QString URL ); + void setProgress( const int ); + QString URL( void ) + { return myURL; } + ~list_pgn(); + + + signals: + void selected( const QString&, const int& ); + + protected slots: + void slot_selected( QListViewItem *item ); + + protected: + void timerEvent( QTimerEvent * ); + + private: + QString myURL; + QHBox *statusBox; + KListView *listView; + KListView *dummyView; + KStatusBar *status; + KProgress *progress; + pgn tmpPGN; +}; + +#endif diff --git a/knights/logic.cpp b/knights/logic.cpp new file mode 100644 index 0000000..9d889d4 --- /dev/null +++ b/knights/logic.cpp @@ -0,0 +1,1495 @@ +/*************************************************************************** + logic.cpp - description + ------------------- + begin : Sat Sep 29 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "logic.h" +#include "dlg_promote.h" +#include "command.h" +#include + +/////////////////////////////////////// +// +// logic::logic +// +/////////////////////////////////////// +logic::logic( resource *Rsrc, match_param *param ) +{ + Resource = Rsrc; + Param = param; + int tmp; + + GameType = Type_Standard; + for( tmp = 0; tmp < 64; tmp++ ) + { + current[tmp].File = ( tmp % 8 ); + current[tmp].Rank = ( tmp >> 3 ); + } + clearBoard(); +} +/////////////////////////////////////// +// +// logic::~logic +// +/////////////////////////////////////// +logic::~logic() +{ +} +/////////////////////////////////////// +// +// logic::Pointer +// +/////////////////////////////////////// +int logic::Pointer( const char File, const char Rank ) +{ + if( ( File < 0 ) || ( File > 7 ) ) return Null; + if( ( Rank < 0 ) || ( Rank > 7 ) ) return Null; + return ( ( Rank << 3 ) + File ); +} +/////////////////////////////////////// +// +// logic::CalcPointer +// +/////////////////////////////////////// +int logic::CalcPointer( const char File, const char Rank ) +{ + char tmpFile, tmpRank; + + tmpFile = chessman[ManPtr].File + File; + tmpRank = chessman[ManPtr].Rank + Rank; + return Pointer( tmpFile, tmpRank ); +} +/////////////////////////////////////// +// +// logic::isChessman +// +/////////////////////////////////////// +bool logic::isChessman( const char ChessmanPtr ) +{ + char BoardPtr = Pointer( chessman[ChessmanPtr].File, chessman[ChessmanPtr].Rank ); + if( ( BoardPtr < 0 ) || ( BoardPtr > 63 ) ) return FALSE; + if( current[BoardPtr].ManPtr != ChessmanPtr ) return FALSE; + return TRUE; +} +/////////////////////////////////////// +// +// logic::clearBoard +// +/////////////////////////////////////// +void logic::clearBoard( void ) +{ + for( register int tmp = 0; tmp < 64; tmp++ ) + { + chessman[tmp].Type = Null; + current[tmp].ManPtr = Null; + current[tmp].Note = NOTE_NONE; + } +} +/////////////////////////////////////// +// +// logic::Init +// +/////////////////////////////////////// +void logic::Init( const int Var ) +{ + GameType = Var; + switch( GameType ) + { + case Type_Standard: // Fall Through + default: + Init_Standard(); + break; + } +} +/////////////////////////////////////// +// +// logic::Init_Standard +// +/////////////////////////////////////// +void logic::Init_Standard( void ) +{ + register int tmp; + + clearBoard(); + for( tmp = 0; tmp < 32; tmp++ ) + { + if( tmp < 16 ) + { + chessman[tmp].Army = WHITE; + chessman[tmp].Rank = 0; + } + else + { + chessman[tmp].Army = BLACK; + chessman[tmp].Rank = 7; + } + switch( tmp % 16 ) + { + case 0: + chessman[tmp].Type = King; + chessman[tmp].File = 4; + break; + case 1: + chessman[tmp].Type = Queen; + chessman[tmp].File = 3; + break; + case 2: + chessman[tmp].Type = Bishop; + chessman[tmp].File = 2; + break; + case 3: + chessman[tmp].Type = Bishop; + chessman[tmp].File = 5; + break; + case 4: + chessman[tmp].Type = Knight; + chessman[tmp].File = 1; + break; + case 5: + chessman[tmp].Type = Knight; + chessman[tmp].File = 6; + break; + case 6: + chessman[tmp].Type = Rook; + chessman[tmp].File = 0; + break; + case 7: + chessman[tmp].Type = Rook; + chessman[tmp].File = 7; + break; + default: + chessman[tmp].Type = Pawn; + chessman[tmp].File = ( tmp % 16 ) - 8; + if( chessman[tmp].Army == WHITE ) chessman[tmp].Rank = 1; + else chessman[tmp].Rank = 6; + break; + } + current[ Pointer( chessman[tmp].File, chessman[tmp].Rank ) ].ManPtr = tmp; + CastleFlag[0] = CF_King + CF_RookQ + CF_RookK; + CastleFlag[1] = CF_King + CF_RookQ + CF_RookK; + OnMove = WHITE; + } +} +/////////////////////////////////////// +// +// logic::parseCAN +// +/////////////////////////////////////// +bool logic::parseCAN( const bool Army ) +{ + if( chessMove.CAN == NULL ) return FALSE; + if( ( chessMove.CAN[0] != 'o' ) && ( chessMove.CAN[0] != 'O' ) ) + { + if( ( chessMove.CAN[0] < 'a' ) || ( chessMove.CAN[0] > 'h' ) ) return FALSE; + chessMove.fromFile = chessMove.CAN[0] - 97; + if( ( chessMove.CAN[1] < '1' ) || ( chessMove.CAN[1] > '8' ) ) return FALSE; + chessMove.fromRank = chessMove.CAN[1] - 49; + if( ( chessMove.CAN[2] < 'a' ) || ( chessMove.CAN[2] > 'h' ) ) return FALSE; + chessMove.toFile = chessMove.CAN[2] - 97; + if( ( chessMove.CAN[3] < '1' ) || ( chessMove.CAN[3] > '8' ) ) return FALSE; + chessMove.toRank = chessMove.CAN[3] - 49; + if( strlen( chessMove.CAN ) == 5 ) chessMove.Promote = chessMove.CAN[4]; + else chessMove.Promote = Null; + } + /* + For some reason some engines w/ CAN output + express castling using SAN, not to name names GNUChess v4 + */ + else + { + chessMove.fromFile = 4; + if( QString( chessMove.CAN ).lower() == "o-o" ) chessMove.toFile = 6; + else chessMove.toFile = 2; + if( Army == WHITE ) + { + chessMove.fromRank = 0; + chessMove.toRank = 0; + } + else + { + chessMove.fromRank = 7; + chessMove.toRank = 7; + } + } + return TRUE; +} +/////////////////////////////////////// +// +// logic::parseSAN +// +/////////////////////////////////////// +bool logic::parseSAN( void ) +{ + bool Army(OnMove); + char Type(Pawn); + char SANPtr(0), tmp(0); + + chessMove.fromFile = Null; + chessMove.fromRank = Null; + chessMove.toFile = Null; + chessMove.toRank = Null; + chessMove.Promote = Null; + chessMove.ManTaken = Null; + chessMove.NAG = 0; + while( SANPtr < (signed)QString( chessMove.SAN ).length() ) + { + /* Parse a character */ + switch( chessMove.SAN[SANPtr] ) + { + case 'K': + if( SANPtr == 0 ) + Type = King; + else + chessMove.Promote = 'k'; + break; + case 'Q': + if( SANPtr == 0 ) + Type = Queen; + else + chessMove.Promote = 'q'; + break; + case 'B': + if( SANPtr == 0 ) + Type = Bishop; + else + chessMove.Promote = 'b'; + break; + case 'N': + if( SANPtr == 0 ) + Type = Knight; + else + chessMove.Promote = 'n'; + break; + case 'R': + if( SANPtr == 0 ) + Type = Rook; + else + chessMove.Promote = 'r'; + break; + /* Parse castle */ + case 'o': + case 'O': + if( SANPtr != 0 ) + break; + Type = King; + if( Army == WHITE ) + chessMove.toRank = 0; + else + chessMove.toRank = 7; + if( QString( chessMove.SAN ).lower() == "o-o-o" ) + chessMove.toFile = 2; + if( QString( chessMove.SAN ).lower() == "o-o" ) + chessMove.toFile = 6; + break; + /* Ignore some symbols... these fall through */ + case 'x': + case '=': + case '#': + case '+': + case '-': + case 'P': + break; + /* Handle annotations */ + case '!': + chessMove.NAG = 1; + if( chessMove.SAN[SANPtr - 1] == '!' ) + chessMove.NAG = 3; + if( chessMove.SAN[SANPtr - 1] == '?' ) + chessMove.NAG = 6; + break; + case '?': + chessMove.NAG = 2; + if( chessMove.SAN[SANPtr - 1] == '!' ) + chessMove.NAG = 5; + if( chessMove.SAN[SANPtr - 1] == '?' ) + chessMove.NAG = 4; + break; + default: + if( ( chessMove.SAN[SANPtr] >= '1' ) && ( chessMove.SAN[SANPtr] <= '8' ) ) + { + if( chessMove.toRank != Null ) + chessMove.fromRank = chessMove.toRank; + chessMove.toRank = chessMove.SAN[SANPtr] - 49; + break; + } + if( ( chessMove.SAN[SANPtr] >= 'a' ) && ( chessMove.SAN[SANPtr] <= 'h' ) ) + { + if( chessMove.toFile != Null ) + chessMove.fromFile = chessMove.toFile; + chessMove.toFile = chessMove.SAN[SANPtr] - 97; + break; + } + /* Unknown symbol... Can not process this chessMove */ +// kdDebug() << "logic::ParseSAN: Unknown Symbol: " << chessMove.SAN[SANPtr] << "\n"; + return FALSE; + break; + } + SANPtr++; + } + for( tmp = 0; tmp < 64; tmp++ ) + { + if( chessman[tmp].Type != Type ) + continue; + if( chessman[tmp].Army != Army ) + continue; + if( ( chessMove.fromFile != Null ) && ( chessman[tmp].File != chessMove.fromFile ) ) + continue; + if( ( chessMove.fromRank != Null ) && ( chessman[tmp].Rank != chessMove.fromRank ) ) + continue; + if( !isChessman( tmp ) ) + continue; + HashLegal( tmp ); + if( current[ ( chessMove.toRank << 3 ) + chessMove.toFile ].Note < NOTE_MOVE ) + continue; + chessMove.fromFile = chessman[tmp].File; + chessMove.fromRank = chessman[tmp].Rank; + break; + } + if( tmp == 64 ) + { +// kdWarning() << "logic::ParseSAN could not make a legal chessMove out of " << QString( chessMove.SAN ) << endl; +// kdWarning() << (int)Army << " " << (int)Type << " " << (int)chessMove.fromFile << " " << (int)chessMove.fromRank +// << " " << (int)chessMove.toFile << " " << (int)chessMove.toRank << endl; + return FALSE; + } + return TRUE; +} +/////////////////////////////////////// +// +// logic::writeCAN +// +/////////////////////////////////////// +void logic::writeCAN( void ) +{ + chessMove.CAN[0] = chessMove.fromFile + 97; + chessMove.CAN[1] = chessMove.fromRank + 49; + chessMove.CAN[2] = chessMove.toFile + 97; + chessMove.CAN[3] = chessMove.toRank + 49; + if( chessMove.Promote == Null ) chessMove.CAN[4] = 0; + else + { + chessMove.CAN[4] = chessMove.Promote; + chessMove.CAN[5] = 0; + } +} +/////////////////////////////////////// +// +// logic::writeSAN +// +/////////////////////////////////////// +void logic::writeSAN( void ) +{ + Position backup[64]; + bool SANambig(FALSE); + bool SANambig2(FALSE); + register char tmp, manPtr, toPtr, fromPtr; + QString SAN; + + /* + writeSAN calls HashLegal(), which writes on current[], + which we need intact for Move()... so we need a backup + copy of current[]. Removing this breaks en passant moves + */ + copyPositions( current, backup ); + fromPtr = ( chessMove.fromRank << 3 ) + chessMove.fromFile; + toPtr = ( chessMove.toRank << 3 ) + chessMove.toFile; + if( ( fromPtr > 63 ) || ( toPtr > 63 ) ) return; + if( ( fromPtr < 0 ) || ( toPtr < 0 ) ) return; + manPtr = current[fromPtr].ManPtr; + if( manPtr == Null ) return; + + /* Check ambiguity for SAN notation */ + for( tmp = 0; tmp < 64; tmp++ ) + { + if( tmp == manPtr ) continue; + if( !isChessman( tmp ) ) continue; + if( chessman[tmp].Army == chessman[manPtr].Army ) + { + if( chessman[tmp].Type == chessman[manPtr].Type ) + { + HashLegal( tmp ); + if( current[toPtr].Note >= NOTE_MOVE ) + { + SANambig = TRUE; + if( chessman[tmp].File == chessman[manPtr].File ) + SANambig2 = TRUE; + } + } + /* + This IF was added to fix an ambiguity that occurs when a pawn + on B file and a Bishop can attack the same spot + */ + else + if( ( ( chessman[manPtr].Type == Bishop ) && ( chessman[tmp].Type == Pawn ) ) || + ( ( chessman[manPtr].Type == Pawn ) && ( chessman[tmp].Type == Bishop ) ) ) + { + if( ( chessman[manPtr].File == 1 ) || ( chessman[tmp].File == 1 ) ) + { + HashLegal( tmp ); + if( current[toPtr].Note >= NOTE_MOVE ) + { + SANambig = TRUE; + SANambig2 = TRUE; + } + } + } + } + } + /* Go ahead and restore the backup. */ + copyPositions( backup, current ); + if( ( ( current[toPtr].Note == NOTE_ATTACK ) || + ( current[toPtr].Note == NOTE_ENPASSANT ) ) && + ( chessman[manPtr].Type == Pawn ) ) + { + SANambig = TRUE; + } + /* Write SAN Notation */ + if( current[toPtr].Note == NOTE_CASTLE ) + { + if( chessMove.toFile == 6 ) SAN = "O-O"; + if( chessMove.toFile == 2 ) SAN = "O-O-O"; + } + else + { + switch( chessman[manPtr].Type ) + { + case King: + SAN += 'K'; + break; + case Queen: + SAN += 'Q'; + break; + case Bishop: + SAN += 'B'; + break; + case Knight: + SAN += 'N'; + break; + case Rook: + SAN += 'R'; + break; + case Pawn: +// if( SANambig2 ) SAN += 'P'; + break; + default: + break; + } + if( SANambig == TRUE ) + { + SAN += char( chessMove.fromFile + 97 ); + if( SANambig2 ) SAN += char( chessMove.fromRank + 49 ); + } + if( ( current[toPtr].Note == NOTE_ATTACK ) || + ( current[toPtr].Note == NOTE_ENPASSANT ) ) + SAN += 'x'; + SAN += char( chessMove.toFile + 97 ); + SAN += char( chessMove.toRank + 49 ); + switch( chessMove.Promote ) + { + case 'q': + chessman[manPtr].Type = Queen; + SAN += "=Q"; + break; + case 'b': + chessman[manPtr].Type = Bishop; + SAN += "=B"; + break; + case 'n': + chessman[manPtr].Type = Knight; + SAN += "=N"; + break; + case 'r': + chessman[manPtr].Type = Rook; + SAN += "=R"; + break; + default: + break; + } + } + strcpy( chessMove.SAN, SAN.latin1() ); +} +/////////////////////////////////////// +// +// logic::board +// +/////////////////////////////////////// +QString logic::board( void ) +{ + QString output; + register int tmp(0), tmpMan(0), cR(7), cF(0); + + while( tmp != 64 ) + { + tmpMan = current[ Pointer( cF, cR ) ].ManPtr; + if( tmpMan == Null ) + output += '-'; + else + { + switch( chessman[ tmpMan ].Type ) + { + case King: + if( chessman[ tmpMan ].Army == WHITE ) + output += 'K'; + else + output += 'k'; + break; + case Queen: + if( chessman[ tmpMan ].Army == WHITE ) + output += 'Q'; + else + output += 'q'; + break; + case Bishop: + if( chessman[ tmpMan ].Army == WHITE ) + output += 'B'; + else + output += 'b'; + break; + case Knight: + if( chessman[ tmpMan ].Army == WHITE ) + output += 'N'; + else + output += 'n'; + break; + case Rook: + if( chessman[ tmpMan ].Army == WHITE ) + output += 'R'; + else + output += 'r'; + break; + case Pawn: // Fall through + default: + if( chessman[ tmpMan ].Army == WHITE ) + output += 'P'; + else + output += 'p'; + break; + } + } + cF++; + tmp++; + if( cF == 8 ) + { + cF = 0; + cR--; + } + } + + if( CastleFlag[WHITE] & ( CF_King | CF_RookK ) ) + output += '1'; + else + output += '0'; + if( CastleFlag[WHITE] & ( CF_King | CF_RookQ ) ) + output += '1'; + else + output += '0'; + if( CastleFlag[BLACK] & ( CF_King | CF_RookK ) ) + output += '1'; + else + output += '0'; + if( CastleFlag[BLACK] & ( CF_King | CF_RookQ ) ) + output += '1'; + else + output += '0'; + + return output; +} +/////////////////////////////////////// +// +// logic::setBoard +// +/////////////////////////////////////// +void logic::setBoard( const QString &board, const short ppf ) +{ + QChar piece; + int tmp(0), tmp2(0), cR(7), cF(0); + + clearBoard(); + if( board.length() < 64 ) + { + kdWarning() << "logic::setBoard: Was passed a string that is less than 64 bytes long." << endl; + return; + } + while( tmp != 64 ) + { + piece = board.at(tmp++); + switch( piece.lower() ) + { + case 'k': + if( piece == 'K' ) chessman[tmp2].Army = WHITE; + else chessman[tmp2].Army = BLACK; + chessman[tmp2].Type = King; + break; + case 'q': + if( piece == 'Q' ) chessman[tmp2].Army = WHITE; + else chessman[tmp2].Army = BLACK; + chessman[tmp2].Type = Queen; + break; + case 'b': + if( piece == 'B' ) chessman[tmp2].Army = WHITE; + else chessman[tmp2].Army = BLACK; + chessman[tmp2].Type = Bishop; + break; + case 'n': + if( piece == 'N' ) chessman[tmp2].Army = WHITE; + else chessman[tmp2].Army = BLACK; + chessman[tmp2].Type = Knight; + break; + case 'r': + if( piece == 'R' ) chessman[tmp2].Army = WHITE; + else chessman[tmp2].Army = BLACK; + chessman[tmp2].Type = Rook; + break; + case 'p': + if( piece == 'P' ) chessman[tmp2].Army = WHITE; + else chessman[tmp2].Army = BLACK; + chessman[tmp2].Type = Pawn; + break; + default: + break; + } + if( piece != '-' ) + { + chessman[tmp2].Rank = cR; + chessman[tmp2].File = cF; + current[ Pointer( cF, cR ) ].ManPtr = tmp2; + tmp2++; + } + cF++; + if( cF == 8 ) + { + cF = 0; + cR--; + } + } + CastleFlag[WHITE] = 0; + CastleFlag[BLACK] = 0; + if( board.at(64) == '1' ) CastleFlag[WHITE] += CF_RookK; + if( board.at(65) == '1' ) CastleFlag[WHITE] += CF_RookQ; + if( board.at(66) == '1' ) CastleFlag[BLACK] += CF_RookK; + if( board.at(67) == '1' ) CastleFlag[BLACK] += CF_RookQ; + if( CastleFlag[WHITE] ) CastleFlag[WHITE] += CF_King; + if( CastleFlag[BLACK] ) CastleFlag[BLACK] += CF_King; + /* Update enpassant record */ + if( ppf != -2 ) + { + enPassant[ !OnMove ] = Null; + if( ppf != -1 ) + enPassant[ OnMove ] = ppf + 24 + ( ( OnMove == BLACK ) << 3 ); + } +} +/////////////////////////////////////// +// +// logic::getKing +// +/////////////////////////////////////// +int logic::getKing( const bool Army ) +{ + register int tmp; + for( tmp = 0; tmp < 64; tmp++ ) + { + if( ( chessman[tmp].Army == Army ) && ( chessman[tmp].Type == King ) ) + if( isChessman( tmp ) ) + { + return Pointer( chessman[tmp].File, chessman[tmp].Rank ); + } + } + return Null; +} +/////////////////////////////////////// +// +// logic::isCheck +// +/////////////////////////////////////// +bool logic::isCheck( const bool Army ) +{ + register char tmp(0), currentKing( getKing(Army) ); + + for( tmp = 0; tmp < 64; tmp++ ) + { + if( chessman[tmp].Army != Army ) + if( isChessman( tmp ) ) + { + HashLegal( tmp ); + if( current[ currentKing ].Note == NOTE_ATTACK ) return TRUE; + } + } + return FALSE; +} +/////////////////////////////////////// +// +// logic::isLegal +// +/////////////////////////////////////// +bool logic::isLegal( const bool Army ) +{ + register int tmp(0), tmp2(0), count(0); + + for( tmp2 = 0; tmp2 < 64; tmp2++ ) + { + if( chessman[tmp2].Army == Army ) + if( isChessman( tmp2 ) ) + { + ManPtr = tmp2; + _HashLegal(); + count = 0; + tmp = 0; + while( tmp < 64 ) count += ( current[tmp++].Note >= NOTE_MOVE ); + if( count ) return TRUE; + } + } + return FALSE; +} +/////////////////////////////////////// +// +// logic::isDraw +// +/////////////////////////////////////// +bool logic::isDraw( const bool Army ) +{ + bool haveBishop(FALSE); + bool haveBishopDiag(FALSE); + bool haveKnight(FALSE); + bool EnemyBishop(FALSE); + bool EnemyBishopDiag(TRUE); + bool EnemyKnight(FALSE); + int tmp(0); + + if( !isLegal( Army ) ) return TRUE; + for( tmp = 0; tmp < 64; tmp++ ) + { + if( !isChessman( tmp ) ) continue; + if( chessman[tmp].Type == Queen ) return FALSE; + if( chessman[tmp].Type == Pawn ) return FALSE; + if( chessman[tmp].Type == Rook ) return FALSE; + /* Enemy guys */ + if( chessman[tmp].Army != Army ) + { + if( chessman[tmp].Type == Bishop ) + { + if( EnemyBishop == TRUE ) return FALSE; + EnemyBishopDiag = abs( ( current[tmp].Rank % 2 ) - ( current[tmp].File % 2 ) ); + EnemyBishop = TRUE; + } + if( chessman[tmp].Type == Knight ) + { + if( EnemyKnight == TRUE ) return FALSE; + EnemyKnight = TRUE; + } + continue; + } + /* Our guys */ + if( chessman[tmp].Type == Bishop ) + { + if( haveBishop == TRUE ) return FALSE; + haveBishopDiag = abs( ( current[tmp].Rank % 2 ) - ( current[tmp].File % 2 ) ); + haveBishop = TRUE; + } + if( chessman[tmp].Type == Knight ) + { + if( haveKnight == TRUE ) return FALSE; + haveKnight = TRUE; + } + } + if( haveKnight && EnemyKnight ) return FALSE; + if( haveBishop && EnemyKnight ) return FALSE; + if( haveKnight && EnemyBishop ) return FALSE; + if( haveKnight && haveBishop ) return FALSE; + if( EnemyKnight && EnemyBishop ) return FALSE; + if( ( haveBishop && EnemyBishop ) && ( haveBishopDiag != EnemyBishopDiag ) ) return FALSE; + return TRUE; +} +/////////////////////////////////////// +// +// logic::setBoardFromFen +// +/////////////////////////////////////// +void logic::setBoardFromFen(const QString &fen) +{ + clearBoard(); + int j = 0; //position in string + int r = 7; //rank + int f = 0; //file + int p = 63; //chessman number + QChar c; //current letter + + for (j=0;j<120 && p>=0 ;j++) { + c = fen[j]; + + if (c.isLetter()) { + //describing a piece + if (c == 'r') { + chessman[p].Army = BLACK; + chessman[p].Type = Rook; + + } + if (c=='q') { + chessman[p].Army = BLACK; + chessman[p].Type = Queen; + } + if (c=='k') { + chessman[p].Army = BLACK; + chessman[p].Type = King; + } + if (c=='p') { + chessman[p].Army = BLACK; + chessman[p].Type = Pawn; + } + if (c=='n') { + chessman[p].Army = BLACK; + chessman[p].Type = Knight; + } + if (c=='b') { + chessman[p].Army = BLACK; + chessman[p].Type = Bishop; + } + //black pieces + if (c == 'R') { + chessman[p].Army = WHITE; + chessman[p].Type = Rook; + + } + if (c=='Q') { + chessman[p].Army = WHITE; + chessman[p].Type = Queen; + } + if (c=='K') { + chessman[p].Army = WHITE; + chessman[p].Type = King; + } + if (c=='P') { + chessman[p].Army = WHITE; + chessman[p].Type = Pawn; + } + if (c=='N') { + chessman[p].Army = WHITE; + chessman[p].Type = Knight; + } + if (c=='B') { + chessman[p].Army = WHITE; + chessman[p].Type = Bishop; + } + chessman[p].Rank = r; + chessman[p].File = f; + current[ Pointer( chessman[p].File, chessman[p].Rank ) ].ManPtr = p; + p--; + f++; + } + if (c.isNumber()) { + //describing blank squares + + p = p - c.digitValue(); + f = f + c.digitValue(); + } + + if (c == '/') { + //describing new rank + r--; + f=0; + } + + } + + do { + j++; + c = fen[j]; + } while (c == '/' || c == ' '); + if (c=='w') + OnMove = WHITE; + if (c=='b') + OnMove = BLACK; + +} +/////////////////////////////////////// +// +// logic::Move +// +/////////////////////////////////////// +bool logic::Move( void ) +{ + dlg_promote *ProDlg; + int tmp; + int fromPtr, toPtr, manPtr; + + fromPtr = Pointer( chessMove.fromFile, chessMove.fromRank ); + toPtr = Pointer( chessMove.toFile, chessMove.toRank ); + if( ( fromPtr == Null ) || ( toPtr == Null ) ) + return FALSE; + manPtr = current[fromPtr].ManPtr; + if( manPtr == Null ) + return FALSE; + + HashLegal( manPtr ); + /* Only proceed if this is a move */ + if( current[toPtr].Note < NOTE_MOVE ) + return FALSE; // This depends on all moves being higher value than NOTE_MOVE, + // while all non-moves are less. + + /* Take care of moving the rook in a caste */ + if( current[toPtr].Note == NOTE_CASTLE ) + { + if( chessMove.toFile == 6 ) + { + for( tmp = 0; tmp < 64; tmp++ ) + { + if( ( chessman[tmp].Army == chessman[manPtr].Army ) && + ( chessman[tmp].Type == Rook ) && + ( chessman[tmp].File == 7 ) ) + { + chessman[tmp].File = 5; + current[ Pointer( 7, ( 7 * ( chessman[tmp].Army == BLACK ) ) ) ].ManPtr = Null; + current[ Pointer( 5, ( 7 * ( chessman[tmp].Army == BLACK ) ) ) ].ManPtr = tmp; + break; + } + } + } + if( chessMove.toFile == 2 ) + { + for( tmp = 0; tmp < 64; tmp++ ) + { + if( ( chessman[tmp].Army == chessman[manPtr].Army ) && + ( chessman[tmp].Type == Rook ) && + ( chessman[tmp].File == 0 ) ) + { + chessman[tmp].File = 3; + current[ Pointer( 0, ( 7 * ( chessman[tmp].Army == BLACK ) ) ) ].ManPtr = Null; + current[ Pointer( 3, ( 7 * ( chessman[tmp].Army == BLACK ) ) ) ].ManPtr = tmp; + break; + } + } + } + } + /* Handle the 50 Move Rule */ + MoveCounter++; + if( chessman[manPtr].Type == Pawn ) MoveCounter = 0; + if( current[ toPtr ].ManPtr != Null ) + { + MoveCounter = 0; + chessMove.ManTaken = current[ toPtr ].ManPtr; + } + /* Check for Pawn Promotion */ + if( ( chessMove.toRank == ( 7 * ( chessman[manPtr].Army == WHITE ) ) ) && + ( chessman[manPtr].Type == Pawn ) ) + { + if( ( ( OnMove == WHITE ) && ( Param->type(WHITE) == PLAYERLOCAL ) ) || + ( ( OnMove == BLACK ) && ( Param->type(BLACK) == PLAYERLOCAL ) ) ) + { + if( Resource->OPTION_Auto_Queen == TRUE ) chessMove.Promote = 'q'; + else + { + /* Prompt user for promotion */ + ProDlg = new dlg_promote( 0, "promotedialog", Resource ); + ProDlg->Init( OnMove ); + chessMove.Promote = ProDlg->exec(); + delete ProDlg; + /* Default to Queen if the user quit the dialog without choosing */ + if( ( chessMove.Promote != 'q' ) && + ( chessMove.Promote != 'b' ) && + ( chessMove.Promote != 'n' ) && + ( chessMove.Promote != 'r' ) ) chessMove.Promote = 'q'; + } + } + } + /* Write CAN & SAN Notation for this move */ + writeCAN(); + writeSAN(); + /* Make the move */ + chessman[manPtr].File = chessMove.toFile; + chessman[manPtr].Rank = chessMove.toRank; + current[fromPtr].ManPtr = Null; + current[toPtr].ManPtr = manPtr; + /* Remove pawns taken en passant */ + if( current[toPtr].Note == NOTE_ENPASSANT ) + { + MoveCounter = 0; + chessMove.ManTaken = current[ enPassant[ 1 - chessman[manPtr].Army ] ].ManPtr; + current[ enPassant[ 1 - chessman[manPtr].Army ] ].ManPtr = Null; + } + /* Take care of en passant data */ + if( current[toPtr].Note == NOTE_PAWN_DOUBLE ) + enPassant[ chessman[manPtr].Army ] = toPtr; + enPassant[ 1 - chessman[manPtr].Army ] = Null; + /* Handle castle flags */ + if( chessman[manPtr].Type == King ) + CastleFlag[ chessman[manPtr].Army ] = 0; + if( ( chessman[manPtr].Type == Rook ) && ( chessMove.fromFile == 0 ) ) + CastleFlag[ chessman[manPtr].Army ] -= CF_RookQ; + if( ( chessman[manPtr].Type == Rook ) && ( chessMove.fromFile == 7 ) ) + CastleFlag[ chessman[manPtr].Army ] -= CF_RookK; + return TRUE; +} +/////////////////////////////////////// +// +// logic::HashLegal +// +/////////////////////////////////////// +void logic::HashLegal( const char Man, const bool Recursion ) +{ + char tmp; + tmp = ManPtr; + ManPtr = Man; + _HashLegal( Recursion ); + ManPtr = tmp; +} +void logic::_HashLegal( const bool Recursion ) +{ + /* Used for loops and positions */ + register int Ptr(0), tmp(0), tmp2(0); + + /* Used to calculate a position relative to a given position */ + int dirF(0), dirR(0); + + /* Used to monitor the King inside the Monster */ + int currentKing(0), _castleFlag(0); + + if( !isChessman(ManPtr) ) + return; + + copyPositions( current, hash ); + + while( tmp < 64 ) + hash[tmp++].Note = NOTE_NONE; + + switch( chessman[ManPtr].Type ) + { + /* ROOK & QUEEN */ + case Rook: + case Queen: + /* Positive Rank Movement */ + for( tmp = 1; tmp < 8; tmp++ ) + { + Ptr = CalcPointer( 0, tmp ); + if( Ptr == Null ) break; + if( hash[Ptr].ManPtr == Null ) + { + hash[Ptr].Note = NOTE_MOVE; + continue; + } + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + { + hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + break; + } + /* Negitive Rank Movement */ + for( tmp = -1; tmp > -8; tmp-- ) + { + Ptr = CalcPointer( 0, tmp ); + if( Ptr == Null ) break; + if( hash[Ptr].ManPtr == Null ) + { + hash[Ptr].Note = NOTE_MOVE; + continue; + } + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + { + hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + break; + } + /* Positive File Movement */ + for( tmp = 1; tmp < 8; tmp++ ) + { + Ptr = CalcPointer( tmp, 0 ); + if( Ptr == Null ) break; + if( hash[Ptr].ManPtr == Null ) + { + hash[Ptr].Note = NOTE_MOVE; + continue; + } + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + { + hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + break; + } + /* Negative File Movement */ + for( tmp = -1; tmp > -8; tmp-- ) + { + Ptr = CalcPointer( tmp, 0 ); + if( Ptr == Null ) break; + if( hash[Ptr].ManPtr == Null ) + { + hash[Ptr].Note = NOTE_MOVE; + continue; + } + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + { + hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( chessman[ManPtr].Type == Rook ) break; + /* Bishop & Queen */ + case Bishop: + /* NE Movement */ + for( tmp = 1; tmp < 8; tmp++ ) + { + Ptr = CalcPointer( tmp, tmp ); + if( Ptr == Null ) break; + if( hash[Ptr].ManPtr == Null ) + { + hash[Ptr].Note = NOTE_MOVE; + continue; + } + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + { + hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + break; + } + /* NW Movement */ + for( tmp = -1; tmp > -8; tmp-- ) + { + Ptr = CalcPointer( tmp, abs(tmp) ); + if( Ptr == Null ) break; + if( hash[Ptr].ManPtr == Null ) + { + hash[Ptr].Note = NOTE_MOVE; + continue; + } + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + { + hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + break; + } + /* SW Movement */ + for( tmp = -1; tmp > -8; tmp-- ) + { + Ptr = CalcPointer( tmp, tmp ); + if( Ptr == Null ) break; + if( hash[Ptr].ManPtr == Null ) + { + hash[Ptr].Note = NOTE_MOVE; + continue; + } + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + { + hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + break; + } + /* SE Movement */ + for( tmp = -1; tmp > -8; tmp-- ) + { + Ptr = CalcPointer( abs(tmp), tmp ); + if( Ptr == Null ) break; + if( hash[Ptr].ManPtr == Null ) + { + hash[Ptr].Note = NOTE_MOVE; + continue; + } + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + { + hash[Ptr].Note = NOTE_ATTACK; + break; + } + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + break; + } + break; + /* Knight */ + case Knight: + for( tmp = 0; tmp < 8; tmp++ ) + { + switch( tmp ) + { + case 0: + Ptr = CalcPointer( -1, 2 ); + break; + case 1: + Ptr = CalcPointer( 1, 2 ); + break; + case 2: + Ptr = CalcPointer( 2, 1 ); + break; + case 3: + Ptr = CalcPointer( 2, -1 ); + break; + case 4: + Ptr = CalcPointer( 1, -2 ); + break; + case 5: + Ptr = CalcPointer( -1, -2 ); + break; + case 6: + Ptr = CalcPointer( -2, -1 ); + break; + case 7: + Ptr = CalcPointer( -2, 1 ); + break; + default: + break; + } + if( Ptr != Null ) + { + if( hash[Ptr].ManPtr == Null ) + hash[Ptr].Note = NOTE_MOVE; + else + { + if( Recursion == TRUE ) + hash[Ptr].Note = NOTE_ATTACK; + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) + hash[Ptr].Note = NOTE_ATTACK; + } + } + } + break; + /* King */ + case King: + dirF = -1; + dirR = 1; + while(1) + { + Ptr = CalcPointer( dirF, dirR ); + if( Ptr != Null ) + { + if( hash[Ptr].ManPtr == Null ) hash[Ptr].Note = NOTE_MOVE; + else + { + if( Recursion == TRUE ) hash[Ptr].Note = NOTE_ATTACK; + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) hash[Ptr].Note = NOTE_ATTACK; + } + } + dirF++; + if( dirF == 2 ) + { + dirF = -1; + dirR--; + } + if( dirR == -2 ) break; + if( ( dirR == 0 ) && ( dirF == 0 ) ) dirF++; + } + /* Check for castles */ + if( Recursion == FALSE ) + { + /* Can the King castle at all? */ + if( CastleFlag[ chessman[ ManPtr ].Army ] & CF_King ) + { + dirR = 0; + /* How about with the Queen's Rook? */ + if( CastleFlag[ chessman[ ManPtr ].Army ] & CF_RookQ ) + { + if( hash[ CalcPointer( -1, dirR ) ].ManPtr == Null ) + { + if( hash[ CalcPointer( -2, dirR ) ].ManPtr == Null ) + { + if( hash[ CalcPointer( -3, dirR ) ].ManPtr == Null ) + { + hash[ CalcPointer( -2, dirR ) ].Note = NOTE_CASTLE; + _castleFlag |= CF_RookQ; + } + } + } + } + /* King's Rook? */ + if( CastleFlag[ chessman[ ManPtr ].Army ] & CF_RookK ) + { + if( hash[ CalcPointer( 1, dirR ) ].ManPtr == Null ) + { + if( hash[ CalcPointer( 2, dirR ) ].ManPtr == Null ) + { + hash[ CalcPointer( 2, dirR ) ].Note = NOTE_CASTLE; + _castleFlag |= CF_RookK; + } + } + } + } + } + break; + /* PAWN */ + default: + /* Get direction of movement */ + if( chessman[ManPtr].Army == WHITE ) dirR = 1; + else dirR = -1; + if( Recursion == FALSE ) + { + /* Forward 1 square */ + Ptr = CalcPointer( 0, dirR ); + if( ( Ptr != Null ) && ( hash[Ptr].ManPtr == Null ) ) + { + hash[Ptr].Note = NOTE_MOVE; + tmp = 1 + ( 5 * ( chessman[ManPtr].Army == BLACK ) ); + if( chessman[ManPtr].Rank == tmp ) + { + /* Forward 2 squares */ + dirR = dirR << 1; + Ptr = CalcPointer( 0, dirR ); + if( ( Ptr != Null ) && ( hash[Ptr].ManPtr == Null ) ) hash[Ptr].Note = NOTE_PAWN_DOUBLE; + dirR = dirR >> 1; + } + } + } + if( Recursion == TRUE ) + { + /* Attack Left */ + Ptr = CalcPointer( -1, dirR ); + if( Ptr != Null ) hash[Ptr].Note = NOTE_ATTACK; + /* Attack Right */ + Ptr = CalcPointer( 1, dirR ); + if( Ptr != Null ) hash[Ptr].Note = NOTE_ATTACK; + } + else + { + /* Attack Left */ + Ptr = CalcPointer( -1, dirR ); + if( ( Ptr != Null ) && ( hash[Ptr].ManPtr != Null ) ) + { + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) hash[Ptr].Note = NOTE_ATTACK; + } + /* Attack Right */ + Ptr = CalcPointer( 1, dirR ); + if( ( Ptr != Null ) && ( hash[Ptr].ManPtr != Null ) ) + { + if( chessman[hash[Ptr].ManPtr].Army != chessman[ManPtr].Army ) hash[Ptr].Note = NOTE_ATTACK; + } + /* Attack en Passant Left */ + Ptr = CalcPointer( -1, 0 ); + if( ( Ptr != Null ) && ( enPassant[ 1 - chessman[ManPtr].Army ] == Ptr ) ) + { + Ptr = CalcPointer( -1, dirR ); + hash[Ptr].Note = NOTE_ENPASSANT; + } + /* Attack en Passant Right */ + Ptr = CalcPointer( 1, 0 ); + if( ( Ptr != Null ) && ( enPassant[ 1 - chessman[ManPtr].Army ] == Ptr ) ) + { + Ptr = CalcPointer( 1, dirR ); + hash[Ptr].Note = NOTE_ENPASSANT; + } + } + break; + } + /* THE MONSTER */ + /* Remove all possible moves that would either put your */ + /* king into check or wouldn't stop a check in progress */ + if( Recursion == FALSE ) + { + /* Make Backups */ + copyPositions( hash, hashBackup ); + copyChessmen( chessman, chessmanBackup ); + + /* Find the King's Position */ + currentKing = getKing( chessman[ManPtr].Army ); + + /* Remove castles under specific conditions */ + if( _castleFlag ) + { + for( tmp = 0; tmp < 64; tmp++ ) + { + if( !isChessman( tmp ) ) continue; + if( ( chessman[tmp].Army != chessman[ManPtr].Army ) && ( chessman[tmp].Type != Null ) ) + { + HashLegal( tmp, TRUE ); + /* Is a check in progress? */ + if( hash[ currentKing ].Note == NOTE_ATTACK ) + { + for( tmp2 = 0; tmp2 < 64; tmp2++ ) + if( hashBackup[tmp2].Note == NOTE_CASTLE ) hashBackup[tmp2].Note = NOTE_NONE; + break; + } + else + { + /* Store ManPtr in dirF so we can use ManPtr */ + dirF = ManPtr; + ManPtr = hashBackup[ currentKing ].ManPtr; + /* Is the path to Queenside in check? */ + if( _castleFlag & CF_RookQ ) + { + if( ( hash[ CalcPointer( -1, 0 ) ].Note == NOTE_MOVE ) || + ( hash[ CalcPointer( -2, 0 ) ].Note == NOTE_MOVE ) ) + { + hashBackup[ CalcPointer( -2, 0 ) ].Note = NOTE_NONE; + _castleFlag -= CF_RookQ; + } + } + /* Is the path to Kingside in check? */ + if( _castleFlag & CF_RookK ) + { + if( ( hash[ CalcPointer( 1, 0 ) ].Note == NOTE_MOVE ) || + ( hash[ CalcPointer( 2, 0 ) ].Note == NOTE_MOVE ) ) + { + hashBackup[ CalcPointer( 2, 0 ) ].Note = NOTE_NONE; + _castleFlag -= CF_RookK; + } + } + /* Restore ManPtr */ + ManPtr = dirF; + } + } + } + } // <- End Castle Checks + + /* Check all possible moves */ + for( tmp = 0; tmp < 64; tmp++ ) + { + /* Only proceed if this is a move */ + if( hashBackup[tmp].Note < NOTE_MOVE ) + continue; // This depends on all moves being higher value than NOTE_MOVE, + // while all non-moves are less. + + /* Pretend we moved here... what would happen? */ + current[ Pointer( chessman[ManPtr].File, chessman[ManPtr].Rank ) ].ManPtr = Null; + chessman[ManPtr].File = hashBackup[tmp].File; + chessman[ManPtr].Rank = hashBackup[tmp].Rank; + current[tmp].ManPtr = ManPtr; + if( current[tmp].Note == NOTE_ENPASSANT ) + { + current[ enPassant[ 1 - chessman[ManPtr].Army ] ].ManPtr = Null; + } + + /* Recalc King pos, as we may have just moved him */ + currentKing = getKing( chessman[ManPtr].Army ); + + /* Rehash in new position. If King is now under check, then */ + /* we can't use this move and it's removed from contention */ + for( tmp2 = 0; tmp2 < 64; tmp2++ ) + { + if( chessman[tmp2].Army != chessman[ManPtr].Army ) + if( isChessman( tmp2 ) ) + { + HashLegal( tmp2, TRUE ); + if( hash[ currentKing ].Note == NOTE_ATTACK ) + { + hashBackup[tmp].Note = NOTE_NONE; + } + } + } + + /* Restore the playground */ + copyPositions( hashBackup, current ); + copyChessmen( chessmanBackup, chessman ); + } // <- End of 'Check All Moves' loop + + copyPositions( hashBackup, current ); + copyPositions( hashBackup, hash ); + copyChessmen( chessmanBackup, chessman ); + } +} diff --git a/knights/logic.h b/knights/logic.h new file mode 100644 index 0000000..d57a553 --- /dev/null +++ b/knights/logic.h @@ -0,0 +1,88 @@ +/*************************************************************************** + logic.h - description + ------------------- + begin : Sat Sep 29 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef LOGIC_H +#define LOGIC_H + +#include +#include "definitions.h" +#include "resource.h" +#include "match_param.h" + +/** + *@author Troy Corbin Jr. + */ + +const char CF_King = 0x01; +const char CF_RookQ = 0x02; +const char CF_RookK = 0x04; + +class logic +{ + + public: + char OnMove; + Position current[64]; + Chessman chessman[64]; + ChessMove chessMove; + + /* This is used for the 50 move rule */ + char MoveCounter; + + logic( resource *Rsrc=0, match_param *param=0 ); + ~logic(); + void Init( const int Var=Type_Standard ); + void setBoard( const QString &board=QString::null, const short ppf=-2 ); + void setBoardFromFen( const QString &fen ); + QString board( void ); + bool isChessman( const char ChessmanPtr ); + bool isCheck( const bool Army ); + bool isLegal( const bool Army ); + bool isDraw( const bool Army ); + bool Move( void ); + void HashLegal( const char Man, const bool Recursion=FALSE ); + int Pointer( const char File, const char Rank ); + + bool parseCAN( const bool Army ); + bool parseSAN( void ); + void writeCAN( void ); + void writeSAN( void ); + + protected: + int CalcPointer( const char File, const char Rank ); + void _HashLegal( const bool Recursion=FALSE ); + void clearBoard( void ); + int getKing( const bool Army ); + void Init_Standard( void ); + inline void copyPositions( Position *Src, Position *Dst ) + { memcpy( Dst, Src, sizeof(Position) << 6 ); } + inline void copyChessmen( Chessman *Src, Chessman *Dst ) + { memcpy( Dst, Src, sizeof(Chessman) << 6 ); } + + private: + resource *Resource; + match_param *Param; + int GameType; + Position hash[64]; + Position hashBackup[64]; + Chessman chessmanBackup[64]; + char CastleFlag[2]; + char enPassant[2]; + char ManPtr; +}; + +#endif diff --git a/knights/main.cpp b/knights/main.cpp new file mode 100644 index 0000000..f5f508e --- /dev/null +++ b/knights/main.cpp @@ -0,0 +1,85 @@ +/*************************************************************************** + main.cpp - description + ------------------- + begin : Thu Mar 1 10:43:51 CST 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include + +#include "knights.h" + +static KCmdLineOptions options[] = +{ + { "d ", I18N_NOOP("Specify the location of your Knights data directory."), 0 }, + { "+[filename]", I18N_NOOP("A .pgn file to be loaded."), 0 }, + { 0, 0, 0 } +}; + +int main(int argc, char *argv[]) +{ + KAboutData aboutData( "knights", + I18N_NOOP("Knights"), + _VERSION_, + I18N_NOOP("The Knights Chess Interface\n\nKnights is a chess interface\nfor the K Desktop Environment."), + KAboutData::License_GPL_V2, + "(c) 2003, Troy Corbin Jr.", + 0, + "http://knights-chess.com", + "troy@knights-chess.com"); + + aboutData.addAuthor("Troy Corbin Jr.", + I18N_NOOP("Project Manager and Programmer"), + "tcorbin@users.sourceforge.net", + "http://knights.sourceforge.net"); + aboutData.addAuthor("Alexander Wels", + I18N_NOOP("Communications Programmer"), + "agpwels@adelphia.net", + ""); + aboutData.addCredit("Mark Westcott", + I18N_NOOP("Qtopia port and patches"), + "mark@houseoffish.org", + ""); + aboutData.addCredit("Kunnar Klauks", + I18N_NOOP("Patches and suggestions"), + "kunnk@yahoo.com", + ""); + aboutData.addCredit("Harald Fernengel", + I18N_NOOP("KDE3 Compatability Patch"), + "harry@kdevelop.org", + ""); + aboutData.addCredit("Tim Mann", + I18N_NOOP("XBoard protocol"), + "tim.mann@compaq.com", + "http://www.tim-mann.org/chess.html"); + aboutData.setTranslator(I18N_NOOP("_: NAME OF TRANSLATORS\nYour names"), + I18N_NOOP("_: EMAIL OF TRANSLATORS\nYour emails")); + + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( options ); + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + + KApplication a; + Knights *knights = new Knights(args); + a.setMainWidget(knights); + if( !knights->init() ) // Did we init ok? + { + return 0; + } + /* Without this connection, the destructors are not called, and some + housecleaning ( like destroying child processes ) isn't done */ + a.connect( &a, SIGNAL( shutDown () ), knights, SLOT( KillAll() ) ); + return a.exec(); +} diff --git a/knights/match.cpp b/knights/match.cpp new file mode 100644 index 0000000..21957e4 --- /dev/null +++ b/knights/match.cpp @@ -0,0 +1,1120 @@ +/*************************************************************************** + match.cpp - description + ------------------- + begin : Mon Jul 2 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include "match.moc" +#include "board_base.h" +#include "board_2d.h" +#include "audio.h" + +#define WHITE_INPUT Record->Param->type(WHITE) +#define BLACK_INPUT Record->Param->type(BLACK) + +/////////////////////////////////////// +// +// match::match +// +/////////////////////////////////////// +match::match( QWidget *parent, match_param *param, resource *Rsrc ) : QWidget(parent) +{ + Resource = Rsrc; + + /* Init Children */ + Record = new pgn( Resource, param ); + Logic = new logic( Resource, param ); + Board = new board_2d( parent, "Board", Resource, Logic ); + Board->show(); + connect( Board, SIGNAL( leftClick(int) ), this, SLOT( slot_Select(int) ) ); + connect( Board, SIGNAL( rightClick(int) ), this, SLOT( slot_Preview(int) ) ); + Clock = new chessclock( this, "Clock", Resource ); + Record->init(); + Logic->Init(); + Clock->Reset(); + clearSelections(); + + /* Init Variables */ + Draw_Offered[WHITE] = FALSE; + Draw_Offered[BLACK] = FALSE; + Modified = FALSE; + Loading = FALSE; + Paused = FALSE; + JustMoved = FALSE; + preMoved = FALSE; + Current = FALSE; + loadTimer = 0; + StatusCode = READY; + StatusMessage = QString::null; + ICSGameMode = Null; + parseMatchParam(); + + /* Connect Signals and Slots */ + connect( param, SIGNAL( valuesChanged() ), this, SLOT( parseMatchParam() ) ); + connect( Record, SIGNAL( processMove(ChessMove) ), this, SLOT( move(ChessMove) ) ); + connect( Record, SIGNAL( processSpecial() ), this, SLOT( loadSpecial() ) ); + connect( Clock, SIGNAL( flagFell(const bool) ), this, SLOT( slot_flagFell(const bool) ) ); + connect( this, SIGNAL( setStatusBar( const int&, const QString& ) ), this, SLOT( saveStatusBar( const int&, const QString& ) ) ); + +} +/////////////////////////////////////// +// +// match::~match +// +/////////////////////////////////////// +match::~match() +{ + delete Clock; + if( Board != NULL ) delete Board; + delete Record; + delete Logic; +} +/////////////////////////////////////// +// +// match::setVisibility +// +/////////////////////////////////////// +void match::setVisibility( const bool vis ) +{ + if( vis == TRUE ) + { + show(); + Board->show(); + setEnabled( TRUE ); + } + else + { + hide(); + Board->hide(); + setEnabled( FALSE ); + } +} +/////////////////////////////////////// +// +// match::parseMatchParam +// +/////////////////////////////////////// +void match::parseMatchParam( void ) +{ + switch( BLACK_INPUT ) + { + case PLAYERLOCAL: + Board->setLocalArmy( BLACK ); + break; + } + switch( WHITE_INPUT ) + { + case PLAYERLOCAL: + Board->setLocalArmy( WHITE ); + break; + } +} +/////////////////////////////////////// +// +// match::tick +// +/////////////////////////////////////// +void match::tick(void) +{ + Clock->Tick(); + emit setClocks(); + if( Loading ) + { + if( loadTimer ) + loadTimer--; + else + { + /* + All this is for a match we just finished loading + */ + if( !Record->loadNext() ) + { + Loading = FALSE; + emit sendCMD( Command( myID, CMD_Play ) ); + if( Record->TAG_Result == "*" ) + { + /* Unfinished Game */ + Clock->Set( Record->whiteTime, Record->blackTime, onMove() ); + } + else + { + /* Finished Match */ + Clock->Pause(); + if( Record->TAG_Result == "1/2-1/2" ) + emit setStatusBar( GAME_DRAW ); + if( Record->TAG_Result == "1-0" ) + emit setStatusBar( WHITE_WIN ); + if( Record->TAG_Result == "0-1" ) + emit setStatusBar( BLACK_WIN ); + } + } + } + } +} +/////////////////////////////////////// +// +// match::clearSelections +// +/////////////////////////////////////// +void match::clearSelections( void ) +{ + bool commitFlag( FALSE ); + register char tmp; + + if( ICSGameMode == Null ) + { + for( tmp = 0; tmp < 64; tmp++ ) + { + if( Logic->current[tmp].Note != NOTE_NONE ) + { + Logic->current[tmp].Note = NOTE_NONE; + Board->drawPosition( tmp ); + commitFlag = TRUE; + } + } + } + else + { + for( tmp = 0; tmp < 64; tmp++ ) + { + Logic->current[tmp].Note = NOTE_NONE; + Board->drawPosition( tmp ); + commitFlag = TRUE; + } + } + if( commitFlag ) + { + Board->commit(); + } +} +/////////////////////////////////////// +// +// match::flip +// +/////////////////////////////////////// +void match::flip(void) +{ + Board->flipBoard(); +} +/////////////////////////////////////// +// +// match::resize +// +/////////////////////////////////////// +void match::resize(void) +{ + Board->resizeBoard(); + setFixedSize( Board->width(), Board->height() ); +} +/////////////////////////////////////// +// +// match::redraw +// +/////////////////////////////////////// +void match::redraw(void) +{ + Board->redrawAll(); +} +/////////////////////////////////////// +// +// match::slot_flagFell +// +/////////////////////////////////////// +void match::slot_flagFell( const bool Army ) +{ + if( Army == WHITE ) + { + emit setStatusBar( WHITE_FLAG ); + if( ( Resource->OPTION_Auto_Call_Flag ) && ( WHITE_INPUT != PLAYERLOCAL ) && ( BLACK_INPUT == PLAYERLOCAL ) ) + { + emit sendCMD( Command( myID, CMD_Black_Called_Flag ) ); + recvCMD( Command( myID, CMD_Black_Called_Flag ) ); + } + } + else + { + emit setStatusBar( BLACK_FLAG ); + if( ( Resource->OPTION_Auto_Call_Flag ) && ( BLACK_INPUT != PLAYERLOCAL ) && ( WHITE_INPUT == PLAYERLOCAL ) ) + { + emit sendCMD( Command( myID, CMD_White_Called_Flag ) ); + recvCMD( Command( myID, CMD_White_Called_Flag ) ); + } + } +} +/////////////////////////////////////// +// +// match::setPaused +// +/////////////////////////////////////// +void match::setPaused( const bool State ) +{ + Paused = State; + Board->setPaused( State ); + if( Paused ) + { + Clock->Pause(); + emit setStatusBar( PAUSED ); + } + else + { + Clock->Resume(); + if( onMove() == WHITE ) emit setStatusBar( WHITE_TURN ); + else emit setStatusBar( BLACK_TURN ); + } +} +/////////////////////////////////////// +// +// match::inputOnMove +// +/////////////////////////////////////// +char match::inputOnMove( bool reverse ) +{ + if( reverse ) + { + if( Logic->OnMove == BLACK ) + return WHITE_INPUT; + if( Logic->OnMove == WHITE ) + return BLACK_INPUT; + } + else + { + if( Logic->OnMove == WHITE ) + return WHITE_INPUT; + if( Logic->OnMove == BLACK ) + return BLACK_INPUT; + } + return Null; +} +/////////////////////////////////////// +// +// match::input +// +/////////////////////////////////////// +char match::input( char army ) +{ + return Record->Param->type(army); +} +/////////////////////////////////////// +// +// match::save +// +/////////////////////////////////////// +bool match::save( QString URL ) +{ + Record->whiteTime = Clock->getCentiseconds(WHITE); + Record->blackTime = Clock->getCentiseconds(BLACK); + return Record->save( URL ); +} +/////////////////////////////////////// +// +// match::load +// +/////////////////////////////////////// +bool match::load( const QString URL, const int pos ) +{ + bool Result; + Loading = TRUE; + loadTimer = 20; + if( !Record->open( URL ) ) + { + return FALSE; + } + Result = Record->load( pos ); + if( !Record->TAG_FEN.isEmpty() ) + { + // We must set up the FEN position + Logic->setBoardFromFen( Record->TAG_FEN ); + sendCMD( Command( myID, CMD_Set_Board, Record->TAG_FEN ) ); + } + return Result; +} +/////////////////////////////////////// +// +// match::loadSpecial +// +/////////////////////////////////////// +void match::loadSpecial( void ) +{ + /* + As pointless as this function may seem ( in light of these variables and more + being setup in tick(), it is required to initialize a Chess Engine and feed it + the moves from a saved game so you can play it again later. + */ + emit sendCMD( Command( myID, CMD_New_Players ) ); +} +/////////////////////////////////////// +// +// match::url +// +/////////////////////////////////////// +QString match::url( void ) +{ + if( !Record->CurrentURL.isEmpty() ) + return Record->CurrentURL; + if( Resource->OPTION_Reuse_PGN ) + return Resource->PGN_Filename; + return QString::null; +} +/////////////////////////////////////// +// +// match::clock +// +/////////////////////////////////////// +QString match::clock( const bool Army ) +{ + if( Army == WHITE ) return Clock->whiteClock; + return Clock->blackClock; +} +/////////////////////////////////////// +// +// match::slot_Select +// +/////////////////////////////////////// +void match::slot_Select( int position ) +{ + bool preMoving(FALSE); + register char tmp, army, selected(Null); + + if( Paused ) return; + /* Clear all non-SELECT notes */ + for( tmp = 0;tmp < 64;tmp++ ) + { + if( Logic->current[tmp].Note != NOTE_NONE ) + { + if( Logic->current[tmp].Note != NOTE_SELECT ) + { + Logic->current[tmp].Note = NOTE_NONE; + Board->drawPosition( tmp ); + } + else + { + selected = tmp; + } + } + } + Board->commit(); + + /* Check to make sure it's our turn to select. */ + if( !( inputOnMove() & PLAYERLOCAL ) ) + { + if( ( inputOnMove(TRUE) == PLAYERLOCAL ) && ( Resource->OPTION_Premove ) ) + { + preMoving = TRUE; + } + else + { + return; + } + } + /* If you left click on a selected square, it becomes unselected. */ + if( Logic->current[position].Note == NOTE_SELECT ) + { + Logic->current[position].Note = NOTE_NONE; + drawPosition( position ); + playSound( SND_SELECT ); + return; + } + if( preMoved ) + { + preMoved = FALSE; + playSound( SND_SELECT ); + Board->setPremovePositions( Null, Null ); + Board->drawPosition( Logic->Pointer( preMove.fromFile, preMove.fromRank ) ); + Board->drawPosition( Logic->Pointer( preMove.toFile, preMove.toRank ) ); + Board->commit(); + } + /* Check to see if there is already a selected square. */ + if( selected != Null ) + { + /* + If there is already a selected square, and you just clicked on another of your men, + we'll change your selection. + */ + if( Logic->current[position].ManPtr != Null ) + { + if( Logic->chessman[ Logic->current[selected].ManPtr ].Army == Logic->chessman[ Logic->current[position].ManPtr ].Army ) + { + Logic->current[selected].Note = NOTE_NONE; + Logic->current[position].Note = NOTE_SELECT; + Board->drawPosition( selected ); + drawPosition( position ); + if( Resource->OPTION_Auto_Preview == TRUE ) + slot_Preview( position ); + else + playSound( SND_SELECT ); + return; + } + } + /* + If there is already a selected square, but this one you just clicked + isn't one of your chessmen, you must want to move a piece. + */ + if( ( Record->currentIndex != ( Record->Positions.count() - 1 ) ) && ( Record->currentIndex ) ) + { + emit setStatusBar( NO_MOVE_WHILE_REVIEW ); + return; + } + if( preMoving ) + { + Command::clearMove( &preMove ); + preMove.fromRank = Logic->current[selected].Rank; + preMove.fromFile = Logic->current[selected].File; + preMove.toRank = Logic->current[position].Rank; + preMove.toFile = Logic->current[position].File; + preMoved = TRUE; + playSound( SND_SELECT ); + Board->setPremovePositions( selected, position ); + } + else + { + Command::clearMove( &chessMove ); + chessMove.fromRank = Logic->current[selected].Rank; + chessMove.fromFile = Logic->current[selected].File; + chessMove.toRank = Logic->current[position].Rank; + chessMove.toFile = Logic->current[position].File; + JustMoved = TRUE; + if( move() == FALSE ) + { + Logic->current[selected].Note = NOTE_SELECT; + drawPosition( selected ); + } + } + return; + } + tmp = Logic->current[position].ManPtr; + + /* You can't select an empty square. */ + if( tmp == Null ) + { + return; + } + army = Logic->chessman[ tmp ].Army; + + /* You can't select your enemy */ + if( ( army != onMove() ) && ( preMoving == FALSE ) ) + { + return; + } + + /* If your clicking on one of your chessmen, you can select it. */ + clearSelections(); + if( ( army == WHITE ) && ( WHITE_INPUT & PLAYERLOCAL ) ) + { + Logic->current[position].Note = NOTE_SELECT; + } + if( ( army == BLACK ) && ( BLACK_INPUT & PLAYERLOCAL ) ) + { + Logic->current[position].Note = NOTE_SELECT; + } + drawPosition( position ); + if( Resource->OPTION_Auto_Preview == TRUE ) + { + slot_Preview( position ); + } + else + { + /* Play the select sound if you selected a square & you didn't preview */ + if( Logic->current[position].Note == NOTE_SELECT ) + { + playSound( SND_SELECT ); + } + } +} +/////////////////////////////////////// +// +// match::slot_Preview +// +/////////////////////////////////////// +void match::slot_Preview( int position ) +{ + char tmp; + + if( Paused ) + { + return; + } + clearSelections(); + tmp = Logic->current[position].ManPtr; + if( tmp == Null ) return; + + Logic->HashLegal( tmp ); + + /* If your clicking on one of your chessmen, you can select it. */ + if( ( Logic->chessman[tmp].Army == Logic->OnMove ) && ( Record->Param->type( Logic->OnMove ) & PLAYERLOCAL ) ) + Logic->current[position].Note = NOTE_SELECT; + for( tmp = 0;tmp < 64;tmp++ ) + { + if( Logic->current[tmp].Note != NOTE_NONE ) + { + Board->drawPosition( tmp ); + } + } + drawPosition( 0 ); + playSound( SND_SELECT ); +} +/////////////////////////////////////// +// +// match::recvCMD +// +/////////////////////////////////////// +void match::recvCMD( const Command &constCommand ) +{ + Command cmd( constCommand ); + + if( cmd.getID() != myID ) + return; + ChessMove newMove = cmd.getMove(); + + switch( cmd.getCommand() ) + { + /* CMD_Move */ + case CMD_Move: + if( newMove.ICS_Mode == Null ) + { + /* Not an ICS Move */ + move( newMove ); + } + else + { + /* Do NOT accept a setBoard on a concluded match */ + if( ( Logic->OnMove == -1 ) && ( newMove.ICS_Mode < ICS_Examine ) ) + return; + ICSGameMode = newMove.ICS_Mode; + Logic->OnMove = newMove.ICS_OnMove; + + if( ICSGameMode == ICS_Movelist ) + { + /* Recieving Movelist */ + Logic->chessMove = newMove; + Logic->parseSAN(); + JustMoved = FALSE; + } + else + { + /* Recieving Standard Move */ + Logic->setBoard( cmd.getData(), newMove.ICS_PawnPushFile ); + Logic->MoveCounter = newMove.ICS_MoveCounter; + Logic->chessMove = newMove; + Logic->parseCAN( Logic->OnMove ); + } + chessMove = Logic->chessMove; + /* Run through the Move function */ + if( !JustMoved ) + move(); + else + { + JustMoved = FALSE; + Logic->OnMove = !Logic->OnMove; + } + + Clock->Set( cmd.getWhiteTime(), cmd.getBlackTime(), !newMove.ICS_OnMove ); + if( newMove.ICS_ClockTicking ) + { + Clock->Resume(); + } + else + { + Clock->Pause(); + } + } + break; + + /* CMD_Offer_Draw */ + case CMD_Offer_Draw: + if( cmd.getData() == "W" ) + { + Draw_Offered[WHITE] = 2; + emit setStatusBar( WHITE_DRAW_OFFER ); + } + else + { + Draw_Offered[BLACK] = 2; + emit setStatusBar( BLACK_DRAW_OFFER ); + } + break; + + /* CMD_Illegal */ + case CMD_Illegal: + retract(); + emit setNotation(); + break; + + /* Lost Contact */ + case CMD_Lost_Contact: + Clock->Pause(); + Logic->OnMove = -1; + emit setStatusBar( LOST_CONTACT ); + Record->TAG_Result = "*"; + Record->TAG_Termination = "Lost Contact with Opponent"; + break; + + /* Result White */ + case CMD_Result_White: + Clock->Pause(); + Logic->OnMove = -1; + emit setStatusBar( WHITE_CHECKMATE ); + Record->TAG_Result = "1-0"; + Record->TAG_Termination = "Normal"; + break; + + /* Result Black */ + case CMD_Result_Black: + Clock->Pause(); + Logic->OnMove = -1; + emit setStatusBar( BLACK_CHECKMATE ); + Record->TAG_Result = "0-1"; + Record->TAG_Termination = "Normal"; + break; + + /* Result Draw */ + case CMD_Result_Draw: + Clock->Pause(); + Logic->OnMove = -1; + if( Logic->MoveCounter == 50 ) + { + emit setStatusBar( GAME_50_MOVES ); + } + else + { + emit setStatusBar( GAME_DRAW ); + } + Record->TAG_Result = "1/2-1/2"; + break; + + /* White Resign */ + case CMD_White_Resign: + Clock->Pause(); + Logic->OnMove = -1; + emit setStatusBar( WHITE_RESIGN ); + Record->TAG_Result = "0-1"; + Record->TAG_Termination = "White resigned"; + break; + + /* Black Resign */ + case CMD_Black_Resign: + Clock->Pause(); + Logic->OnMove = -1; + emit setStatusBar( BLACK_RESIGN ); + Record->TAG_Result = "1-0"; + Record->TAG_Termination = "Black resigned"; + break; + + /* White Called Flag */ + case CMD_White_Called_Flag: + Clock->Pause(); + Logic->OnMove = -1; + emit setStatusBar( WHITE_CALL_FLAG ); + Record->TAG_Result = "1-0"; + Record->TAG_Termination = "Black's flag was called"; + break; + + /* Black Called Flag */ + case CMD_Black_Called_Flag: + Clock->Pause(); + Logic->OnMove = -1; + emit setStatusBar( BLACK_CALL_FLAG ); + Record->TAG_Result = "0-1"; + Record->TAG_Termination = "White's flag was called"; + break; + + default: + break; + } +} +/////////////////////////////////////// +// +// match::move +// +/////////////////////////////////////// +bool match::move( ChessMove newMove ) +{ + /* Clear selections from the board */ + clearSelections(); + + Logic->chessMove = newMove; + if( Logic->parseCAN( onMove() ) != TRUE ) + { + if( Logic->parseSAN() != TRUE ) + { + kdDebug() << "#" << myID << ": Recieved bad data: " << newMove.CAN << endl; + return FALSE; + } + } + chessMove = Logic->chessMove; + JustMoved = TRUE; + return move(); +} +bool match::move( void ) +{ + int soundType( SND_MOVE ); + int result(Null); + char manPtr(Null); + QString SAN; + + /* Bring the display up to the latest move before we proceed */ + if( ICSGameMode == Null ) + { + if( Record->currentIndex != ( Record->Positions.count() - 1 ) ) + { + review( Record->Moves.count() - 1 ); + } + } + + /* Clear selections from the board */ + clearSelections(); + + /* Build Pointers */ + char fromPtr = ( chessMove.fromRank << 3 ) + chessMove.fromFile; + char toPtr = ( chessMove.toRank << 3 ) + chessMove.toFile; + + /* Skip all this if we're being called due to normal server moves */ + if( ( JustMoved == TRUE ) || ( ICSGameMode == ICS_Movelist ) ) + { + if( ( fromPtr > 63 ) || ( toPtr > 63 ) ) + return FALSE; + if( ( fromPtr < 0 ) || ( toPtr < 0 ) ) + return FALSE; + manPtr = Logic->current[fromPtr].ManPtr; + if( manPtr == Null ) + return FALSE; + /* Make the move */ + Logic->chessMove = chessMove; + if( Logic->Move() == FALSE ) + return FALSE; + chessMove = Logic->chessMove; + } + + /* Play sound for Promotion */ + if( QString( chessMove.SAN ).contains( QChar( '=' ) ) ) + { + soundType = SND_PROMOTE; + } + + /* Check to see if the game is ended */ + /* 50 Move Rule? */ + if( Logic->MoveCounter == 50 ) + { + result = CMD_Result_Draw; + } + /* + A Draw via 3 move repeat + + if( Record->isThreeMoveDraw() ) + { + result = CMD_Result_Draw; + Record->TAG_Result = "1/2-1/2"; + emit setStatusBar( GAME_DRAW ); + } */ + /* + A Draw? + + Condition 1 = White Material Draw + Condition 2 = Black Material Draw + Condition 3 = Both sides agree to a draw + */ + if( ( Logic->OnMove == BLACK && Logic->isDraw( WHITE ) ) || + ( Logic->OnMove == WHITE && Logic->isDraw( BLACK ) ) || + ( Draw_Offered[WHITE] && Draw_Offered[BLACK] ) ) + { + result = CMD_Result_Draw; + } + + /* Is White under check? */ + if( Logic->isCheck( WHITE ) ) + { + if( !Logic->isLegal( WHITE ) ) + { + SAN += '#'; + result = CMD_Result_Black; + } + else + { + SAN += '+'; + soundType = SND_CHECK; + } + } + + /* Is Black under check? */ + if( Logic->isCheck( BLACK ) ) + { + if( !Logic->isLegal( BLACK ) ) + { + SAN += '#'; + result = CMD_Result_White; + } + else + { + SAN += '+'; + soundType = SND_CHECK; + } + } + + /* Check to make sure this isn't the starting position in an ICS match */ + if( QString( chessMove.SAN ) != "none" ) + { + if( !SAN.isEmpty() ) + { + strcat( chessMove.SAN, SAN.latin1() ); + } + Record->Positions << Logic->board(); + Record->Moves << chessMove; + Record->currentIndex = Record->Moves.count() - 1; + if( JustMoved == TRUE ) + { + /* Send this move to engines and servers */ + emit sendCMD( Command( myID, CMD_Move, centiseconds( WHITE ), centiseconds( BLACK ), + chessMove, Record->notation(FALSE)->join(QString(" ")) ) ); + } + /* Draw The Move */ + if( ICSGameMode != ICS_Movelist ) + Board->drawMove( chessMove ); + } + + /* Take care of changing turns, status messages, etc. */ + if( result == Null ) + { + Clock->Moved(); + if( Paused ) + Clock->Pause(); + + Logic->OnMove = !Logic->OnMove; + /* Set Status Bar */ + if( Logic->OnMove == WHITE ) + { + emit setStatusBar( WHITE_TURN ); + } + if( Logic->OnMove == BLACK ) + { + emit setStatusBar( BLACK_TURN ); + } + + /* Set Cursor */ + if( ( inputOnMove(TRUE) == PLAYERLOCAL ) && ( inputOnMove() != PLAYERLOCAL ) ) + { + Board->setCursor( Resource->CURSOR_Thinking ); + } + else + { + Board->setCursor( Resource->CURSOR_Standard ); + } + + /* Deprecieate Draw Offers */ + if( Draw_Offered[WHITE] ) + { + Draw_Offered[WHITE]--; + } + if( Draw_Offered[BLACK] ) + { + Draw_Offered[BLACK]--; + } + + /* Display NAG Anotation */ + if( chessMove.NAG != 0 ) + { + emit setStatusBar( COMMENT + chessMove.NAG ); + } + } + else + { + /* End of Match */ + Board->setCursor( Resource->CURSOR_Standard ); + recvCMD( Command( myID, result ) ); + emit sendCMD( Command( myID, result ) ); + soundType = SND_MATCH_OVER; + } + emit setNotation(); + + if( ICSGameMode != ICS_Movelist ) + { + Board->redrawLights(); + Board->commit(); + } + /* Play the Sound */ + playSound( soundType ); + + /* Handle special cases */ + if( loading() ) + { + loadTimer = 10; // Loading... + } + else + { + Modified = TRUE; + } + if( preMoved ) + { + preMoved = FALSE; + Board->setPremovePositions( Null, Null ); + chessMove = preMove; + JustMoved = TRUE; + move(); + } +/* if( inputOnMove() == PLAYEREMAIL ) + { + Clock->Pause(); // Email + KMessageBox::questionYesNo( this, + i18n("Would you like to email this move?"), + i18n("Send Email?") ); + } +*/ + return TRUE; +} +/////////////////////////////////////// +// +// match::retract +// +/////////////////////////////////////// +void match::retract( void ) +{ + emit setStatusBar(ILLEGAL_MOVE); + review( Record->Moves.count() - 2 ); + _retract(); +} +void match::_retract( void ) +{ + if( Record->Moves.count() ) + { + Record->Moves.remove( Record->Moves.at( Record->Moves.count() - 1 ) ); + Record->Positions.remove( Record->Positions.at( Record->Positions.count() - 1 ) ); + Record->currentIndex = Record->Moves.count() - 1; + } +} +/////////////////////////////////////// +// +// match::review +// +/////////////////////////////////////// +void match::review( const int Index ) +{ + int tmp(0), step; + QString tmpS; + if( ICSGameMode == ICS_Examine ) + { + /* Examined Game: Use Examine Semantics */ + if( Index < (signed)Record->currentIndex ) + step = -1; + else + step = 1; + if( ( Record->currentIndex == 0 ) && ( Index == 0 ) && ( step == 1 ) ) + { + emit sendCMD( Command( myID, CMD_Examine_Forward ) ); + } + if( step == 1 ) + { + for( tmp = Record->currentIndex; tmp != Index; tmp += step ) + { + emit sendCMD( Command( myID, CMD_Examine_Forward ) ); + } + } + else + { + for( tmp = Record->currentIndex; tmp != Index; tmp += step ) + { + _retract(); + _retract(); + emit sendCMD( Command( myID, CMD_Examine_Backward ) ); + } + } + } + else + { + /* Regular Game: Use Standard Review Semantics */ + if( Record->Positions.count() == 0 ) + return; + if( Index < 0 ) + return; + if( Index > ( (signed int)Record->Positions.count() - 1 ) ) + return; + + /* Review differently depending on our Animation Option */ + if( Resource->OPTION_Animate_Moves ) + { + if( (unsigned)Index > Record->currentIndex ) + { + /* Forward */ + Logic->setBoard( Record->Positions[Index - 1] ); + while( tmp < 64 ) + Board->drawPosition( tmp++ ); + Logic->setBoard( Record->Positions[Index] ); + Board->drawMove( Record->Moves[Index] ); + } + else if( (unsigned)Index < Record->currentIndex ) + { + /* Reverse */ + Logic->setBoard( Record->Positions[Index + 1] ); + while( tmp < 64 ) + Board->drawPosition( tmp++ ); + Board->drawMove( Record->Moves[Index + 1], TRUE ); + Logic->setBoard( Record->Positions[Index] ); + } + } + else + { + /* No Animation */ + Logic->setBoard( Record->Positions[Index] ); + while( tmp < 64 ) + Board->drawPosition( tmp++ ); + Board->drawMove( Record->Moves[Index] ); + } + Board->commit(); + + /* Statusbar shows NAG if available, otherwise Army to move */ + if( Record->Moves[Index].NAG ) + { + tmp = StatusCode; + tmpS = StatusMessage; + emit setStatusBar( COMMENT + Record->Moves[Index].NAG ); + StatusCode = tmp; + StatusMessage = tmpS; + } + else + emit setStatusBar( StatusCode, StatusMessage ); + Record->currentIndex = Index; + } +} +/////////////////////////////////////// +// +// match::playSound +// +/////////////////////////////////////// +void match::playSound( const int snd ) +{ + if( Resource->OPTION_Audio_Current_Only && !Current ) + { + return; + } + Resource->play( snd ); +} +/////////////////////////////////////// +// +// match::drawPosition +// +/////////////////////////////////////// +void match::drawPosition( const int position ) +{ + Board->drawPosition( position ); + Board->commit(); +} +/////////////////////////////////////// +// +// match::requestHint +// +/////////////////////////////////////// +void match::requestHint( void ) +{ + emit sendCMD( Command( myID, CMD_Hint ) ); + emit sendCMD( Command( myID, CMD_UCI_Hint, centiseconds( WHITE ), centiseconds( BLACK ), Record->notation(FALSE)->join(QString(" ")) ) ); +} diff --git a/knights/match.h b/knights/match.h new file mode 100644 index 0000000..22db6a9 --- /dev/null +++ b/knights/match.h @@ -0,0 +1,133 @@ +/*************************************************************************** + match.h - description + ------------------- + begin : Mon Jul 2 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef MATCH_H +#define MATCH_H + +#include +#include "resource.h" +#include "match_param.h" +#include "command.h" +#include "chessclock.h" +#include "logic.h" +#include "pgn.h" + +class board_base; + +class match : public QWidget +{ + Q_OBJECT + + private: + resource *Resource; + board_base *Board; + pgn *Record; + logic *Logic; + chessclock *Clock; + ChessMove chessMove; + ChessMove preMove; + bool preMoved; + bool Modified; + bool Paused; + bool Loading; + bool JustMoved; + bool Current; + int myID; + int StatusCode; + int loadTimer; + QString StatusMessage; + char ICSGameMode; + char Draw_Offered[2]; + + public: + match(QWidget *parent, match_param *param, resource *Rsrc); + ~match(); + char inputOnMove( bool reverse=FALSE ); + char input( char army ); + QString url( void ); + void flip( void ); + void retract( void ); + void requestHint( void ); + void recvCMD( const Command &cmd ); + void setVisibility( const bool vis ); + void setPaused( const bool State ); + /* Inline Function */ + int getID( void ) + { return myID; } + void setID( const int &ID ) + { myID = ID; } + QString caption( void ) + { return Record->caption(); } + char onMove( void ) + { return Logic->OnMove; } + bool modified( void ) + { return Modified; } + bool paused( void ) + { return Paused; } + bool flag( const bool &Army ) + { return Clock->Flag[Army]; } + void setCurrent( const bool &State ) + { Current = State; } + void print( void ) + { Record->print(); } + bool loading( void ) + { return Loading; } + int centiseconds( const bool &Army ) + { return Clock->getCentiseconds( Army ); } + QStringList* notation( void ) + { return Record->notation(); } + void setModified( const bool &state ) + { Modified = state; } + void resendStatusBar( void ) + { emit setStatusBar( StatusCode, StatusMessage ); } + match_param* getParam( void ) + { return Record->Param; } + + public slots: + void tick( void ); + void resize( void ); + void redraw( void ); + QString clock( bool ); + bool save( QString ); + bool load( const QString URL, const int pos=0 ); + void loadSpecial( void ); + void slot_Select( int ); + void slot_Preview( int ); + void slot_flagFell( const bool ); + void review( const int ); + void parseMatchParam( void ); + void saveStatusBar( const int &ID, const QString &MSG ) + { StatusCode = ID; StatusMessage = MSG; } + + protected slots: + bool move( ChessMove ); + + signals: + void setNotation( void ); + void setClocks( void ); + void setStatusBar( const int &ID, const QString &MSG=QString::null ); + void sendCMD( const Command& ); + + protected: + bool move( void ); + void clearSelections( void ); + void drawPosition( const int ); + void playSound( const int ); + void _retract( void ); +}; + +#endif diff --git a/knights/match_param.cpp b/knights/match_param.cpp new file mode 100644 index 0000000..3b356a4 --- /dev/null +++ b/knights/match_param.cpp @@ -0,0 +1,243 @@ +/*************************************************************************** + match_param.cpp - description + ------------------- + begin : Tue Jun 25 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include "match_param.moc" + +match_param::match_param(resource *Rsrc) : QObject() +{ + myResource = Rsrc; + initialize(); +} +match_param::match_param(resource *Rsrc, const int &whiteType, const int &blackType) : QObject() +{ + myResource = Rsrc; + initialize(); + + myResource->Type[WHITE] = Type[WHITE] = whiteType; + myResource->Type[BLACK] = Type[BLACK] = blackType; + lookupNames(); + lookupImages(); +} +match_param::~match_param() +{ +} +/////////////////////////////////////// +// +// match_param::initialize +// +/////////////////////////////////////// +void match_param::initialize( void ) +{ + PlayerNames << "" << "" << "" << ""; + PlayerImages << QPixmap() << QPixmap() << QPixmap() << QPixmap(); + Type[WHITE] = myResource->Type[WHITE]; + Type[WHITE_HELPER] = myResource->Type[WHITE_HELPER]; + Type[BLACK] = myResource->Type[BLACK]; + Type[BLACK_HELPER] = myResource->Type[BLACK_HELPER]; + + Strength[WHITE] = myResource->Strength[WHITE]; + Strength[WHITE_HELPER] = myResource->Strength[WHITE_HELPER]; + Strength[BLACK] = myResource->Strength[BLACK]; + Strength[BLACK_HELPER] = myResource->Strength[BLACK_HELPER]; + + Variation = myResource->MatchRules; + + lookupTCP(); + lookupNames(); + lookupImages(); +} +/////////////////////////////////////// +// +// match_param::lookupNames +// +/////////////////////////////////////// +void match_param::lookupNames( void ) +{ + engineList::Iterator IT; + char ID = 0; + for( int loop=0; loop < 4; loop++) + { + switch( Type[loop] ) + { + case PLAYERLOCAL: + PlayerNames[loop] = myResource->Local_Player; + break; + case PLAYERPC: + /* Convert standard player numbers into engine Reference IDs */ + switch( loop ) + { + case WHITE: + ID = ENGINE_WHITE; + break; + case BLACK: + ID = ENGINE_BLACK; + break; + case WHITE_HELPER: + ID = ENGINE_WHITE_BK; + break; + case BLACK_HELPER: + ID = ENGINE_BLACK_BK; + break; + } + /* Search for Engine. I'm starting to like the idea of maps. =) */ + for( IT = myResource->engines.begin(); IT != myResource->engines.end(); ++IT ) + { + if( (*IT).CurrentRef & ID ) break; + } + if( IT == myResource->engines.end() ) + { + PlayerNames[loop] = i18n("Unknown"); + } + else + { + PlayerNames[loop] = (*IT).Name; + } + break; + case PLAYEREMAIL: + PlayerNames[loop] = myResource->Email_Address; + break; + } + } +} +/////////////////////////////////////// +// +// match_param::lookupTCP +// +/////////////////////////////////////// +void match_param::lookupTCP( void ) +{ + Time_White = myResource->TCPWhite; + Time_Black = myResource->TCPBlack; +} +/////////////////////////////////////// +// +// match_param::lookupImages +// +/////////////////////////////////////// +void match_param::lookupImages( void ) +{ + for( int loop=0; loop < 4; loop++) + { + switch( Type[loop] ) + { + case PLAYERLOCAL: + PlayerImages[loop] = myResource->loadSCIDImage( PlayerNames[loop] ); + if( PlayerImages[loop].isNull() ) + PlayerImages[loop].load( locate("data", "knights/default-portrait.jpg" ) ); + break; + case PLAYERPC: + PlayerImages[loop] = myResource->loadSCIDImage( PlayerNames[loop] ); + if( PlayerImages[loop].isNull() ) + PlayerImages[loop].load( locate("data", "knights/default-engine-portrait.jpg" ) ); + break; + case PLAYEREMAIL: + PlayerImages[loop] = myResource->loadSCIDImage( PlayerNames[loop] ); + if( PlayerImages[loop].isNull() ) + PlayerImages[loop].load( locate("data", "knights/default-portrait.jpg" ) ); + break; + } + } +} +/////////////////////////////////////// +// +// match_param::time +// +/////////////////////////////////////// +TCPList match_param::time( const char &player ) +{ + if( player == BLACK ) + return Time_Black; + return Time_White; +} + +/////////////////////////////////////// +// +// match_param::setTime +// +/////////////////////////////////////// +void match_param::setTime( const char &player, const TCPList &tcp ) +{ + if( player == BLACK ) + myResource->TCPBlack = Time_Black = tcp; + else + myResource->TCPWhite = Time_White = tcp; + setTimer(); +} + +/////////////////////////////////////// +// +// match_param::getVariation +// +/////////////////////////////////////// + +int match_param::getVariation(void) +{ + return Variation; +} + +/////////////////////////////////////// +// +// match_param::setVariation +// +/////////////////////////////////////// +void match_param::setVariation(const int variation) +{ + Variation = variation; + setTimer(); +} + +/////////////////////////////////////// +// +// match_param::setTimer +// +/////////////////////////////////////// +void match_param::setTimer( void ) +{ + if( TimerFlag ) return; + QTimer::singleShot( 0, this, SLOT( slot_Timer() ) ); + TimerFlag = TRUE; +} + +/////////////////////////////////////// +// +// match_param::slot_Timer +// +/////////////////////////////////////// +void match_param::slot_Timer( void ) +{ + emit valuesChanged(); + TimerFlag = FALSE; +} + +/////////////////////////////////////// +// +// match_param::setType +// +/////////////////////////////////////// +void match_param::setType( const int &player, const char &type ) +{ + myResource->Type[player] = Type[player] = type; + lookupNames(); + lookupImages(); + setTimer(); +} + diff --git a/knights/match_param.h b/knights/match_param.h new file mode 100644 index 0000000..ff48227 --- /dev/null +++ b/knights/match_param.h @@ -0,0 +1,100 @@ +/*************************************************************************** + match_param.h - description + ------------------- + begin : Tue Jun 25 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef MATCH_PARAM_H +#define MATCH_PARAM_H + +/** + *@author Troy Corbin Jr. + */ + +#include +#include +#include +#include +#include +#include "definitions.h" +#include "resource.h" + +class match_param : public QObject +{ + Q_OBJECT + + private: + resource *myResource; + QStringList PlayerNames; + QValueList PlayerImages; + + /* + This is used to keep the signal valuesChanged + from triggering multiple times in a row. + */ + bool TimerFlag; + + char Type[4]; + TCPList Time_White; + TCPList Time_Black; + char Strength[4]; + int Variation; + + protected: + void initialize( void ); + void lookupTCP( void ); + void lookupNames( void ); + void lookupImages( void ); + void setTimer( void ); + + public: + match_param( resource *Rsrc=0 ); + match_param( resource*, const int &whiteType, const int &blackType ); + ~match_param(); + + char type( const int &player ) + { return Type[player]; } + + char strength( const int &player ) + { return Strength[player]; } + + QPixmap image( const char &player ) + { return PlayerImages[player]; } + + QString name( const char &player ) + { return PlayerNames[player]; } + + TCPList time( const char &player ); + + void setType( const int &player, const char &type ); + + void setStrength( const int &player, const char &str ) + { setTimer(); myResource->Strength[player] = Strength[player] = str; } + + void setTime( const char &player, const TCPList &tcp ); + + void setName( const int &player, const QString &name ) + { PlayerNames[player] = name; } + + void setVariation( const int variation ); + int getVariation( void ); + + public slots: + void slot_Timer( void ); + + signals: + void valuesChanged( void ); +}; + +#endif diff --git a/knights/pgn.cpp b/knights/pgn.cpp new file mode 100644 index 0000000..a4de0a6 --- /dev/null +++ b/knights/pgn.cpp @@ -0,0 +1,1464 @@ +/*************************************************************************** + pgn.cpp - description + ------------------- + begin : Mon Jul 30 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "pgn.moc" +#include "tabmanager.h" +#include "tab_pgnview.h" + +pgn::pgn( resource *Rsrc, match_param *param ) +{ + Resource = Rsrc; + Param = param; + pgnView = NULL; + + if( Param != NULL ) + { + connect( Param, SIGNAL( valuesChanged() ), this, SLOT( parseMatchParam() ) ); + } +} +pgn::~pgn() +{ + if( Param ) + delete Param; + if( pgnView ) + { + if( Resource->tabManager->isTab( pgnView ) ) + { + Resource->tabManager->removeTab( pgnView ); + } + } +} +/////////////////////////////////////// +// +// pgn::parseMatchParam +// +/////////////////////////////////////// +void pgn::parseMatchParam( void ) +{ + if( Param == NULL ) + return; + TAG_White = Param->name( WHITE ); + TAG_Black = Param->name( BLACK ); + switch( Param->type( BLACK ) ) + { + case PLAYERLOCAL: + TAG_BlackType = "human"; + break; + case PLAYERPC: + TAG_BlackType = "program"; + break; + case PLAYERTCP: + TAG_BlackType = "unknown"; + TAG_Mode = "ICS"; + break; + case PLAYEREMAIL: + TAG_BlackType = "unknown"; + TAG_Mode = "EM"; + break; + default: + TAG_BlackType = "unknown"; + break; + } + switch( Param->type( WHITE ) ) + { + case PLAYERLOCAL: + TAG_WhiteType = "human"; + break; + case PLAYERPC: + TAG_WhiteType = "program"; + break; + case PLAYERTCP: + TAG_WhiteType = "unknown"; + TAG_Mode = "ICS"; + break; + case PLAYEREMAIL: + TAG_WhiteType = "unknown"; + TAG_Mode = "EM"; + break; + default: + TAG_WhiteType = "unknown"; + break; + } +} +/////////////////////////////////////// +// +// pgn::notation +// +/////////////////////////////////////// +QStringList* pgn::notation( const int format ) +{ + QStringList *list; + QString notation; + MoveList::Iterator IT; + Annotation *annon; + int tmp(0), Line(0); + bool showLineNumber( false ); + + list = new QStringList; + + switch( format ) + { + case 0: + /* CAN Raw move data ( ie. for UCI engines ) */ + for( IT = Moves.begin(); IT != Moves.end(); ++IT ) + { + list->append( QString( (*IT).CAN ) ); + } + break; + + case 1: + /* SAN For display to the user */ + for( IT = Moves.begin(); IT != Moves.end(); ++IT ) + { + Line = ( tmp + 2 ) >> 1; + if( ( tmp % 2 ) == 0 ) + { + notation = QString( "%1. %2" ).arg( Line ).arg( (*IT).SAN ); + } + else + { + notation = QString( "%1... %2" ).arg( Line ).arg( (*IT).SAN ); + } + list->append( notation ); + tmp++; + } + break; + + case 2: + /* SAN For PGN */ + for( IT = Moves.begin(); IT != Moves.end(); ++IT ) + { + Line = ( tmp + 2 ) >> 1; + if( ( tmp % 2 ) == 0 ) + { + notation = QString( "%1. %2" ).arg( Line ).arg( (*IT).SAN ); + } + else + { + if( showLineNumber ) + { + notation = QString( "%1... %2" ).arg( Line ).arg( (*IT).SAN ); + } + else + { + notation = QString( (*IT).SAN ); + } + } + showLineNumber = false; + /* Insert NAGs */ + if( (*IT).NAG != 0 ) + { + notation += QString( " $%1" ).arg( QString::number( (*IT).NAG ) ); + } + /* Insert RAVs */ + annon = RAV.find( tmp ); + if( annon != NULL ) + { + notation += QString( " (%1)" ).arg( annon->text ); + showLineNumber = true; + } + /* Insert Annotations */ + annon = annotations.find( tmp ); + if( annon != NULL ) + { + notation += QString( " {%1}" ).arg( annon->text ); + showLineNumber = true; + } + list->append( notation ); + tmp++; + } + break; + + default: + break; + } + return list; +} +/////////////////////////////////////// +// +// pgn::caption +// +/////////////////////////////////////// +QString pgn::caption( void ) +{ + QString caption; + + caption = i18n( "%1 vs. %2").arg( TAG_White ).arg( TAG_Black ); + return caption; +} +/////////////////////////////////////// +// +// pgn::clear +// +/////////////////////////////////////// +void pgn::clear( void ) +{ + Moves.clear(); + RAV.clear(); + annotations.clear(); + Positions.clear(); + currentIndex = 0; + whiteTCP.clear(); + blackTCP.clear(); + whiteTime = 300; + blackTime = 300; + CurrentURL = ""; + Move_Data.clear(); + clearTags(); +} +/////////////////////////////////////// +// +// pgn::clearTags +// +/////////////////////////////////////// +void pgn::clearTags( void ) +{ + TAG_Site = ""; + TAG_Date = ""; + TAG_Round = ""; + TAG_Result = ""; + TAG_White = ""; + TAG_WhiteTitle = ""; + TAG_WhiteElo = ""; + TAG_WhiteUSCF = ""; + TAG_WhiteNA = ""; + TAG_WhiteType = ""; + TAG_Black = ""; + TAG_BlackTitle = ""; + TAG_BlackElo = ""; + TAG_BlackUSCF = ""; + TAG_BlackNA = ""; + TAG_BlackType = ""; + TAG_Time = ""; + TAG_UTCTime = ""; + TAG_UTCDate = ""; + TAG_Event = ""; + TAG_EventDate = ""; + TAG_EventSponsor = ""; + TAG_Section = ""; + TAG_Stage = ""; + TAG_Board = ""; + TAG_Opening = ""; + TAG_Variation = ""; + TAG_SubVariation = ""; + TAG_ECO = ""; + TAG_NIC = ""; + TAG_TimeControl = ""; + TAG_Termination = ""; + TAG_SetUp = ""; + TAG_FEN = ""; + TAG_Annotator = ""; + TAG_Mode = ""; + TAG_PlyCount = ""; +} +/////////////////////////////////////// +// +// pgn::init +// +/////////////////////////////////////// +void pgn::init( void ) +{ + QString temp; + struct utsname unamePtr; + QDateTime qdt; + + clear(); + parseMatchParam(); + uname( &unamePtr ); + + /* Build Date */ + qdt = QDateTime::currentDateTime(); + TAG_Date = QString("%1.%2.%3").arg(qdt.date().year(),4).arg(qdt.date().month(),2).arg(qdt.date().day(),2); + TAG_Date = TAG_Date.replace( QRegExp("\\s"), QString("0") ); + TAG_Time = qdt.time().toString(); + + TAG_Site = unamePtr.nodename; + TAG_Event = "Knights Computer Chess Game"; + TAG_Round = "-"; + TAG_Result = "*"; +} +/////////////////////////////////////// +// +// pgn::scan +// +/////////////////////////////////////// +int pgn::scan( void ) +{ + register int Section(0); + QChar c; + + clearTags(); + File_Position = File.at(); + + /* Toplevel parsing loop */ + while( 1 ) + { + /* Is this the end of the .pgn file? */ + if( Input.atEnd() ) + { + close(); + return 100; // 100% Complete + } + currentLine = Input.readLine(); + if( currentLine.isEmpty() ) + { + if( Section == 1 ) + return (int)( ( (float)File.at() / (float)File.size() ) * 100.0 ); + } + c = getch(); + while( c != QChar::null ) + { + switch( c ) + { + /* Tag Pair */ + case '[': + parseTag(); + break; + case '%': /* Fall through */ + case ';': + c = QChar::null; + continue; + break; + default: + Section = 1; + c = QChar::null; + continue; + break; + } + c = getch(); + } + } + /* We should NEVER reach this point */ + close(); + return -1; +} +/////////////////////////////////////// +// +// pgn::load +// +/////////////////////////////////////// +bool pgn::load( const int pos ) +{ + QString Token, + Value; + QChar c; + + File.at(pos); + clear(); + + /* Toplevel parsing loop */ + while( 1 ) + { + if( Input.atEnd() ) + break; + currentLine = Input.readLine(); + if( currentLine.isEmpty() ) + { + /* Finished with TAGs... now grab the move data for display */ + File_Position = File.at(); + while( 1 ) + { + currentLine = Input.readLine(); + if( ( currentLine.at(0) == '[' ) || Input.atEnd() ) + break; + Move_Data << currentLine; + } + /* Allocate the Tab_PGNView */ + pgnView = new tab_pgnView( this, Resource ); + connect( pgnView, SIGNAL( destroyed() ), this, SLOT( childViewDestroyed() ) ); + Resource->tabManager->addTab( pgnView, i18n( "%1 vs. %2" ).arg( TAG_White ).arg( TAG_Black ) ); + pgnView->init(); + File.at( File_Position ); + currentLine = ""; + return TRUE; + } + c = getch(); + while( c != QChar::null ) + { + Token = ""; + Value = ""; + switch( c ) + { + /* Special break... look for the Knights tag */ + case '%': + Value = getword(); + if( Value == "KNIGHTS_CMD" ) parseKnightsData(); + /* Fall through */ + case ';': + c = QChar::null; + continue; + break; + /* Tag Pair */ + case '[': + parseTag(); + break; + default: + c = QChar::null; + break; + } + c = getch(); + } + } + close(); + return TRUE; +} +/////////////////////////////////////// +// +// pgn::loadNext +// +/////////////////////////////////////// +bool pgn::loadNext( void ) +{ + QChar c; + QString Value; + ChessMove Move; + bool postMove( FALSE ); + + /* Toplevel parsing loop */ + while( 1 ) + { + if( currentLine.isEmpty() ) + { + if( Input.atEnd() ) break; + currentLine = Input.readLine(); + } + c = getch(); + while( c != QChar::null ) + { + Value = ""; + switch( c ) + { + /* Special break... look for the Knights tag */ + case '%': + Value = getword(); + if( Value == "KNIGHTS_CMD" ) parseKnightsData(); + /* Fall through */ + case ';': + c = QChar::null; + continue; + /* Tag Pair...next game, so we're done. */ + case '[': + return FALSE; + /* Numeric Annotation Glyph */ + case '$': + c = getch(); + while( ( c >= '0' ) && ( c <= '9' ) ) + { + Value += c; + c = getch(); + } + Moves[ Moves.count() - 1 ].NAG = Value.toInt(); + break; + /* Recursive Annotation Variations */ + case '(': + parseRAV(); + break; + /* Textual Annotation */ + case '{': + parseAnnotation(); + break; + /* Reserved for future expansion by the PGN */ + case '<': + while( c != '>' ) c = getch(); + break; + /* Everything from '0' to '*' is null to us and falls through */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ' ': + case '/': + case '-': + case '.': + case '*': + break; + default: + if( postMove ) + { + currentLine.prepend( c ); + return TRUE; + } + /* Catch Standard Algebraic Notation */ + while( ( c != QChar::null ) && + ( c != ' ' ) && + ( c != ';' ) && + ( c != '%' ) ) + { + Value += c; + c = getch(); + } + strcpy( Move.SAN, Value.latin1() ); + emit processMove( Move ); + postMove = TRUE; + } + c = getch(); + } + } + return FALSE; +} +/////////////////////////////////////// +// +// pgn::save +// +/////////////////////////////////////// +bool pgn::save( QString URL ) +{ + QFile Save( URL ); + QTextStream *Output; + QString Token, + Value; + + close(); + CurrentURL = URL; + if( Resource->OPTION_Reuse_PGN && ( URL == Resource->PGN_Filename ) ) + { + Save.open( IO_WriteOnly | IO_Append ); + } + else + { + Save.open( IO_WriteOnly ); + } + Output = new QTextStream( &Save ); + (*Output) << "[Event \"" << TAG_Event << "\"]\n"; + (*Output) << "[Site \"" << TAG_Site << "\"]\n"; + (*Output) << "[Date \"" << TAG_Date << "\"]\n"; + (*Output) << "[Round \"" << TAG_Round << "\"]\n"; + (*Output) << "[White \"" << TAG_White << "\"]\n"; + (*Output) << "[Black \"" << TAG_Black << "\"]\n"; + (*Output) << "[Result \"" << TAG_Result << "\"]\n"; + if( !TAG_TimeControl.isEmpty() ) + (*Output) << "[TimeControl \"" << TAG_TimeControl << "\"]\n"; + if( !TAG_WhiteTitle.isEmpty() ) + (*Output) << "[WhiteTitle \"" << TAG_WhiteTitle << "\"]\n"; + if( !TAG_WhiteElo.isEmpty() ) + (*Output) << "[WhiteElo \"" << TAG_WhiteElo << "\"]\n"; + if( !TAG_WhiteUSCF.isEmpty() ) + (*Output) << "[WhiteUSCF \"" << TAG_WhiteUSCF << "\"]\n"; + if( !TAG_WhiteNA.isEmpty() ) + (*Output) << "[WhiteNA \"" << TAG_WhiteNA << "\"]\n"; + if( !TAG_WhiteType.isEmpty() ) + (*Output) << "[WhiteType \"" << TAG_WhiteType << "\"]\n"; + if( !TAG_BlackTitle.isEmpty() ) + (*Output) << "[BlackTitle \"" << TAG_BlackTitle << "\"]\n"; + if( !TAG_BlackElo.isEmpty() ) + (*Output) << "[BlackElo \"" << TAG_BlackElo << "\"]\n"; + if( !TAG_BlackUSCF.isEmpty() ) + (*Output) << "[BlackUSCF \"" << TAG_BlackUSCF << "\"]\n"; + if( !TAG_BlackNA.isEmpty() ) + (*Output) << "[BlackNA \"" << TAG_BlackNA << "\"]\n"; + if( !TAG_BlackType.isEmpty() ) + (*Output) << "[BlackType \"" << TAG_BlackType << "\"]\n"; + if( !TAG_Time.isEmpty() ) + (*Output) << "[Time \"" << TAG_Time << "\"]\n"; + if( !TAG_UTCTime.isEmpty() ) + (*Output) << "[UTCTime \"" << TAG_UTCTime << "\"]\n"; + if( !TAG_UTCDate.isEmpty() ) + (*Output) << "[UTCDate \"" << TAG_UTCDate << "\"]\n"; + if( !TAG_EventDate.isEmpty() ) + (*Output) << "[EventDate \"" << TAG_EventDate << "\"]\n"; + if( !TAG_EventSponsor.isEmpty() ) + (*Output) << "[EventSponsor \"" << TAG_EventSponsor << "\"]\n"; + if( !TAG_Section.isEmpty() ) + (*Output) << "[Section \"" << TAG_Section << "\"]\n"; + if( !TAG_Stage.isEmpty() ) + (*Output) << "[Stage \"" << TAG_Stage << "\"]\n"; + if( !TAG_Board.isEmpty() ) + (*Output) << "[Board \"" << TAG_Board << "\"]\n"; + if( !TAG_Opening.isEmpty() ) + (*Output) << "[Opening \"" << TAG_Opening << "\"]\n"; + if( !TAG_Variation.isEmpty() ) + (*Output) << "[Variation \"" << TAG_Variation << "\"]\n"; + if( !TAG_SubVariation.isEmpty() ) + (*Output) << "[SubVariation \"" << TAG_SubVariation << "\"]\n"; + if( !TAG_ECO.isEmpty() ) + (*Output) << "[ECO \"" << TAG_ECO << "\"]\n"; + if( !TAG_NIC.isEmpty() ) + (*Output) << "[NIC \"" << TAG_NIC << "\"]\n"; + if( !TAG_Termination.isEmpty() ) + (*Output) << "[Termination \"" << TAG_Termination << "\"]\n"; + if( !TAG_SetUp.isEmpty() ) + (*Output) << "[SetUp \"" << TAG_SetUp << "\"]\n"; + if( !TAG_FEN.isEmpty() ) + (*Output) << "[FEN \"" << TAG_FEN << "\"]\n"; + if( !TAG_Annotator.isEmpty() ) + (*Output) << "[Annotator \"" << TAG_Annotator << "\"]\n"; + if( !TAG_Mode.isEmpty() ) + (*Output) << "[Mode \"" << TAG_Mode << "\"]\n"; + TAG_PlyCount = QString().setNum( Moves.count() ); + (*Output) << "[PlyCount \"" << TAG_PlyCount << "\"]\n"; + + /* Save internal data if this game is unfinished */ + if( TAG_Result == "*" ) + { + (*Output) << "% KNIGHTS_CMD WhiteType "; + switch( Param->type(WHITE) ) + { + case PLAYERPC: + (*Output) << "PC\n"; + break; + case PLAYERTCP: + (*Output) << "TCP\n"; + break; + case PLAYEREMAIL: + (*Output) << "Email\n"; + break; + case PLAYERLOCAL: + default: + (*Output) << "Local\n"; + break; + } + (*Output) << "% KNIGHTS_CMD BlackType "; + switch( Param->type(BLACK) ) + { + case PLAYERPC: + (*Output) << "PC\n"; + break; + case PLAYERTCP: + (*Output) << "TCP\n"; + break; + case PLAYEREMAIL: + (*Output) << "Email\n"; + break; + case PLAYERLOCAL: + default: + (*Output) << "Local\n"; + break; + } + (*Output) << "% KNIGHTS_CMD WhiteTime " << whiteTime << "\n"; + (*Output) << "% KNIGHTS_CMD BlackTime " << blackTime << "\n"; + (*Output) << "% KNIGHTS_CMD DONE\n"; + } + /* End of internal data save */ + + (*Output) << "\n"; + QStringList *list = notation(2); + QString SAN = list->join( " " ); + delete list; + + kdWarning() << SAN.right( 20 ) << endl; + + unsigned int pos = 80; + unsigned int lastPos = 0; + while( pos < SAN.length() ) + { + while( SAN.at( pos ) != ' ' ) + pos--; + SAN = SAN.replace( pos, 1, QString("\n") ); + lastPos = pos; + pos = lastPos + 80; + } + kdWarning() << SAN.right( 20 ) << endl; + + (*Output) << SAN << " " << TAG_Result << "\n\n"; + Save.close(); + return TRUE; +} +/////////////////////////////////////// +// +// pgn::getch +// +/////////////////////////////////////// +QChar pgn::getch( void ) +{ + QChar c; + + c = currentLine.at(0); + currentLine.remove( 0, 1 ); + return c; +} +/////////////////////////////////////// +// +// pgn::getword +// +/////////////////////////////////////// +QString pgn::getword( void ) +{ + QChar c; + QString word; + + do + { + c = getch(); + } while( c == ' ' ); + + while( ( c != ' ' ) && ( c != QChar::null ) ) + { + word += c; + c = getch(); + } + return word; +} +/////////////////////////////////////// +// +// pgn::open +// +/////////////////////////////////////// +bool pgn::open( const QString &URL ) +{ + close(); + if( !KIO::NetAccess::download( URL, tempFile ) ) + return FALSE; + + File.setName( tempFile ); + if( !File.open( IO_ReadOnly ) ) + { + close(); + return FALSE; + } + Input.setDevice( &File ); + CurrentURL = URL; + File.at(0); + return TRUE; +} +/////////////////////////////////////// +// +// pgn::close +// +/////////////////////////////////////// +void pgn::close( void ) +{ + if( !File.isOpen() ) + { + File.close(); + } + if( !tempFile.isEmpty() ) + { + KIO::NetAccess::removeTempFile( tempFile ); + tempFile = ""; + } +} +/////////////////////////////////////// +// +// pgn::parseTag +// +/////////////////////////////////////// +void pgn::parseTag( void ) +{ + QChar c; + QString Token; + QString Value; + + c = getch(); + while( c == ' ' ) c = getch(); + while( c != '\"' ) + { + if( c == ' ' ) + { + c = getch(); + continue; + } + Token += c; + c = getch(); + } + c = getch(); + while( c != '\"' ) + { + Value += c; + c = getch(); + } + c = getch(); + while( c != ']' ) c = getch(); + /* Now Apply the Token/Value that we got */ + if( Token == "Site" ) TAG_Site = Value; + else if( Token == "Date" ) TAG_Date = Value; + else if( Token == "Round" ) TAG_Round = Value; + else if( Token == "Result" ) TAG_Result = Value; + + else if( Token == "White" ) TAG_White = Value; + else if( Token == "WhiteTitle" ) TAG_WhiteTitle = Value; + else if( Token == "WhiteElo" ) TAG_WhiteElo = Value; + else if( Token == "WhiteUSCF" ) TAG_WhiteUSCF = Value; + else if( Token == "WhiteNA" ) TAG_WhiteNA = Value; + else if( Token == "WhiteType" ) TAG_WhiteType = Value; + + else if( Token == "Black" ) TAG_Black = Value; + else if( Token == "BlackTitle" ) TAG_BlackTitle = Value; + else if( Token == "BlackElo" ) TAG_BlackElo = Value; + else if( Token == "BlackUSCF" ) TAG_BlackUSCF = Value; + else if( Token == "BlackNA" ) TAG_BlackNA = Value; + else if( Token == "BlackType" ) TAG_BlackType = Value; + + else if( Token == "Time" ) TAG_Time = Value; + else if( Token == "UTCTime" ) TAG_UTCTime = Value; + else if( Token == "UTCDate" ) TAG_UTCDate = Value; + + else if( Token == "Event" ) TAG_Event = Value; + else if( Token == "EventDate" ) TAG_EventDate = Value; + else if( Token == "EventSponsor") TAG_EventSponsor = Value; + else if( Token == "Section" ) TAG_Section = Value; + else if( Token == "Stage" ) TAG_Stage = Value; + else if( Token == "Board" ) TAG_Board = Value; + + else if( Token == "Opening" ) TAG_Opening = Value; + else if( Token == "Variation" ) TAG_Variation = Value; + else if( Token == "SubVariation" ) TAG_SubVariation = Value; + else if( Token == "ECO" ) TAG_ECO = Value; + else if( Token == "NIC" ) TAG_NIC = Value; + + else if( Token == "TimeControl" ) TAG_TimeControl = Value; + else if( Token == "Termination" ) TAG_Termination = Value; + else if( Token == "SetUp" ) TAG_SetUp = Value; + else if( Token == "FEN" ) TAG_FEN = Value; + else if( Token == "Annotator" ) TAG_Annotator = Value; + else if( Token == "Mode" ) TAG_Mode = Value; + else if( Token == "PlyCount" ) TAG_PlyCount = Value; +} +/////////////////////////////////////// +// +// pgn::Parse_Annotation +// +/////////////////////////////////////// +void pgn::parseAnnotation( const int fromRAVnum ) +{ + Annotation *annon = new Annotation; + QChar c; + + c = getch(); + while( c != '}' ) + { + if( c == QChar::null ) + { + if( Input.eof() ) break; + currentLine = Input.readLine(); + c = ' '; + } + annon->text += c; + c = getch(); + } + annon->RAV = fromRAVnum; + annotations.add( Moves.count() - 1, annon ); +// kdWarning() << "# " << annon.pos << " : " << annon.text << endl; +} +/////////////////////////////////////// +// +// pgn::Parse_RAV +// +/////////////////////////////////////// +void pgn::parseRAV( void ) +{ + int RAVLevel(1); + Annotation *annon = new Annotation; + QChar c; + + while( RAVLevel ) + { + c = getch(); + if( c == QChar::null ) + { + if( Input.eof() ) + break; + currentLine = Input.readLine(); + c = ' '; + } + if( c == ')' ) + { + RAVLevel--; + if( !RAVLevel ) + break; + } + if( c == '(' ) + { + RAVLevel++; + } + annon->text += c; + } + RAV.add( Moves.count() - 1, annon ); +// kdWarning() << "# " << annon.pos << " : " << annon.text << endl; +} +/////////////////////////////////////// +// +// pgn::parseKnightsData +// +/////////////////////////////////////// +void pgn::parseKnightsData( void ) +{ + QString Key; + QString Value; + + Key = getword(); + if( Key == "DONE" ) + { + emit processSpecial(); + return; + } + if( Key == "WhiteType" ) + { + Value = getword(); + if( Value == "Local" ) Param->setType(WHITE, PLAYERLOCAL); + if( Value == "PC" ) Param->setType(WHITE, PLAYERPC); + if( Value == "TCP" ) Param->setType(WHITE, PLAYERTCP); + if( Value == "Email" ) Param->setType(WHITE, PLAYEREMAIL); + return; + } + if( Key == "BlackType" ) + { + Value = getword(); + if( Value == "Local" ) Param->setType(BLACK, PLAYERLOCAL); + if( Value == "PC" ) Param->setType(BLACK, PLAYERPC); + if( Value == "TCP" ) Param->setType(BLACK, PLAYERTCP); + if( Value == "Email" ) Param->setType(BLACK, PLAYEREMAIL); + return; + } + if( Key == "WhiteTime" ) + { + Value = getword(); + whiteTime = Value.toInt(); + return; + } + if( Key == "BlackTime" ) + { + Value = getword(); + blackTime = Value.toInt(); + return; + } +} +/////////////////////////////////////// +// +// pgn::print +// +/////////////////////////////////////// +void pgn::print( void ) +{ + if( !pgnView ) + { + /* Allocate the Tab_PGNView */ + pgnView = new tab_pgnView( this, Resource ); + Resource->tabManager->addTab( pgnView, i18n( "%1 vs. %2" ).arg( TAG_White ).arg( TAG_Black ) ); + connect( pgnView, SIGNAL( destroyed() ), this, SLOT( childViewDestroyed() ) ); + pgnView->init(); + } + pgnView->print(); +} +/////////////////////////////////////// +// +// pgn::childViewDestroyed +// +/////////////////////////////////////// +void pgn::childViewDestroyed( void ) +{ + pgnView = NULL; +} +/////////////////////////////////////// +// +// pgn::getNAG +// +/////////////////////////////////////// +QString pgn::getNAG( int num ) +{ + QString Line; + + switch( num ) + { + case 1: + Line = i18n( "Good move" ); + break; + case 2: + Line = i18n( "Poor move" ); + break; + case 3: + Line = i18n( "Very good move" ); + break; + case 4: + Line = i18n( "Very poor move" ); + break; + case 5: + Line = i18n( "Speculative move" ); + break; + case 6: + Line = i18n( "Questionable move" ); + break; + case 7: + Line = i18n( "Forced move" ); + break; + case 8: + Line = i18n( "Singular move" ); + break; + case 9: + Line = i18n( "Worst move" ); + break; + case 10: + Line = i18n( "Drawish position" ); + break; + case 11: + Line = i18n( "Equal chances, quiet position" ); + break; + case 12: + Line = i18n( "Equal chances, active position" ); + break; + case 13: + Line = i18n( "Unclear position" ); + break; + case 14: + Line = i18n( "White has a slight advantage" ); + break; + case 15: + Line = i18n( "Black has a slight advantage" ); + break; + case 16: + Line = i18n( "White has a moderate advantage" ); + break; + case 17: + Line = i18n( "Black has a moderate advantage" ); + break; + case 18: + Line = i18n( "White has a decisive advantage" ); + break; + case 19: + Line = i18n( "Black has a decisive advantage" ); + break; + case 20: + Line = i18n( "White has a crushing advantage ( Black should resign )" ); + break; + case 21: + Line = i18n( "Black has a crushing advantage ( White should resign )" ); + break; + case 22: + Line = i18n( "White is in zugzwang" ); + break; + case 23: + Line = i18n( "Black is in zugzwang" ); + break; + case 24: + Line = i18n( "White has a slight space advantage" ); + break; + case 25: + Line = i18n( "Black has a slight space advantage" ); + break; + case 26: + Line = i18n( "White has a moderate space advantage" ); + break; + case 27: + Line = i18n( "Black has a moderate space advantage" ); + break; + case 28: + Line = i18n( "White has a decisive space advantage" ); + break; + case 29: + Line = i18n( "Black has a decisive space advantage" ); + break; + case 30: + Line = i18n( "White has a slight time ( development ) advantage" ); + break; + case 31: + Line = i18n( "Black has a slight time ( development ) advantage" ); + break; + case 32: + Line = i18n( "White has a moderate time ( development ) advantage" ); + break; + case 33: + Line = i18n( "Black has a moderate time ( development ) advantage" ); + break; + case 34: + Line = i18n( "White has a decisive time ( development ) advantage" ); + break; + case 35: + Line = i18n( "Black has a decisive time ( development ) advantage" ); + break; + case 36: + Line = i18n( "White has the initiative" ); + break; + case 37: + Line = i18n( "Black has the initiative" ); + break; + case 38: + Line = i18n( "White has a lasting initiative" ); + break; + case 39: + Line = i18n( "Black has a lasting initiative" ); + break; + case 40: + Line = i18n( "White has the attack" ); + break; + case 41: + Line = i18n( "Black has the attack" ); + break; + case 42: + Line = i18n( "White has insufficient compensation for material deficit" ); + break; + case 43: + Line = i18n( "Black has insufficient compensation for material deficit" ); + break; + case 44: + Line = i18n( "White has sufficient compensation for material deficit" ); + break; + case 45: + Line = i18n( "Black has sufficient compensation for material deficit" ); + break; + case 46: + Line = i18n( "White has more than adequate compensation for material deficit" ); + break; + case 47: + Line = i18n( "Black has more than adequate compensation for material deficit" ); + break; + case 48: + Line = i18n( "White has a slight center control advantage" ); + break; + case 49: + Line = i18n( "Black has a slight center control advantage" ); + break; + case 50: + Line = i18n( "White has a moderate center control advantage" ); + break; + case 51: + Line = i18n( "Black has a moderate center control advantage" ); + break; + case 52: + Line = i18n( "White has a decisive center control advantage" ); + break; + case 53: + Line = i18n( "Black has a decisive center control advantage" ); + break; + case 54: + Line = i18n( "White has a slight kingside control advantage" ); + break; + case 55: + Line = i18n( "Black has a slight kingside control advantage" ); + break; + case 56: + Line = i18n( "White has a moderate kingside control advantage" ); + break; + case 57: + Line = i18n( "Black has a moderate kingside control advantage" ); + break; + case 58: + Line = i18n( "White has a decisive kingside control advantage" ); + break; + case 59: + Line = i18n( "Black has a decisive kingside control advantage" ); + break; + case 60: + Line = i18n( "White has a slight queenside control advantage" ); + break; + case 61: + Line = i18n( "Black has a slight queenside control advantage" ); + break; + case 62: + Line = i18n( "White has a moderate queenside control advantage" ); + break; + case 63: + Line = i18n( "Black has a moderate queenside control advantage" ); + break; + case 64: + Line = i18n( "White has a decisive queenside control advantage" ); + break; + case 65: + Line = i18n( "Black has a decisive queenside control advantage" ); + break; + case 66: + Line = i18n( "White has a vulnerable first rank" ); + break; + case 67: + Line = i18n( "Black has a vulnerable first rank" ); + break; + case 68: + Line = i18n( "White has a well protected first rank" ); + break; + case 69: + Line = i18n( "Black has a well protected first rank" ); + break; + case 70: + Line = i18n( "White has a poorly protected king" ); + break; + case 71: + Line = i18n( "Black has a poorly protected king" ); + break; + case 72: + Line = i18n( "White has a well protected king" ); + break; + case 73: + Line = i18n( "Black has a well protected king" ); + break; + case 74: + Line = i18n( "White has a poorly placed king" ); + break; + case 75: + Line = i18n( "Black has a poorly placed king" ); + break; + case 76: + Line = i18n( "White has a well placed king" ); + break; + case 77: + Line = i18n( "Black has a well placed king" ); + break; + case 78: + Line = i18n( "White has a very weak pawn structure" ); + break; + case 79: + Line = i18n( "Black has a very weak pawn structure" ); + break; + case 80: + Line = i18n( "White has a moderately weak pawn structure" ); + break; + case 81: + Line = i18n( "Black has a moderately weak pawn structure" ); + break; + case 82: + Line = i18n( "White has a moderately strong pawn structure" ); + break; + case 83: + Line = i18n( "Black has a moderately strong pawn structure" ); + break; + case 84: + Line = i18n( "White has a very strong pawn structure" ); + break; + case 85: + Line = i18n( "Black has a very strong pawn structure" ); + break; + case 86: + Line = i18n( "White has poor knight placement" ); + break; + case 87: + Line = i18n( "Black has poor knight placement" ); + break; + case 88: + Line = i18n( "White has good knight placement" ); + break; + case 89: + Line = i18n( "Black has good knight placement" ); + break; + case 90: + Line = i18n( "White has poor bishop placement" ); + break; + case 91: + Line = i18n( "Black has poor bishop placement" ); + break; + case 92: + Line = i18n( "White has good bishop placement" ); + break; + case 93: + Line = i18n( "Black has good bishop placement" ); + break; + case 94: + Line = i18n( "White has poor rook placement" ); + break; + case 95: + Line = i18n( "Black has poor rook placement" ); + break; + case 96: + Line = i18n( "White has good rook placement" ); + break; + case 97: + Line = i18n( "Black has good rook placement" ); + break; + case 98: + Line = i18n( "White has poor queen placement" ); + break; + case 99: + Line = i18n( "Black has poor queen placement" ); + break; + case 100: + Line = i18n( "White has good queen placement" ); + break; + case 101: + Line = i18n( "Black has good queen placement" ); + break; + case 102: + Line = i18n( "White has poor piece coordination" ); + break; + case 103: + Line = i18n( "Black has poor piece coordination" ); + break; + case 104: + Line = i18n( "White has good piece coordination" ); + break; + case 105: + Line = i18n( "Black has good piece coordination" ); + break; + case 106: + Line = i18n( "White has played the opening very poorly" ); + break; + case 107: + Line = i18n( "Black has played the opening very poorly" ); + break; + case 108: + Line = i18n( "White has played the opening poorly" ); + break; + case 109: + Line = i18n( "Black has played the opening poorly" ); + break; + case 110: + Line = i18n( "White has played the opening well" ); + break; + case 111: + Line = i18n( "Black has played the opening well" ); + break; + case 112: + Line = i18n( "White has played the opening very well" ); + break; + case 113: + Line = i18n( "Black has played the opening very well" ); + break; + case 114: + Line = i18n( "White has played the middlegame very poorly" ); + break; + case 115: + Line = i18n( "Black has played the middlegame very poorly" ); + break; + case 116: + Line = i18n( "White has played the middlegame poorly" ); + break; + case 117: + Line = i18n( "Black has played the middlegame poorly" ); + break; + case 118: + Line = i18n( "White has played the middlegame well" ); + break; + case 119: + Line = i18n( "Black has played the middlegame well" ); + break; + case 120: + Line = i18n( "White has played the middlegame very well" ); + break; + case 121: + Line = i18n( "Black has played the middlegame very well" ); + break; + case 122: + Line = i18n( "White has played the ending very poorly" ); + break; + case 123: + Line = i18n( "Black has played the ending very poorly" ); + break; + case 124: + Line = i18n( "White has played the ending poorly" ); + break; + case 125: + Line = i18n( "Black has played the ending poorly" ); + break; + case 126: + Line = i18n( "White has played the ending well" ); + break; + case 127: + Line = i18n( "Black has played the ending well" ); + break; + case 128: + Line = i18n( "White has played the ending very well" ); + break; + case 129: + Line = i18n( "Black has played the ending very well" ); + break; + case 130: + Line = i18n( "White has slight counterplay" ); + break; + case 131: + Line = i18n( "Black has slight counterplay" ); + break; + case 132: + Line = i18n( "White has moderate counterplay" ); + break; + case 133: + Line = i18n( "Black has moderate counterplay" ); + break; + case 134: + Line = i18n( "White has decisive counterplay" ); + break; + case 135: + Line = i18n( "Black has decisive counterplay" ); + break; + case 136: + Line = i18n( "White has moderate time control pressure" ); + break; + case 137: + Line = i18n( "Black has moderate time control pressure" ); + break; + case 138: + Line = i18n( "White has severe time control pressure" ); + break; + case 139: + Line = i18n( "Black has severe time control pressure" ); + case 140: + Line = i18n( "With the idea..." ); + break; + case 141: + Line = i18n( "Aimed against..." ); + break; + case 142: + Line = i18n( "Better Move" ); + break; + case 143: + Line = i18n( "Worse Move" ); + break; + case 144: + Line = i18n( "Equivalent move" ); + break; + case 145: + Line = i18n( "Editor's Remark" ); + break; + case 146: + Line = i18n( "Novelty" ); + break; + case 147: + Line = i18n( "Weak point" ); + break; + case 148: + Line = i18n( "Endgame" ); + break; + case 149: + Line = i18n( "Line" ); + break; + case 150: + Line = i18n( "Diagonal" ); + break; + case 151: + Line = i18n( "White has a pair of Bishops" ); + break; + case 152: + Line = i18n( "Black has a pair of Bishops" ); + break; + case 153: + Line = i18n( "Bishops of opposite color" ); + break; + case 154: + Line = i18n( "Bishops of same color" ); + break; + case 190: + Line = i18n( "Etc." ); + break; + case 191: + Line = i18n( "Doubled pawns" ); + break; + case 192: + Line = i18n( "Isolated pawn" ); + break; + case 193: + Line = i18n( "Connected pawns" ); + break; + case 194: + Line = i18n( "Hanging pawns" ); + break; + case 195: + Line = i18n( "Backwards pawn" ); + break; + default: + Line = ""; + break; + } + return Line; +} + diff --git a/knights/pgn.desktop b/knights/pgn.desktop new file mode 100644 index 0000000..5ccbce1 --- /dev/null +++ b/knights/pgn.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=MimeType +MimeType=application/x-chess-pgn +Icon=pgn.png +Comment=Portable Game Notation +X-KDE-AutoEmbed=false +Patterns=*.pgn *.PGN +Name=Chess Match + + + diff --git a/knights/pgn.h b/knights/pgn.h new file mode 100644 index 0000000..eeff9d8 --- /dev/null +++ b/knights/pgn.h @@ -0,0 +1,153 @@ +/*************************************************************************** + pgn.h - description + ------------------- + begin : Mon Jul 30 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef PGN_H +#define PGN_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "definitions.h" +#include "resource.h" +#include "knightsmap.h" +#include "match_param.h" + +/** + *@author Troy Corbin Jr. + */ + +typedef struct Annotation +{ + int RAV; + QString text; +}; + +typedef QValueList MoveList; +typedef KnightsMap Annotations; + +class tab_pgnView; + +class pgn : public QObject +{ + Q_OBJECT + public: + /* Standard PGN Tags */ + QString TAG_Event; + QString TAG_Site; + QString TAG_Date; + QString TAG_Round; + QString TAG_White; + QString TAG_Black; + QString TAG_Result; + QString TAG_EventDate; + QString TAG_EventSponsor; + QString TAG_Section; + QString TAG_Stage; + QString TAG_Board; + QString TAG_WhiteTitle; + QString TAG_WhiteElo; + QString TAG_WhiteUSCF; + QString TAG_WhiteNA; + QString TAG_WhiteType; + QString TAG_BlackTitle; + QString TAG_BlackElo; + QString TAG_BlackUSCF; + QString TAG_BlackNA; + QString TAG_BlackType; + QString TAG_Opening; + QString TAG_Variation; + QString TAG_SubVariation; + QString TAG_ECO; + QString TAG_NIC; + QString TAG_Time; + QString TAG_UTCTime; + QString TAG_UTCDate; + QString TAG_TimeControl; + QString TAG_SetUp; + QString TAG_FEN; + QString TAG_Termination; + QString TAG_Annotator; + QString TAG_Mode; + QString TAG_PlyCount; + + int File_Position; // Used to scan PGN file + QStringList Move_Data; + + /* The match_param */ + match_param *Param; + + /* These are used in unfinished save games */ + int whiteTime; + int blackTime; + TCPList whiteTCP; + TCPList blackTCP; + + QString CurrentURL; + MoveList Moves; + Annotations RAV; + Annotations annotations; + QStringList Positions; + unsigned int currentIndex; + + pgn( resource *Rsrc=0, match_param *param=NULL ); + ~pgn(); + void clear( void ); + void init( void ); + int scan( void ); + bool load( const int pos=0 ); + bool save( QString URL ); + bool open( const QString& URL ); + void print( void ); + QStringList* notation( const int format=1 ); + void close( void ); + static QString getNAG( int num ); + QString caption( void ); + + signals: + void processMove( ChessMove ); + void processSpecial( void ); + + public slots: + bool loadNext( void ); + void parseMatchParam( void ); + void childViewDestroyed( void ); + + private: + resource *Resource; + tab_pgnView *pgnView; + QString tempFile; + QString currentLine; + QFile File; + QTextStream Input; + + QChar getch( void ); + QString getword( void ); + void clearTags( void ); + void parseTag( void ); + void parseAnnotation( const int fromRAVnum=0 ); + void parseRAV( void ); + void parseKnightsData( void ); +}; + +#endif diff --git a/knights/proto_base.cpp b/knights/proto_base.cpp new file mode 100644 index 0000000..c7e64fc --- /dev/null +++ b/knights/proto_base.cpp @@ -0,0 +1,34 @@ +/*************************************************************************** + proto_base.cpp - description + ------------------- + begin : Sat Oct 26 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "proto_base.moc" + +proto_base::proto_base( const int ID ) : QObject() +{ + myID = ID; +} +proto_base::~proto_base() +{ +} +void proto_base::setID( const int ID ) +{ + myID = ID; +} +int proto_base::getID() +{ + return myID; +} diff --git a/knights/proto_base.h b/knights/proto_base.h new file mode 100644 index 0000000..43113c6 --- /dev/null +++ b/knights/proto_base.h @@ -0,0 +1,54 @@ +/*************************************************************************** + proto_base.h - description + ------------------- + begin : Sat Oct 26 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef PROTO_BASE_H +#define PROTO_BASE_H + +#include +#include +#include +#include "command.h" +#include "definitions.h" + +/** + *@author Troy Corbin Jr. + */ +typedef QValueList CommandList; + +class proto_base : public QObject +{ + Q_OBJECT + public: + proto_base( const int ID ); + virtual ~proto_base(); + int getID( void ); + void setID( const int ID ); + + public slots: + virtual void parse( const Command& ) = 0; + virtual void parse( const QString& ) = 0; + + signals: + void output( const QString& ); + void output( const Command& ); + + protected: + int myID; + ChessMove myMove; +}; + +#endif diff --git a/knights/proto_uci.cpp b/knights/proto_uci.cpp new file mode 100644 index 0000000..d277326 --- /dev/null +++ b/knights/proto_uci.cpp @@ -0,0 +1,218 @@ +/*************************************************************************** + proto_uci.cpp - description + ------------------- + begin : Sat Oct 26 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include + +#include "proto_uci.moc" +#include "definitions.h" + +proto_uci::proto_uci( const int ID ) : proto_base( ID ) +{ + hintMode = FALSE; + initMode = FALSE; + JustMoved = FALSE; + myArmy = BLACK; + Turn = WHITE; + CMDList = new CommandList; +} +proto_uci::~proto_uci() +{ + delete CMDList; +} +/////////////////////////////////////// +// +// proto_uci::parse( const Command &command ) +// +/////////////////////////////////////// +void proto_uci::parse( const Command &command ) +{ + Command cmd = command; + + if( initMode ) + { + CMDList->append( command ); + return; + } + + switch( cmd.getCommand() ) + { + /* Command: Init */ + case CMD_Init: + emit output( "uci" ); + initMode = TRUE; + break; + + /* Command: New Game */ + case CMD_NewGame: + emit output( "isready" ); + break; + + /* Command: Exit */ + case CMD_Exit: + emit output( "quit" ); + break; + + /* Command: Move */ + case CMD_Move: + if( JustMoved ) + { + JustMoved = FALSE; + break; + } + if( FEN.isEmpty() ) + { + emit output( QString("position startpos moves %1").arg( cmd.getData() ) ); + } + else + { + emit output( QString("position fen %1 moves %2").arg( FEN ).arg( cmd.getData() ) ); + } + emit output( QString("go wtime %1 btime %2 depth %3").arg( cmd.getWhiteTime() ).arg( cmd.getBlackTime() ).arg( difficulty ) ); + break; + + /* Command: Set Difficulty */ + case CMD_Set_Difficulty: + difficulty = cmd.getData(); + break; + + /* Command: Set Board */ + case CMD_Set_Board: + FEN = cmd.getData(); + break; + + /* Command: Move Now */ + case CMD_MoveNow: + emit output( "stop" ); + break; + + /* Command: UCI Hint */ + case CMD_UCI_Hint: + hintMode = TRUE; + if( FEN.isEmpty() ) + { + emit output( QString("position startpos moves %1").arg( cmd.getData() ) ); + } + else + { + emit output( QString("position fen %1 moves %2").arg( FEN ).arg( cmd.getData() ) ); + } + emit output( QString("go wtime %1 btime %2 depth %3").arg( cmd.getWhiteTime() ).arg( cmd.getBlackTime() ).arg( difficulty ) ); + break; + + /* Command: Play White */ + case CMD_Play_White: + myArmy = WHITE; + break; + + /* Command: Play Black */ + case CMD_Play_Black: + myArmy = BLACK; + break; + + /* Command: Set Name */ + case CMD_Set_Name: + engineName = cmd.getData(); + break; + } +} +/////////////////////////////////////// +// +// proto_uci::parse( const QString &string ) +// +/////////////////////////////////////// +void proto_uci::parse( const QString &string ) +{ + QString strIn = string; + QStringList strList( QStringList::split( ' ', strIn ) ); + + /* Bestmove */ + if( strList[0] == "bestmove" ) + { + if( strList.count() < 2 ) + { + kdWarning() << "proto_uci::parse: Incomplete Bestmove command" << endl; + return; + } + Command::clearMove( &myMove ); + strcpy( myMove.CAN, strList[1].latin1() ); + if( hintMode ) + { + /* The Engine Gives a Hint */ + hintMode = FALSE; +// emit output( Command( myID, CMD_Hint, i18n( "%1 suggests this move:\n%2" ).arg( engineName ).arg( strList[1] ) ) ); + emit output( Command( myID, CMD_Hint, QString( "%1 suggests this move:\n%2" ).arg( engineName ).arg( strList[1] ) ) ); + } + else + { + /* The Engine Moves */ + JustMoved = TRUE; + emit output( Command( myID, CMD_Move, 0, 0, myMove ) ); + } + } + + /* UCIOK */ + if( strList[0] == "uciok" ) + { + initMode = FALSE; + releaseBuffer(); + } + + /* READYOK */ + if( strList[0] == "readyok" ) + { + initMode = FALSE; + releaseBuffer(); + } + + /* ID */ + if( strList[0] == "id" ) + { + if( strList[1] == "name" ) + { + engineName = strIn.right( strIn.length() - 8 ); + } + if( strList[1] == "author" ) + { + engineAuthor = strIn.right( strIn.length() - 10 ); + } + } + + /* COPYPROTECTION */ + if( strList[0] == "copyprotection" ) + { + if( strList[1] == "error" ) + { +// emit output( Command( myID, CMD_Tell_User_Error, i18n( "%1 did not pass it's copy protection check." ).arg( engineName ) ) ); + emit output( Command( myID, CMD_Tell_User_Error, QString( "%1 did not pass it's copy protection check." ).arg( engineName ) ) ); + } + } +} +/////////////////////////////////////// +// +// proto_uci::releaseBuffer +// +/////////////////////////////////////// +void proto_uci::releaseBuffer( void ) +{ + CommandList::Iterator it; + for( it = CMDList->begin(); it != CMDList->end(); it++ ) + { + parse( *it ); + } + CMDList->clear(); +} diff --git a/knights/proto_uci.h b/knights/proto_uci.h new file mode 100644 index 0000000..23a27b3 --- /dev/null +++ b/knights/proto_uci.h @@ -0,0 +1,55 @@ +/*************************************************************************** + proto_uci.h - description + ------------------- + begin : Sat Oct 26 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef PROTO_UCI_H +#define PROTO_UCI_H + +#include +#include "proto_base.h" + +/** + *@author Troy Corbin Jr. + */ + +class proto_uci : public proto_base +{ + Q_OBJECT + public: + proto_uci( const int ID ); + ~proto_uci(); + + virtual void parse( const Command& ); + virtual void parse( const QString& ); + + protected slots: + void releaseBuffer( void ); + + private: + QString engineName; + QString engineAuthor; + QString difficulty; + QString FEN; + + CommandList *CMDList; + bool hintMode; + bool initMode; + bool JustMoved; + bool myArmy; + bool Turn; +}; + +#endif diff --git a/knights/proto_xboard.cpp b/knights/proto_xboard.cpp new file mode 100644 index 0000000..8b68bb0 --- /dev/null +++ b/knights/proto_xboard.cpp @@ -0,0 +1,687 @@ +/*************************************************************************** + proto_xboard.cpp - description + ------------------- + begin : Sat Oct 26 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include + +#include "proto_xboard.moc" +#include "definitions.h" + +proto_xboard::proto_xboard( const int ID ) : proto_base( ID ) +{ + FEATURE_Analyze = TRUE; + FEATURE_Colors = TRUE; + FEATURE_Draw = TRUE; + FEATURE_ICS = FALSE; + FEATURE_Name = TRUE; + FEATURE_Pause = FALSE; + FEATURE_Ping = FALSE; + FEATURE_PlayOther = FALSE; + FEATURE_Reuse = TRUE; + FEATURE_SetBoard = FALSE; + FEATURE_SAN = FALSE; + FEATURE_SIGINT = TRUE; + FEATURE_SIGTERM = TRUE; + FEATURE_Time = TRUE; + FEATURE_UserMove = FALSE; + FEATURE_Variants = 0; + FEATURE_Level = 1; + FEATURE_BookEngine = 0; + + CMDList = new CommandList; + InitTimer = new QTimer( this ); + connect( InitTimer, SIGNAL( timeout() ), this, SLOT( releaseBuffer() ) ); + + Check = TRUE; + Team = FALSE; + JustMoved = FALSE; + AcceptIllegal = FALSE; + DelayedGo = FALSE; + Forced = TRUE; + Turn = WHITE; +} +proto_xboard::~proto_xboard() +{ + delete InitTimer; + delete CMDList; +} +/////////////////////////////////////// +// +// proto_xboard::parse( const Command &command ) +// +/////////////////////////////////////// +void proto_xboard::parse( const Command &command ) +{ + QString temp; + Command cmd = command; + + if( InitTimer->isActive() ) + { + /* + Store Command for later use.. + we're still waiting for the engine to finish + */ + CMDList->append( command ); + return; + } + + switch( cmd.getCommand() ) + { + /* Command: Init */ + case CMD_Init: + emit output( "xboard\nprotover 3" ); + InitTimer->start( 2000, TRUE ); + break; + + /* Command: New Game */ + case CMD_NewGame: + emit output( "new\nrandom" ); + break; + + /* Command: Exit */ + case CMD_Exit: + emit output( "quit" ); + if( FEATURE_SIGTERM ) + emit output( Command( myID, CMD_Send_SIGTERM ) ); + break; + + /* Command: Move Now */ + case CMD_MoveNow: + emit output( "?" ); + break; + + /* Command: Move */ + case CMD_Move: + if( JustMoved ) + { + JustMoved = FALSE; + break; + } + AcceptIllegal = TRUE; + myMove = cmd.getMove(); + /* Send Time */ + if( FEATURE_Time ) + { + if( Army == WHITE ) + { + emit output( QString( "time %1" ).arg( cmd.getWhiteTime() ) ); + emit output( QString( "otim %1" ).arg( cmd.getBlackTime() ) ); + } + else + { + emit output( QString( "time %1" ).arg( cmd.getBlackTime() ) ); + emit output( QString( "otim %1" ).arg( cmd.getWhiteTime() ) ); + } + } + if( FEATURE_UserMove ) + temp = "usermove "; + if( FEATURE_SAN ) + temp += myMove.SAN; + else + temp += myMove.CAN; + if( DelayedGo ) + { + DelayedGo = FALSE; + temp += "\ngo"; + Forced = FALSE; + } + emit output( temp ); + break; + + /* Command: Pause */ + case CMD_Pause: + if( FEATURE_Pause ) + emit output( "pause" ); + else + { + emit output( "force" ); + Forced = TRUE; + } + break; + + /* Command: Resume */ + case CMD_Resume: + if( FEATURE_Pause ) + emit output( "resume" ); + else + { + if( Turn == Army ) + { + emit output( "go" ); + Forced = FALSE; + } + else + DelayedGo = TRUE; + } + break; + + /* Command: Play White */ + case CMD_Play_White: + Army = WHITE; + if( Turn == BLACK ) + { + if( FEATURE_PlayOther ) + { + emit output( "playother" ); + } + else if( FEATURE_Colors ) + { + emit output( "black" ); + } + else + { + emit output( "force" ); + Forced = TRUE; + DelayedGo = TRUE; + } + break; + } + else + { + temp = "force"; + if( FEATURE_Colors ) + temp += "\nwhite"; + temp += "\ngo"; + emit output( temp ); + break; + } + break; + + /* Command: Play Black */ + case CMD_Play_Black: + Army = BLACK; + if( Turn == WHITE ) + { + if( FEATURE_PlayOther ) + { + emit output( "playother" ); + } + else if( FEATURE_Colors ) + { + emit output( "white" ); + } + else + { + emit output( "force" ); + Forced = TRUE; + DelayedGo = TRUE; + } + break; + } + else + { + temp = "force"; + if( FEATURE_Colors ) + temp += "\nblack"; + temp += "\ngo"; + emit output( temp ); + break; + } + break; + + /* Command: Result White */ + case CMD_Result_White: + emit output( "result 1-0 {White Mates}" ); + AcceptIllegal = FALSE; +// if( Army == WHITE ) +// (*IT).Wins++; +// else +// (*IT).Losses++; + break; + + /* Command: Result Black */ + case CMD_Result_Black: + emit output( "result 0-1 {Black Mates}" ); + AcceptIllegal = FALSE; +// if( Army == BLACK ) +// (*IT).Wins++; +// else +// (*IT).Losses++; + break; + + /* Command: Result Draw */ + case CMD_Result_Draw: + emit output( "result 1/2-1/2 {Draw Game}" ); + AcceptIllegal = FALSE; +// (*IT).Draws++; + break; + + /* Command: Your Time */ + case CMD_Your_Time: + if( FEATURE_Time ) + { + if( Army == WHITE ) + emit output( QString( "time %1" ).arg( cmd.getWhiteTime() ) ); + else + emit output( QString( "time %1" ).arg( cmd.getBlackTime() ) ); + } + break; + + /* Command: Enemy Time */ + case CMD_Enemy_Time: + if( FEATURE_Time ) + { + if( Army == WHITE ) + emit output( QString( "otim %1" ).arg( cmd.getBlackTime() ) ); + else + emit output( QString( "otim %1" ).arg( cmd.getWhiteTime() ) ); + } + break; + + /* Command: Offer Draw */ + case CMD_Offer_Draw: + if( FEATURE_Draw ) + emit output( "draw" ); + break; + + /* Command: Book Mode */ + case CMD_Book_Mode: + if( FEATURE_BookEngine != 0 ) + emit output( "bookengine" ); + break; + + /* Command: Check Book */ + case CMD_Check_Book: + emit output( "go" ); + Forced = FALSE; + break; + + /* Command: Ponder */ + case CMD_Ponder: + emit output( "hard" ); + break; + + /* Command: No Pondering */ + case CMD_No_Pondering: + emit output( "hard\neasy" ); + break; + + /* Command: Retract Move */ + case CMD_Retract_Move: + emit output( "remove" ); + break; + + /* Command: Hint */ + case CMD_Hint: + emit output( "hint" ); + break; + + /* Command: Listen */ + case CMD_Listen: + emit output( "force" ); + Forced = TRUE; + DelayedGo = FALSE; + break; + + /* Command: Play */ + case CMD_Play: + if( Army == Turn ) + { + emit output( "go" ); + Forced = FALSE; + } + else + DelayedGo = TRUE; + break; + + /* Command: White Resign */ + case CMD_White_Resign: + parse( Command( 0, CMD_Result_White ) ); + break; + + /* Command: Black Resign */ + case CMD_Black_Resign: + parse( Command( 0, CMD_Result_Black ) ); + break; + + /* Command: Set Board */ + case CMD_Set_Board: + if( FEATURE_SetBoard == TRUE ) + { + emit output( QString( "setboard %1" ).arg( cmd.getData() ) ); + } + else + { + // Convert FEN to edit commands here and feed them to engine + } + break; + + /* Command: Set Difficulty */ + case CMD_Set_Difficulty: + emit output( "sd " + cmd.getData() ); + // emit output( "st " + QString::number( cmd.getData().toInt() >> 1 ) ); + break; + + /* Command: Set Name */ + case CMD_Set_Name: + FEATURE_MyName = cmd.getData(); + break; + default: + break; + } +} +/////////////////////////////////////// +// +// proto_xboard::parse( const QString &string ) +// +/////////////////////////////////////// +void proto_xboard::parse( const QString &string ) +{ + QString strIn = string; + QStringList strList( QStringList::split( ' ', strIn ) ); + + if( ( FEATURE_SIGINT ) && ( !Forced ) ) + emit output( Command( myID, CMD_Send_SIGINT ) ); + + /* Illegal */ + if( strList[0].contains( "illegal", FALSE ) ) + { + if( AcceptIllegal ) + { + if( strIn.contains("(no matching move)board") ) + return; + if( strIn.contains("(no matching move)protover") ) + return; + if( strIn.contains("(no matching move)sd") ) + return; + AcceptIllegal = FALSE; + emit output( Command( myID, CMD_Illegal ) ); + } + return; + } + + /* A Move */ + if( strList[0] == "move" ) + { + if( strList.count() < 2 ) + { + kdWarning() << "proto_xboard::parse: Incomplete Move command" << endl; + return; + } + Command::clearMove( &myMove ); + strcpy( myMove.SAN, strList[1].latin1() ); + strcpy( myMove.CAN, strList[1].latin1() ); + if( Team ) + { + emit output( "force" ); + Forced = TRUE; + } + JustMoved = TRUE; + emit output( Command( myID, CMD_Move, 0, 0, myMove ) ); + return; + } + + /* A Move ( Old Variation ) */ + if( ( strList[0].contains( QRegExp("\\d+\\.") ) ) && ( strList[1] == "..." ) ) + { + Command::clearMove( &myMove ); + strcpy( myMove.SAN, strList[2].latin1() ); + strcpy( myMove.CAN, strList[2].latin1() ); + if( Team ) + { + emit output( "force" ); + Forced = TRUE; + } + JustMoved = TRUE; + emit output( Command( myID, CMD_Move, 0, 0, myMove ) ); + return; + } + + /* Hint */ + if( strList[0] == "Hint:" ) + { + emit output( Command( myID, CMD_Hint, i18n( "%1 suggests this move:\n%2" ).arg( FEATURE_MyName ).arg( strList[1] ) ) ); + return; + } + + /* Offer Draw */ + if( ( strList[0] == "offer" ) && ( strList[1] == "draw" ) ) + { + emit output( Command( myID, CMD_Offer_Draw ) ); + } + + /* Out of Book */ + if( strList[0] == "outofbook" ) + { + emit output( "force" ); + Forced = TRUE; + emit output( Command( myID, CMD_Out_Of_Book ) ); + return; + } + + /* Tell User */ + if( strList[0] == "telluser" ) + { + emit output( Command( myID, CMD_Tell_User, i18n( "%1 tells you:\n%2" ).arg( FEATURE_MyName ).arg( strIn.right( strIn.length() - 9 ) ) ) ); + return; + } + + /* Tell User Error */ + if( strList[0] == "tellusererror" ) + { + emit output( Command( myID, CMD_Tell_User_Error, i18n( "%1 tells you:\n%2" ).arg( FEATURE_MyName ).arg( strIn.right( strIn.length() - 14 ) ) ) ); + return; + } + + /* Error */ + if( strList[0] == "Error" ) + { + emit output( Command( myID, CMD_Tell_User_Error, i18n( "%1 tells you:\n%2" ).arg( FEATURE_MyName ).arg( strIn.right( strIn.length() ) ) ) ); + return; + } + + /* Tell Opponent */ + if( strList[0] == "tellopponent" ) + { + emit output( Command( myID, CMD_Tell_Opponent, QString( "%1" ).arg( strIn.right( strIn.length() - 13 ) ) ) ); + return; + } + + /* Tell Others */ + if( strList[0] == "tellothers" ) + { + emit output( Command( myID, CMD_Tell_Others, QString( "%1" ).arg( strIn.right( strIn.length() - 11 ) ) ) ); + return; + } + + /* Tell All */ + if( strList[0] == "tellall" ) + { + emit output( Command( myID, CMD_Tell_All, QString( "%1" ).arg( strIn.right( strIn.length() - 8 ) ) ) ); + return; + } + + /* Tell ICS */ + if( strList[0] == "tellics" ) + { + emit output( Command( myID, CMD_Tell_ICS, QString( "%1" ).arg( strIn.right( strIn.length() - 8 ) ) ) ); + return; + } + + /* Tell ICS No Alias */ + if( strList[0] == "tellicsnoalias" ) + { + emit output( Command( myID, CMD_Tell_ICS, QString( "%1" ).arg( strIn.right( strIn.length() - 15 ) ) ) ); + return; + } + + /* Resign */ + if( strIn.contains( "resign", FALSE ) ) + { + if( Army == WHITE ) + emit output( Command( myID, CMD_White_Resign ) ); + else + emit output( Command( myID, CMD_Black_Resign ) ); + return; + } + + /* + Parse Features + */ + if( !InitTimer->isActive() ) + return; + for( unsigned int loop = 0; loop < strList.count(); loop++ ) + { + if( strList[loop] == "done=1" ) + { + InitTimer->stop(); + releaseBuffer(); + continue; + } + /* This buys you 10 minutes */ + if( strList[loop] == "done=0" ) + { + InitTimer->changeInterval( 600000 ); + continue; + } + if( strList[loop] == "feature" ) + { + continue; + } + if( strList[loop].left(3) == "ics" ) + { + FEATURE_ICS = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted ics" ); + continue; + } + if( strList[loop].left(3) == "san" ) + { + FEATURE_SAN = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted san" ); + continue; + } + if( strList[loop].left(4) == "draw" ) + { + FEATURE_Draw = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted draw" ); + continue; + } + if( strList[loop].left(4) == "name" ) + { + FEATURE_Name = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted name" ); + continue; + } + if( strList[loop].left(4) == "ping" ) + { + FEATURE_Ping = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted ping" ); + continue; + } + if( strList[loop].left(4) == "time" ) + { + FEATURE_Time = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted time" ); + continue; + } + if( strList[loop].left(5) == "level" ) + { + FEATURE_Level = QString( strList[loop].right( strList[loop].length() - 6 ) ).toInt(); + emit output( "accepted level" ); + continue; + } + if( strList[loop].left(5) == "pause" ) + { + FEATURE_Pause = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted pause" ); + continue; + } + if( strList[loop].left(5) == "reuse" ) + { + FEATURE_Reuse = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted reuse" ); + continue; + } + if( strList[loop].left(6) == "colors" ) + { + FEATURE_Colors = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted colors" ); + continue; + } + if( strList[loop].left(6) == "myname" ) + { + FEATURE_MyName = QString( strList[loop].right( strList[loop].length() - 8 ) ); + emit output( "accepted myname" ); + continue; + } + if( strList[loop].left(6) == "sigint" ) + { + FEATURE_SIGINT = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted sigint" ); + continue; + } + if( strList[loop].left(7) == "analyze" ) + { + FEATURE_Analyze = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted analyze" ); + continue; + } + if( strList[loop].left(7) == "sigterm" ) + { + FEATURE_SIGTERM = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted sigterm" ); + continue; + } + if( strList[loop].left(8) == "setboard" ) + { + FEATURE_SetBoard = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted setboard" ); + continue; + } + if( strList[loop].left(8) == "usermove" ) + { + FEATURE_UserMove = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted usermove" ); + continue; + } + if( strList[loop].left(8) == "variants" ) + { +// FIFO_Tmp = strList[loop].right( strList[loop].length() - 10 ); + // This must be finished + emit output( "accepted variants" ); + continue; + } + if( strList[loop].left(9) == "playother" ) + { + FEATURE_PlayOther = QString( strList[loop].right(1) ).toInt(); + emit output( "accepted playother" ); + continue; + } + if( strList[loop].left(10) == "bookengine" ) + { + FEATURE_BookEngine = QString( strList[loop].right( strList[loop].length() - 11 ) ).toInt(); + emit output( "accepted bookengine" ); + continue; + } + } +} +/////////////////////////////////////// +// +// proto_xboard::releaseBuffer +// +/////////////////////////////////////// +void proto_xboard::releaseBuffer( void ) +{ + CommandList::Iterator it; + for( it = CMDList->begin(); it != CMDList->end(); it++ ) + { + parse( *it ); + } + CMDList->clear(); +} diff --git a/knights/proto_xboard.h b/knights/proto_xboard.h new file mode 100644 index 0000000..0b07109 --- /dev/null +++ b/knights/proto_xboard.h @@ -0,0 +1,78 @@ +/*************************************************************************** + proto_xboard.h - description + ------------------- + begin : Sat Oct 26 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef PROTO_XBOARD_H +#define PROTO_XBOARD_H + +#include "proto_base.h" + +/** + *@author Troy Corbin Jr. + */ + +class QTimer; + +class proto_xboard : public proto_base +{ + Q_OBJECT + public: + proto_xboard( const int ID ); + ~proto_xboard(); + + virtual void parse( const Command& ); + virtual void parse( const QString& ); + + protected slots: + void releaseBuffer( void ); + + private: + + /* XBoard protover 2 */ + bool FEATURE_Analyze; + bool FEATURE_Colors; + bool FEATURE_Draw; + bool FEATURE_ICS; + bool FEATURE_Name; + bool FEATURE_Pause; + bool FEATURE_Ping; + bool FEATURE_PlayOther; + bool FEATURE_Reuse; + bool FEATURE_SetBoard; + bool FEATURE_SAN; + bool FEATURE_SIGINT; + bool FEATURE_SIGTERM; + bool FEATURE_Time; + bool FEATURE_UserMove; + int FEATURE_Variants; + QString FEATURE_MyName; + /* XBoard protover 3 */ + int FEATURE_Level; + int FEATURE_BookEngine; + + bool Check; + bool Turn; + bool Team; + bool Army; + bool JustMoved; + bool AcceptIllegal; + bool DelayedGo; + bool Forced; + QTimer *InitTimer; + CommandList *CMDList; +}; + +#endif diff --git a/knights/resource.cpp b/knights/resource.cpp new file mode 100644 index 0000000..ba172b9 --- /dev/null +++ b/knights/resource.cpp @@ -0,0 +1,1048 @@ +/*************************************************************************** + resource.cpp - description + ------------------- + begin : Tue Jul 17 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +/* KDE */ +#include +#include +#include +#include +#include +#include +#include +/* Qt */ +#include +#include +/* Local */ +#include "resource.h" +#include "audio.h" +#include "knightspixcache.h" +#include "tabmanager.h" +#include "accel.h" +/* C & C++ */ +#include +#include +#include +#include +#include + +#define CFG kapp->config() +/////////////////////////////////////// +// +// resource::resource +// +/////////////////////////////////////// +resource::resource(KCmdLineArgs *args) +{ + GlobalDataDir = ""; + Widget_Height = 20; // prevents max_size error for thinbuttons on init + Icons = new KIconLoader( QString( "knights" ) ); + Audio = new audio(); + + /* Define ConsoleStyle, our RichText */ + ConsoleStyle = new QStyleSheet( 0, "ConsoleStyle" ); + SSI_Default = new QStyleSheetItem( ConsoleStyle, "K_STD" ); + SSI_PrivateTell = new QStyleSheetItem( ConsoleStyle, "K_PVT" ); + SSI_ChannelTell = new QStyleSheetItem( ConsoleStyle, "K_CH" ); + SSI_Shout = new QStyleSheetItem( ConsoleStyle, "K_SHT" ); + SSI_Whisper = new QStyleSheetItem( ConsoleStyle, "K_WSP" ); + SSI_Notification = new QStyleSheetItem( ConsoleStyle, "K_NOT" ); + QStyleSheet::setDefaultSheet( ConsoleStyle ); + + /* Define GlobalDataDir... This is very important! */ + GlobalDataDir = args->getOption( "d" ); + if( GlobalDataDir.isEmpty() ) + GlobalDataDir = KGlobal::dirs()->findResourceDir("data", "knights/splash.png") + "knights/"; + if( GlobalDataDir.isEmpty() ) + { + kdWarning() << "resource::resource: Can not read GlobalDataDir from environment." << endl; + GlobalDataDir = "/usr/local/kde/"; + } + if( GlobalDataDir.right(1) != "/" ) GlobalDataDir += '/'; + + /* Allocate Accel */ + myAccel = new Accel( qApp->mainWidget() ); + + /* Allocate TabManager */ + tabManager = new TabManager( this ); + + ConfigRead(); + pixCache = new KnightsPixCache(); + pixCache->setCacheLimit( 2048 ); // 2meg +} +/////////////////////////////////////// +// +// resource::~resource +// +/////////////////////////////////////// +resource::~resource() +{ + ConfigWrite(); + delete Icons; + delete pixCache; + delete Audio; + delete tabManager; + delete myAccel; + + /* Remove temp files that we missed + QStringList temps = KGlobal::dirs()->findAllResources("tmp","knights*"); + for( int a=0; a < temps.count(); a++) + { + KIO::NetAccess::del( "file://" + temps[a] ); + } */ +} +/////////////////////////////////////// +// +// resource::ConfigRead +// +/////////////////////////////////////// +void resource::ConfigRead( void ) +{ + struct passwd *passwd; + QString sysName; + QString buffer; + QDesktopWidget *desktop = QApplication::desktop(); + + /* Get Initial Board Size In Case This Install Is New */ + int initSize = ( desktop->height() >> 3 ) - 32; + if( initSize > IMAGE_MAX ) + initSize = IMAGE_MAX; + if( initSize < IMAGE_MIN ) + initSize = IMAGE_MIN; + + /* Get user name from environment in case it's needed */ + passwd = getpwuid( getuid() ); + sysName = passwd->pw_gecos; + if( sysName.isEmpty() ) + sysName = QStringList::split( ",", QString(passwd->pw_name) ).first(); + + /* Cursors */ + CURSOR_Standard = KCursor::arrowCursor(); + CURSOR_Thinking = KCursor::waitCursor(); + CURSOR_Text = KCursor::ibeamCursor(); + + /* Themes */ + readThemeDir(); + CFG->setGroup( "Themes" ); + CurrentBoard = CFG->readEntry( "CurrentBoard", "KBDefault.tar.gz" ); + CurrentChessmen = CFG->readEntry( "CurrentChessmen", "KCDefault.tar.gz" ); + OPTION_3DBoard = CFG->readBoolEntry( "Use3DBoard", FALSE ); + ThemeSize = CFG->readNumEntry( "Size", initSize ); + if( ThemeSize > ( initSize + 16 ) ) + ThemeSize = initSize; + + /* General */ + ReadEngines(); + ReadServers(); + ReadMatchParam(); + ReadColors(); + ReadFonts(); + buildStyle(); + CFG->setGroup( "General" ); + Local_Player = CFG->readEntry( "UserName", sysName ); + Config_Version = CFG->readNumEntry( "ConfigVersion", 0 ); + OPTION_On_Init = CFG->readNumEntry( "OnInit", MENU_VS_PC ); + OPTION_Auto_Queen = CFG->readBoolEntry( "AlwaysQueen", FALSE ); + OPTION_Ponder = CFG->readBoolEntry( "Ponder", TRUE ); + OPTION_Book_White = CFG->readBoolEntry( "BookWhite", FALSE ); + OPTION_Book_Black = CFG->readBoolEntry( "BookBlack", FALSE ); + OPTION_Pause_On_Minimize = CFG->readBoolEntry( "PauseOnMinimize", TRUE ); + OPTION_Reuse_PGN = CFG->readBoolEntry( "ReusePGN", FALSE ); + PGN_Filename = CFG->readEntry( "PGNFilename", QString::null ); + SCID_Image_Path = CFG->readEntry( "SCIDImages", QString::null ); + OPTION_Auto_Close_Last_ICS = CFG->readBoolEntry( "AutoCloseLastICS", TRUE ); + OPTION_Show_Extended_PGN = CFG->readEntry( "ShowExtendedPGN", FALSE ); + OPTION_Auto_Call_Flag = CFG->readBoolEntry( "AutoCallFlag", TRUE ); + Email_Command_Line = CFG->readEntry( "EmailCommandLine", QString("kmail -s %s --attach %m %a") ); + Accepted_License = CFG->readBoolEntry( "Alg2p", FALSE ); + + /* Display */ + OPTION_Show_Splash = CFG->readBoolEntry( "ShowSplash", TRUE ); + OPTION_Auto_Preview = CFG->readBoolEntry( "AutoPreview", FALSE ); + OPTION_Show_Last_Move = CFG->readBoolEntry( "ShowLastMove", TRUE ); + OPTION_Animate_Moves = CFG->readBoolEntry( "AnimateMoves", FALSE ); + OPTION_Show_Coord = CFG->readBoolEntry( "ShowCoord", FALSE ); + OPTION_Board_Orientation = CFG->readBoolEntry( "BoardOrientation", 0 ); + + /* ICS */ + CFG->setGroup( "ICS" ); + OPTION_Premove = CFG->readBoolEntry( "Premove", TRUE ); + OPTION_Kibitz = CFG->readBoolEntry( "Kibitz", TRUE ); + OPTION_Private = CFG->readBoolEntry( "Private", FALSE ); + OPTION_Shout = CFG->readBoolEntry( "Shout", TRUE ); + OPTION_Tell = CFG->readBoolEntry( "Tell", TRUE ); + OPTION_Seek = CFG->readBoolEntry( "Seek", TRUE ); + OPTION_Profanity = CFG->readNumEntry( "Profanity", 1 ); + Seek_Timer = CFG->readNumEntry( "SeekTimer", 70 ); + + /* Audio */ + CFG->setGroup( "Audio" ); + OPTION_Audio = CFG->readBoolEntry( "useAudio", TRUE ); + CurrentAudio = CFG->readEntry( "CurrentAudio", "KSDefault.tar.gz" ); + OPTION_Audio_Current_Only = CFG->readBoolEntry( "AudioCurrentOnly", FALSE ); + Audio_Volume = CFG->readNumEntry( "AudioVolume", 0 ); + Audio->enabled = OPTION_Audio; + Audio->volume = Audio_Volume; + + /* Notification Prompts */ + CFG->setGroup( "Notification Messages" ); + PromptForSaving = CFG->readEntry( "PromptForSaving", QString::null ); +} +/////////////////////////////////////// +// +// resource::ConfigWrite +// +/////////////////////////////////////// +void resource::ConfigWrite( void ) +{ + /* Themes */ + CFG->setGroup( "Themes" ); + CFG->writeEntry( "CurrentBoard", CurrentBoard ); + CFG->writeEntry( "CurrentChessmen", CurrentChessmen ); + CFG->writeEntry( "Size", ThemeSize ); + CFG->writeEntry( "Use3DBoard", OPTION_3DBoard ); + + /* General */ + WriteEngines(); + WriteServers(); + WriteMatchParam(); + WriteColors(); + WriteFonts(); + CFG->setGroup( "General" ); + CFG->writeEntry( "UserName", Local_Player ); + CFG->writeEntry( "ConfigVersion", Config_Version ); + CFG->writeEntry( "OnInit", OPTION_On_Init ); + CFG->writeEntry( "ShowSplash", OPTION_Show_Splash ); + CFG->writeEntry( "AlwaysQueen", OPTION_Auto_Queen ); + CFG->writeEntry( "AutoPreview", OPTION_Auto_Preview ); + CFG->writeEntry( "ShowLastMove", OPTION_Show_Last_Move ); + CFG->writeEntry( "AnimateMoves", OPTION_Animate_Moves ); + CFG->writeEntry( "ShowCoord", OPTION_Show_Coord ); + CFG->writeEntry( "Ponder", OPTION_Ponder ); + CFG->writeEntry( "BookWhite", OPTION_Book_White ); + CFG->writeEntry( "BookBlack", OPTION_Book_Black ); + CFG->writeEntry( "BoardOrientation", OPTION_Board_Orientation ); + CFG->writeEntry( "PauseOnMinimize", OPTION_Pause_On_Minimize ); + CFG->writeEntry( "ReusePGN", OPTION_Reuse_PGN ); + CFG->writeEntry( "PGNFilename", PGN_Filename ); + CFG->writeEntry( "AutoCloseLastICS", OPTION_Auto_Close_Last_ICS ); + CFG->writeEntry( "ShowExtendedPGN", OPTION_Show_Extended_PGN ); + CFG->writeEntry( "EmailCommandLine", Email_Command_Line ); + CFG->writeEntry( "AutoCallFlag", OPTION_Auto_Call_Flag ); + CFG->writeEntry( "SCIDImages", SCID_Image_Path ); + CFG->writeEntry( "Alg2p", Accepted_License ); + + /* ICS */ + CFG->setGroup( "ICS" ); + CFG->writeEntry( "SeekTimer", Seek_Timer ); + CFG->writeEntry( "Profanity", OPTION_Profanity ); + CFG->writeEntry( "Premove", OPTION_Premove ); + CFG->writeEntry( "Shout", OPTION_Shout ); + CFG->writeEntry( "Kibitz", OPTION_Kibitz ); + CFG->writeEntry( "Private", OPTION_Private ); + CFG->writeEntry( "Tell", OPTION_Tell ); + CFG->writeEntry( "Seek", OPTION_Seek ); + + /* Audio */ + CFG->setGroup( "Audio" ); + CFG->writeEntry( "useAudio", OPTION_Audio ); + Audio->enabled = OPTION_Audio; + CFG->writeEntry( "CurrentAudio", CurrentAudio ); + CFG->writeEntry( "AudioCurrentOnly", OPTION_Audio_Current_Only ); + CFG->writeEntry( "AudioVolume", Audio_Volume ); + Audio->volume = Audio_Volume; + + /* Notification Prompts */ + CFG->setGroup( "Notification Messages" ); + CFG->writeEntry( "PromptForSaving", PromptForSaving ); + CFG->setReadOnly( FALSE ); + if( CFG->isReadOnly() ) + kdWarning() << "resource::ConfigWrite: Configuration is READ ONLY. Can not write changes." << endl; + CFG->sync(); +} +/////////////////////////////////////// +// +// resource::ReadMatchParam +// +/////////////////////////////////////// +void resource::ReadMatchParam( void ) +{ + QString buffer; + QStringList TCPs; + QStringList::Iterator QSL_IT; + TCP tempTCP; + + TCPWhite.clear(); + TCPBlack.clear(); + CFG->setGroup( "Match Paramaters" ); + + /* Handle Time Controls */ + buffer = CFG->readEntry( "WhiteTCP", "40,900,0" ); + TCPs = QStringList::split( QString(","), buffer, FALSE ); + for( QSL_IT = TCPs.begin(); QSL_IT != TCPs.end(); ++QSL_IT ) + { + tempTCP.Moves = (*QSL_IT).toInt(); + ++QSL_IT; + tempTCP.Seconds = (*QSL_IT).toInt(); + ++QSL_IT; + tempTCP.Increment = (*QSL_IT).toInt(); + TCPWhite.append( tempTCP ); + } + TCPs.clear(); + buffer = CFG->readEntry( "BlackTCP", "40,900,0" ); + TCPs = QStringList::split( QString(","), buffer, FALSE ); + for( QSL_IT = TCPs.begin(); QSL_IT != TCPs.end(); ++QSL_IT ) + { + tempTCP.Moves = (*QSL_IT).toInt(); + ++QSL_IT; + tempTCP.Seconds = (*QSL_IT).toInt(); + ++QSL_IT; + tempTCP.Increment = (*QSL_IT).toInt(); + TCPBlack.append( tempTCP ); + } + + /* Match Rules */ + MatchRules = CFG->readNumEntry( "MatchRules", Type_Standard ); + + /* Handle Players */ + Type[WHITE] = CFG->readNumEntry( "WhiteType", PLAYERLOCAL ); + Type[WHITE_HELPER] = CFG->readNumEntry( "WhiteHelperType", PLAYERPC ); + Type[BLACK] = CFG->readNumEntry( "BlackType", PLAYERLOCAL ); + Type[BLACK_HELPER] = CFG->readNumEntry( "BlackHelperType", PLAYERPC ); + + Strength[WHITE] = CFG->readNumEntry( "WhiteStr", 18 ); + Strength[WHITE_HELPER] = CFG->readNumEntry( "WhiteHelperStr", 18 ); + Strength[BLACK] = CFG->readNumEntry( "BlackStr", 18 ); + Strength[BLACK_HELPER] = CFG->readNumEntry( "BlackHelperStr", 18 ); +} +/////////////////////////////////////// +// +// resource::WriteMatchParam +// +/////////////////////////////////////// +void resource::WriteMatchParam( void ) +{ + QString buffer; + TCPList::Iterator TCP_IT; + + CFG->setGroup( "Match Paramaters" ); + /* Handle Time Controls */ + for( TCP_IT = TCPWhite.begin(); TCP_IT != TCPWhite.end(); ++TCP_IT ) + { + buffer += QString::number( (*TCP_IT).Moves ) + ","; + buffer += QString::number( (*TCP_IT).Seconds ) + ","; + buffer += QString::number( (*TCP_IT).Increment ) + ","; + } + CFG->writeEntry( "WhiteTCP", buffer ); + buffer = ""; + for( TCP_IT = TCPBlack.begin(); TCP_IT != TCPBlack.end(); ++TCP_IT ) + { + buffer += QString::number( (*TCP_IT).Moves ) + ","; + buffer += QString::number( (*TCP_IT).Seconds ) + ","; + buffer += QString::number( (*TCP_IT).Increment ) + ","; + } + CFG->writeEntry( "BlackTCP", buffer ); + /* Match Rules */ + CFG->writeEntry( "MatchRules", MatchRules ); + /* Handle Players */ + CFG->writeEntry( "WhiteType", Type[WHITE] ); + CFG->writeEntry( "WhiteHelperType", Type[WHITE_HELPER] ); + CFG->writeEntry( "BlackType", Type[BLACK] ); + CFG->writeEntry( "BlackHelperType", Type[BLACK_HELPER] ); + + CFG->writeEntry( "WhiteStr", Strength[WHITE] ); + CFG->writeEntry( "WhiteHelperStr", Strength[WHITE_HELPER] ); + CFG->writeEntry( "BlackStr", Strength[BLACK] ); + CFG->writeEntry( "BlackHelperStr", Strength[BLACK_HELPER] ); +} +/////////////////////////////////////// +// +// resource::ReadEngines +// +/////////////////////////////////////// +void resource::ReadEngines( void ) +{ + engineResource temp; + QStringList engineList; + QStringList::Iterator engineListIT; + QString buffer; + + engines.clear(); + CFG->setGroup( "General" ); + buffer = CFG->readEntry( "Engines" ); + if( buffer.isEmpty() ) return; + + engineList = QStringList::split( QString(","), buffer, FALSE ); + for ( engineListIT = engineList.begin(); engineListIT != engineList.end(); ++engineListIT ) + { + if( !CFG->hasGroup( (*engineListIT) ) ) continue; + CFG->setGroup( (*engineListIT) ); + temp.Name = (*engineListIT); + temp.Filename = CFG->readEntry( "Filename" ); + temp.Arguments = CFG->readEntry( "Arguments" ); + temp.LogFile = CFG->readEntry( "Log" ); + temp.Protocol = CFG->readNumEntry( "Protocol" ); + temp.Wins = CFG->readNumEntry( "Wins" ); + temp.Losses = CFG->readNumEntry( "Losses" ); + temp.Draws = CFG->readNumEntry( "Draws" ); + temp.CurrentRef = CFG->readNumEntry( "CurrentRef" ); + engines.append( temp ); + } +} +/////////////////////////////////////// +// +// resource::WriteEngines +// +/////////////////////////////////////// +void resource::WriteEngines( void ) +{ + QString buffer; + + CFG->setGroup( "General" ); + if( engines.isEmpty() ) + { + CFG->writeEntry( "Engines", QString( "" ) ); + return; + } + for ( enginesIT = engines.begin(); enginesIT != engines.end(); ++enginesIT ) + { + buffer += (*enginesIT).Name + ","; + CFG->setGroup( (*enginesIT).Name ); + CFG->writeEntry( "Filename", (*enginesIT).Filename ); + CFG->writeEntry( "Arguments", (*enginesIT).Arguments ); + CFG->writeEntry( "Log", (*enginesIT).LogFile ); + CFG->writeEntry( "Protocol", (*enginesIT).Protocol ); + CFG->writeEntry( "Wins", (*enginesIT).Wins ); + CFG->writeEntry( "Losses", (*enginesIT).Losses ); + CFG->writeEntry( "Draws", (*enginesIT).Draws ); + CFG->writeEntry( "CurrentRef", (*enginesIT).CurrentRef ); + } + CFG->setGroup( "General" ); + CFG->writeEntry( "Engines", buffer ); + CFG->sync(); +} +/////////////////////////////////////// +// +// resource::ReadServers +// +/////////////////////////////////////// +void resource::ReadServers( void ) +{ + serverResource temp; + QStringList serverList; + QStringList::Iterator serverListIT; + QString buffer; + + servers.clear(); + CFG->setGroup( "General" ); + buffer = CFG->readEntry( "Servers" ); + if( buffer.isEmpty() ) return; + + serverList = QStringList::split( QString(","), buffer, FALSE ); + for ( serverListIT = serverList.begin(); serverListIT != serverList.end(); ++serverListIT ) + { + if( !CFG->hasGroup( (*serverListIT) ) ) continue; + CFG->setGroup( (*serverListIT) ); + temp.Name = (*serverListIT); + temp.URL = CFG->readEntry( "URL" ); + temp.UserName = CFG->readEntry( "UserName" ); + temp.LogFile = CFG->readEntry( "LogFile" ); + temp.Password = decryptStr( CFG->readEntry( "Password" ) ); + temp.StorePass = CFG->readBoolEntry( "StorePass" ); + temp.Port = CFG->readNumEntry( "Port" ); + temp.CurrentRef = CFG->readNumEntry( "CurrentRef" ); + temp.Timeseal = CFG->readEntry( "Timeseal" ); + servers.append( temp ); + } +} +/////////////////////////////////////// +// +// resource::WriteServers +// +/////////////////////////////////////// +void resource::WriteServers( void ) +{ + QString buffer; + + CFG->setGroup( "General" ); + if( servers.isEmpty() ) + { + CFG->writeEntry( "Servers", QString( "" ) ); + return; + } + for ( serversIT = servers.begin(); serversIT != servers.end(); ++serversIT ) + { + buffer += (*serversIT).Name + ","; + CFG->setGroup( (*serversIT).Name ); + CFG->writeEntry( "URL", (*serversIT).URL ); + CFG->writeEntry( "UserName", (*serversIT).UserName ); + CFG->writeEntry( "LogFile", (*serversIT).LogFile ); + if( (*serversIT).StorePass ) + CFG->writeEntry( "Password", encryptStr( (*serversIT).Password ) ); + else + CFG->writeEntry( "Password", "" ); + CFG->writeEntry( "Port", (*serversIT).Port ); + CFG->writeEntry( "StorePass", (*serversIT).StorePass ); + CFG->writeEntry( "CurrentRef", (*serversIT).CurrentRef ); + CFG->writeEntry( "Timeseal", (*serversIT).Timeseal ); + } + CFG->setGroup( "General" ); + CFG->writeEntry( "Servers", buffer ); + CFG->sync(); +} +/////////////////////////////////////// +// +// resource::themeDir +// +/////////////////////////////////////// +QString resource::themeDir( void ) +{ + return QString( GlobalDataDir + "themes/" ); +} +/////////////////////////////////////// +// +// resource::readThemeDir +// +/////////////////////////////////////// +void resource::readThemeDir( void ) +{ + QDir themesDir; + + Boards.clear(); + Chessmen.clear(); + Sounds.clear(); + + themesDir.setNameFilter( "KB*" ); + themesDir = GlobalDataDir + "themes/"; + Boards += themesDir.entryList(); + themesDir = QDir::homeDirPath() + "/.knights/"; + if( themesDir.exists() ) Boards += themesDir.entryList(); + themesDir = "../media/"; + if( themesDir.exists() ) Boards += themesDir.entryList(); + Boards.sort(); + + themesDir.setNameFilter( "KC*" ); + themesDir = GlobalDataDir + "themes/"; + Chessmen += themesDir.entryList(); + themesDir = QDir::homeDirPath() + "/.knights/"; + if( themesDir.exists() ) Chessmen += themesDir.entryList(); + themesDir = "../media/"; + if( themesDir.exists() ) Chessmen += themesDir.entryList(); + Chessmen.sort(); + + themesDir.setNameFilter( "KS*" ); + themesDir = GlobalDataDir + "themes/"; + Sounds += themesDir.entryList(); + themesDir = QDir::homeDirPath() + "/.knights/"; + if( themesDir.exists() ) Sounds += themesDir.entryList(); + themesDir = "../media/"; + if( themesDir.exists() ) Sounds += themesDir.entryList(); + Sounds.sort(); +} +/////////////////////////////////////// +// +// resource::getBoard +// +/////////////////////////////////////// +QString resource::getBoard( int Index ) +{ + if( Index > (signed)Boards.count() ) return QString::null; + if( Index == -1 ) return CurrentBoard; + return Boards[Index]; +} +/////////////////////////////////////// +// +// resource::getChessmen +// +/////////////////////////////////////// +QString resource::getChessmen( int Index ) +{ + if( Index > (signed)Chessmen.count() ) return QString::null; + if( Index == -1 ) return CurrentChessmen; + return Chessmen[Index]; +} +/////////////////////////////////////// +// +// resource::getSounds +// +/////////////////////////////////////// +QString resource::getSounds( int Index ) +{ + if( Index > (signed)Sounds.count() ) return QString::null; + if( Index == -1 ) return CurrentAudio; + return Sounds[Index]; +} +/////////////////////////////////////// +// +// resource::setAudio +// +/////////////////////////////////////// +void resource::setAudio( int AudioIndex ) +{ + QString audioURL; + + /* Make sure the Indexes are valid */ + if( AudioIndex > (signed)Sounds.count() ) + { + kdWarning() << "Can not access audio theme[" << AudioIndex << "]... Index out of range." << endl; + return; + } + /* Change the theme */ + if( AudioIndex != -1 ) CurrentAudio = Sounds[AudioIndex]; + audioURL = themeURL( CurrentAudio ); + if( audioURL.isEmpty() ) + { + return; + } + QApplication::setOverrideCursor( CURSOR_Thinking ); + Audio->setTheme( audioURL ); + QApplication::restoreOverrideCursor(); + return; +} +/////////////////////////////////////// +// +// resource::setTheme +// +/////////////////////////////////////// +void resource::setTheme( int BoardIndex, int ChessmenIndex ) +{ + static bool firstTime( TRUE ); + QString boardURL; + QString chessmenURL; + QString boardConf; + QString chessmenConf; + KSimpleConfig *boardConfig; + KSimpleConfig *chessmenConfig; + + /* Make sure the Indexes are valid */ + if( BoardIndex > (signed)Boards.count() ) + { + kdWarning() << "Can not access board theme[" << BoardIndex << "]... Index out of range." << endl; + return; + } + if( ChessmenIndex > (signed)Chessmen.count() ) + { + kdWarning() << "Can not access chessmen theme[" << ChessmenIndex << "]... Index out of range." << endl; + return; + } + + /* Set the Cursor */ + QApplication::setOverrideCursor( CURSOR_Thinking ); + + /* Change the theme */ + if( BoardIndex != -1 ) + CurrentBoard = Boards[BoardIndex]; + if( ChessmenIndex != -1 ) + CurrentChessmen = Chessmen[ChessmenIndex]; + + boardURL = themeURL( CurrentBoard ); + chessmenURL = themeURL( CurrentChessmen ); + + if( ( boardURL.isEmpty() ) || ( chessmenURL.isEmpty() ) ) + { + QApplication::restoreOverrideCursor(); + return; + } + + /* load the theme.conf files */ + if( !KIO::NetAccess::download( boardURL + "theme.conf", boardConf ) ) + kdWarning() << "Can not read theme.conf from " << boardURL << endl; + boardConfig = new KSimpleConfig( boardConf, TRUE ); + + if( !KIO::NetAccess::download( chessmenURL + "theme.conf", chessmenConf ) ) + kdWarning() << "Can not read theme.conf from " << chessmenURL << endl; + chessmenConfig = new KSimpleConfig( chessmenConf, TRUE ); + + /* Read the headers */ + boardConfig->setGroup( "General" ); + boardHeader.name = boardConfig->readEntry( "Name", "Unknown" ); + boardHeader.version = boardConfig->readEntry( "Version", "Unknown" ); + boardHeader.author = boardConfig->readEntry( "Author", "Unknown" ); + boardHeader.authorEmail = boardConfig->readEntry( "AuthorEmail", "Unknown" ); + boardHeader.authorWWW = boardConfig->readEntry( "AuthorWWW", "Unknown" ); + boardHeader.notes = boardConfig->readEntry( "Notes", "Unknown" ); + chessmenConfig->setGroup( "General" ); + chessmenHeader.name = chessmenConfig->readEntry( "Name", "Unknown" ); + chessmenHeader.version = chessmenConfig->readEntry( "Version", "Unknown" ); + chessmenHeader.author = chessmenConfig->readEntry( "Author", "Unknown" ); + chessmenHeader.authorEmail = chessmenConfig->readEntry( "AuthorEmail", "Unknown" ); + chessmenHeader.authorWWW = chessmenConfig->readEntry( "AuthorWWW", "Unknown" ); + chessmenHeader.notes = chessmenConfig->readEntry( "Notes", "Unknown" ); + + /* Load the Board */ + boardConfig->setGroup( "2DBoard" ); + ThemeBorder = boardConfig->readBoolEntry( "HaveBorder", FALSE ); + loadThemeItem( boardURL + boardConfig->readEntry("Light", "square.light.png"), pixCache->Orig_SquareLight ); + loadThemeItem( boardURL + boardConfig->readEntry("Dark", "square.dark.png"), pixCache->Orig_SquareDark ); + loadThemeItem( boardURL + boardConfig->readEntry("Select", "square.select.png"), pixCache->Orig_HighlightSelect ); + loadThemeItem( boardURL + boardConfig->readEntry("Motion", "square.motion.png"), pixCache->Orig_HighlightMove ); + loadThemeItem( boardURL + boardConfig->readEntry("Danger", "square.danger.png"), pixCache->Orig_HighlightAttack ); + if( ThemeBorder ) + { + loadThemeItem( boardURL + boardConfig->readEntry("Border", "border.png"), pixCache->Orig_Border ); + loadThemeItem( boardURL + boardConfig->readEntry("BorderLightOn", "light_on.png"), pixCache->Orig_BorderLightOn ); + loadThemeItem( boardURL + boardConfig->readEntry("BorderLightOff", "light_off.png"), pixCache->Orig_BorderLightOff ); + } + boardConfig->setGroup( "2DBoard" ); + COLOR_Notation = boardConfig->readColorEntry( "TextColor", &COLOR_White ); + COLOR_Notation_Shadow = boardConfig->readColorEntry( "ShadowColor", &COLOR_Black ); + + /* Load 2D Chessmen */ + chessmenConfig->setGroup( "2DBlack" ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("King", "black.king.png"), pixCache->Orig_BlackKing ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Queen", "black.queen.png"), pixCache->Orig_BlackQueen ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Bishop", "black.bishop.png"), pixCache->Orig_BlackBishop ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Knight", "black.knight.png"), pixCache->Orig_BlackKnight ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Rook", "black.rook.png"), pixCache->Orig_BlackRook ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Pawn", "black.pawn.png"), pixCache->Orig_BlackPawn ); + chessmenConfig->setGroup( "2DWhite" ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("King", "white.king.png"), pixCache->Orig_WhiteKing ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Queen", "white.queen.png"), pixCache->Orig_WhiteQueen ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Bishop", "white.bishop.png"), pixCache->Orig_WhiteBishop ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Knight", "white.knight.png"), pixCache->Orig_WhiteKnight ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Rook", "white.rook.png"), pixCache->Orig_WhiteRook ); + loadThemeItem( chessmenURL + chessmenConfig->readEntry("Pawn", "white.pawn.png"), pixCache->Orig_WhitePawn ); + + /* Remove the theme.conf files */ + delete boardConfig; + delete chessmenConfig; + KIO::NetAccess::removeTempFile( boardConf ); + KIO::NetAccess::removeTempFile( chessmenConf ); + + /* Cleanup */ + pixCache->clear(); + QApplication::restoreOverrideCursor(); + pixCache->resize( ThemeSize ); + firstTime = FALSE; + return; +} +/////////////////////////////////////// +// +// resource::loadThemeItem +// +/////////////////////////////////////// +void resource::loadThemeItem( const QString &URL, QImage &Image ) +{ + QString tempFile; + + if( KIO::NetAccess::download( URL, tempFile ) ) + { + if( !Image.load( tempFile ) ) + kdError() << "resource::LoadThemeItem: Can not load " << tempFile << ", which comes from " << URL << endl; + KIO::NetAccess::removeTempFile( tempFile ); + } + else + kdError() << "resource::LoadThemeItem: Can not extract " << URL << endl; + return; +} +/////////////////////////////////////// +// +// resource::resizeTheme +// +/////////////////////////////////////// +void resource::resizeTheme( const int &size ) +{ + /* Set the Cursor */ + QApplication::setOverrideCursor( CURSOR_Thinking ); + + ThemeSize = size; + if( ThemeSize > IMAGE_MAX ) + ThemeSize = IMAGE_MIN; + if( ThemeSize < IMAGE_MIN ) + ThemeSize = IMAGE_MAX; + pixCache->resize( ThemeSize ); + ConfigWrite(); + + QApplication::restoreOverrideCursor(); +} +/////////////////////////////////////// +// +// resource::LoadIcon +// +/////////////////////////////////////// +QPixmap resource::LoadIcon( QString Name, int Group ) +{ + return Icons->loadIcon( Name, (KIcon::Group)Group ); +} +/////////////////////////////////////// +// +// resource::encryptStr +// +/////////////////////////////////////// +// Borrowed from KMail +QString resource::encryptStr(const QString &aStr) const +{ + unsigned int i, val; + unsigned int len = aStr.length(); + QCString result; + result.resize(len+1); + for (i=0; iplay( snd ); +} +/////////////////////////////////////// +// +// resource::ReadColors +// +/////////////////////////////////////// +void resource::ReadColors( void ) +{ + QColor tmp; + + COLOR_White = QColor( 255, 255, 255 ); + COLOR_Black = QColor( 0, 0, 0 ); + CFG->setGroup( "Colors" ); + COLOR_Background = CFG->readColorEntry( "BackgroundColor", &COLOR_White ); + COLOR_GraphBackground = CFG->readColorEntry( "GraphBackground", &COLOR_Background ); + COLOR_Standard = CFG->readColorEntry( "StandardColor", &COLOR_Black ); + COLOR_GraphForeground = CFG->readColorEntry( "GraphForeground", &COLOR_Standard ); + tmp = QColor( 128, 0, 128 ); // Purple + COLOR_PrivateTell = CFG->readColorEntry( "PrivateColor", &tmp ); + tmp = QColor( 0, 0, 160 ); // Blue + COLOR_ChannelTell = CFG->readColorEntry( "ChannelColor", &tmp ); + tmp = QColor( 160, 0, 0 ); // Red + COLOR_Shout = CFG->readColorEntry( "ShoutColor", &tmp ); + tmp = QColor( 0, 160, 0 ); // Green + COLOR_Whisper = CFG->readColorEntry( "WhisperColor", &tmp ); + tmp = QColor( 0, 128, 128 ); // Cyan + COLOR_Notification = CFG->readColorEntry( "NotificationColor", &tmp ); +} +/////////////////////////////////////// +// +// resource::WriteColors +// +/////////////////////////////////////// +void resource::WriteColors( void ) +{ + CFG->setGroup( "Colors" ); + CFG->writeEntry( "BackgroundColor", COLOR_Background ); + CFG->writeEntry( "StandardColor", COLOR_Standard ); + CFG->writeEntry( "PrivateColor", COLOR_PrivateTell ); + CFG->writeEntry( "ChannelColor", COLOR_ChannelTell ); + CFG->writeEntry( "ShoutColor", COLOR_Shout ); + CFG->writeEntry( "WhisperColor", COLOR_Whisper ); + CFG->writeEntry( "NotificationColor", COLOR_Notification ); + CFG->writeEntry( "GraphForeground", COLOR_GraphForeground ); + CFG->writeEntry( "GraphBackground", COLOR_GraphBackground ); +} +/////////////////////////////////////// +// +// resource::ReadFonts +// +/////////////////////////////////////// +void resource::ReadFonts( void ) +{ + QFont Fixed = KGlobalSettings::fixedFont(); + CFG->setGroup( "Fonts" ); + FONT_Standard = CFG->readFontEntry( "StandardFont", &Fixed ); + FONT_PrivateTell = CFG->readFontEntry( "PrivateFont", &Fixed ); + FONT_ChannelTell = CFG->readFontEntry( "ChannelFont", &Fixed ); + FONT_Shout = CFG->readFontEntry( "ShoutFont", &Fixed ); + FONT_Whisper = CFG->readFontEntry( "WhisperFont", &Fixed ); + FONT_Notification = CFG->readFontEntry( "NotificationFont", &Fixed ); +} +/////////////////////////////////////// +// +// resource::WriteFonts +// +/////////////////////////////////////// +void resource::WriteFonts( void ) +{ + CFG->setGroup( "Fonts" ); + CFG->writeEntry( "StandardFont", FONT_Standard ); + CFG->writeEntry( "PrivateFont", FONT_PrivateTell ); + CFG->writeEntry( "ChannelFont", FONT_ChannelTell ); + CFG->writeEntry( "ShoutFont", FONT_Shout ); + CFG->writeEntry( "WhisperFont", FONT_Whisper ); + CFG->writeEntry( "NotificationFont", FONT_Notification ); +} +/////////////////////////////////////// +// +// resource::buildStyle +// +/////////////////////////////////////// +void resource::buildStyle( void ) +{ + /* Configure SSI_Default */ + SSI_Default->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_Default->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_Default->setFontFamily( FONT_Standard.family() ); + SSI_Default->setFontSize( FONT_Standard.pointSize() ); + SSI_Default->setFontUnderline( FONT_Standard.underline() ); + SSI_Default->setFontItalic( FONT_Standard.italic() ); + SSI_Default->setFontWeight( FONT_Standard.weight() ); + SSI_Default->setColor( COLOR_Standard ); + /* Configure SSI_PrivateTell */ + SSI_PrivateTell->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_PrivateTell->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_PrivateTell->setFontFamily( FONT_PrivateTell.family() ); + SSI_PrivateTell->setFontSize( FONT_PrivateTell.pointSize() ); + SSI_PrivateTell->setFontUnderline( FONT_PrivateTell.underline() ); + SSI_PrivateTell->setFontItalic( FONT_PrivateTell.italic() ); + SSI_PrivateTell->setFontWeight( FONT_PrivateTell.weight() ); + SSI_PrivateTell->setColor( COLOR_PrivateTell ); + /* Configure SSI_ChannelTell */ + SSI_ChannelTell->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_ChannelTell->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_ChannelTell->setFontFamily( FONT_ChannelTell.family() ); + SSI_ChannelTell->setFontSize( FONT_ChannelTell.pointSize() ); + SSI_ChannelTell->setFontUnderline( FONT_ChannelTell.underline() ); + SSI_ChannelTell->setFontItalic( FONT_ChannelTell.italic() ); + SSI_ChannelTell->setFontWeight( FONT_ChannelTell.weight() ); + SSI_ChannelTell->setColor( COLOR_ChannelTell ); + /* Configure SSI_Shout */ + SSI_Shout->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_Shout->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_Shout->setFontFamily( FONT_Shout.family() ); + SSI_Shout->setFontSize( FONT_Shout.pointSize() ); + SSI_Shout->setFontUnderline( FONT_Shout.underline() ); + SSI_Shout->setFontItalic( FONT_Shout.italic() ); + SSI_Shout->setFontWeight( FONT_Shout.weight() ); + SSI_Shout->setColor( COLOR_Shout ); + /* Configure SSI_Whisper */ + SSI_Whisper->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_Whisper->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_Whisper->setFontFamily( FONT_Whisper.family() ); + SSI_Whisper->setFontSize( FONT_Whisper.pointSize() ); + SSI_Whisper->setFontUnderline( FONT_Whisper.underline() ); + SSI_Whisper->setFontItalic( FONT_Whisper.italic() ); + SSI_Whisper->setFontWeight( FONT_Whisper.weight() ); + SSI_Whisper->setColor( COLOR_Whisper ); + /* Configure SSI_Notification */ + SSI_Notification->setDisplayMode( QStyleSheetItem::DisplayListItem ); + SSI_Notification->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre ); + SSI_Notification->setFontFamily( FONT_Notification.family() ); + SSI_Notification->setFontSize( FONT_Notification.pointSize() ); + SSI_Notification->setFontUnderline( FONT_Notification.underline() ); + SSI_Notification->setFontItalic( FONT_Notification.italic() ); + SSI_Notification->setFontWeight( FONT_Notification.weight() ); + SSI_Notification->setColor( COLOR_Notification ); +} +/////////////////////////////////////// +// +// resource::themeURL +// +/////////////////////////////////////// +QString resource::themeURL( const QString theme ) +{ + QString fullURL; + fullURL = "tar:" + GlobalDataDir + "themes/" + theme; + if( !KIO::NetAccess::exists( fullURL ) ) + { + fullURL = "tar:" + QDir::currentDirPath() + "../media/" + theme; + if( !KIO::NetAccess::exists( fullURL ) ) + { + fullURL = "tar:" + QDir::homeDirPath() + "/.knights/" + theme; + if( !KIO::NetAccess::exists( fullURL ) ) + { + kdWarning() << "The theme " << theme << " does not exist in any valid path." << endl; + return QString::null; + } + } + } + fullURL += "/"; + return fullURL; +} + +/////////////////////////////////////// +// +// resource::loadSCIDImage +// +/////////////////////////////////////// +QPixmap resource::loadSCIDImage( const QString &name ) +{ + const int BufferMax = 120; + const int ArrayMax = 21600; + const int SkipSize = 7200; + + QPixmap newPix; + QString searchName = '\"' + name + '\"'; + QByteArray base64Data( ArrayMax ); + QByteArray rawData( ArrayMax ); + char *array = base64Data.data(); + char buffer[BufferMax]; + char photo[12]; + unsigned int index = 0; + unsigned int buffSize = 0; + + QString source = locate( "appdata", "players.img" ); + if( source.isNull() ) + source = SCID_Image_Path; + + strcpy( photo, "photo" ); + QFile file( source ); + + if( file.open( IO_ReadOnly ) ) + { + while( !file.atEnd() ) + { + file.readLine( buffer, BufferMax ); + if( strstr( buffer, photo ) != NULL ) + { + if( strstr( buffer, searchName.latin1() ) != NULL ) + { + /* From here on, we're reading the image */ + index = file.readBlock( array, SkipSize ); + buffer[0] = 0; + while( ( buffer[0] != '}' ) && ( !file.atEnd() ) ) + { + memcpy( array + index, buffer, buffSize ); + index += buffSize; + buffSize = file.readLine( buffer, BufferMax ); + } + base64Data.truncate( index ); + KCodecs::base64Decode( base64Data, rawData ); + newPix.loadFromData( rawData ); + break; + } + else + { + file.at( file.at() + SkipSize ); + } + } + } + file.close(); + } + return newPix; +} + +#undef CFG + + diff --git a/knights/resource.h b/knights/resource.h new file mode 100644 index 0000000..0892988 --- /dev/null +++ b/knights/resource.h @@ -0,0 +1,240 @@ +/*************************************************************************** + resource.h - description + ------------------- + begin : Tue Jul 17 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef RESOURCE_H +#define RESOURCE_H + + +/** + *@author Troy Corbin Jr. + */ + +/* KDE */ +#include +#include +#include +#include +#include +/* Qt */ +#include +#include +#include +#include +#include +#include +/* Local */ +#include "definitions.h" + +class audio; +class KnightsPixCache; +class TabManager; +class Accel; + +typedef struct engineResource +{ + QListViewItem *Item; + QString Name; + QString Filename; + QString Arguments; + QString LogFile; + int Protocol; + int Wins; + int Losses; + int Draws; + int CurrentRef; +}; + +typedef struct serverResource +{ + QListViewItem *Item; + QString Name; + QString URL; + QString UserName; + QString Password; + QString LogFile; + QString Timeseal; + bool StorePass; + int Port; + int CurrentRef; +}; + +typedef QValueList engineList; +typedef QValueList serverList; + +class resource +{ + public: + /* The current Theme */ + int ThemeSize; + bool ThemeBorder; + QStyleSheet *ConsoleStyle; + QString CurrentBoard; + QString CurrentChessmen; + QString CurrentAudio; + ThemeHeader boardHeader; + ThemeHeader chessmenHeader; + ThemeHeader audioHeader; + KnightsPixCache *pixCache; + TabManager *tabManager; + Accel *myAccel; + + /* General Settings */ + QString Local_Player; + QString Local_Email_Address; + int Config_Version; + bool Accepted_License; + int OPTION_On_Init; + int Audio_Volume; + bool OPTION_Audio; + bool OPTION_Audio_Current_Only; + bool OPTION_Auto_Queen; + bool OPTION_Auto_Preview; + bool OPTION_Auto_Call_Flag; + bool OPTION_Auto_Close_Last_ICS; + bool OPTION_Animate_Moves; + bool OPTION_Book_White; + bool OPTION_Book_Black; + bool OPTION_Board_Orientation; + bool OPTION_Ponder; + bool OPTION_Show_Coord; + bool OPTION_Show_Last_Move; + bool OPTION_Show_Splash; + bool OPTION_Show_Extended_PGN; + bool OPTION_Pause_On_Minimize; + bool OPTION_Reuse_PGN; + bool OPTION_3DBoard; + QString PGN_Filename; + QString Email_Command_Line; + QString Email_Address; + QString SCID_Image_Path; + int Widget_Height; + /* ICS Options */ + int Seek_Timer; + int OPTION_Profanity; + bool OPTION_Premove; + bool OPTION_Kibitz; + bool OPTION_Private; + bool OPTION_Shout; + bool OPTION_Tell; + bool OPTION_Seek; + /* Notification Prompts */ + QString PromptForSaving; + /* Colors */ + QColor COLOR_White; + QColor COLOR_Black; + QColor COLOR_Background; + QColor COLOR_Standard; + QColor COLOR_PrivateTell; + QColor COLOR_ChannelTell; + QColor COLOR_Shout; + QColor COLOR_Whisper; + QColor COLOR_Notification; + QColor COLOR_Notation; + QColor COLOR_Notation_Shadow; + QColor COLOR_GraphBackground; + QColor COLOR_GraphForeground; + /* Fonts */ + QFont FONT_Standard; + QFont FONT_PrivateTell; + QFont FONT_ChannelTell; + QFont FONT_Shout; + QFont FONT_Whisper; + QFont FONT_Notification; + /* Cursors */ + QCursor CURSOR_Standard; + QCursor CURSOR_Thinking; + QCursor CURSOR_Text; + /* Chess Engines */ + engineList engines; + engineList::Iterator enginesIT; + /* Chess Servers */ + serverList servers; + serverList::Iterator serversIT; + /* New Match Presets */ + TCPList TCPWhite; + TCPList TCPBlack; + char MatchRules; + char Type[4]; + char Strength[4]; + + resource( KCmdLineArgs *args ); + ~resource(); + + void ConfigRead( void ); + void ConfigWrite( void ); + + void readThemeDir( void ); + QString getBoard( int Index=-1 ); + QString getChessmen( int Index=-1 ); + QString getSounds( int Index=-1 ); + QString themeDir( void ); + void setTheme( int BoardIndex=-1, int ChessmenIndex=-1 ); + void setAudio( int AudioIndex=-1 ); + void resizeTheme( const int &size ); + + /** + Call buildStyle whenever you need to reparse the Resource configuration */ + void buildStyle( void ); + QPixmap LoadIcon( QString Name, int Group ); + QPixmap loadSCIDImage( const QString &name ); + void play( const char ); + + private: + + QStyleSheetItem *SSI_Default; + QStyleSheetItem *SSI_PrivateTell; + QStyleSheetItem *SSI_ChannelTell; + QStyleSheetItem *SSI_Shout; + QStyleSheetItem *SSI_Whisper; + QStyleSheetItem *SSI_Notification; + + QString GlobalDataDir; + QString LocalDataDir; + + QStringList Boards; + QStringList Chessmen; + QStringList Sounds; + KIconLoader *Icons; + audio *Audio; + + void ReadEngines( void ); + void WriteEngines( void ); + + void ReadServers( void ); + void WriteServers( void ); + + void ReadMatchParam( void ); + void WriteMatchParam( void ); + + void ReadColors( void ); + void WriteColors( void ); + + void ReadFonts( void ); + void WriteFonts( void ); + + /** + Borrowed from KMail + Very primitive en/de-cryption so that the password is not + readable in the config file. But still very easy breakable. + */ + QString encryptStr( const QString& inStr ) const; + QString decryptStr( const QString& inStr ) const; + QString themeURL( const QString ); + void loadThemeItem( const QString& URL, QImage& Image ); +}; + +#endif diff --git a/knights/setpageaudio.cpp b/knights/setpageaudio.cpp new file mode 100644 index 0000000..3c51b12 --- /dev/null +++ b/knights/setpageaudio.cpp @@ -0,0 +1,133 @@ +/*************************************************************************** + setpageaudio.cpp - description + ------------------- + begin : Thu Jan 10 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include "setpageaudio.moc" + +setPageAudio::setPageAudio(QWidget *parent, resource *Rsrc ) : QVBoxLayout(parent) +{ + Parent = parent; + Resource = Rsrc; + NewSounds = 0; + changeTheme = FALSE; + + BUTTON_enableAudio = new QCheckBox( i18n( "Enable Audio" ), parent ); + BUTTON_enableAudio->setChecked( Resource->OPTION_Audio ); + addWidget( BUTTON_enableAudio ); + connect( BUTTON_enableAudio, SIGNAL( toggled(bool) ), + this, SLOT( slot_enableAudio(bool) ) ); + + GROUP_Theme = new QGroupBox( 1, + Qt::Vertical, + i18n( "Audio Themes" ), + parent ); + addWidget( GROUP_Theme ); + Current_Theme = new KComboBox ( GROUP_Theme ); + buildThemeList(); + connect( Current_Theme, SIGNAL( activated(int) ), + this, SLOT( slot_currentTheme(int) ) ); + + BOX_Main = new QHBox( parent ); + addWidget( BOX_Main ); + + GROUP_Volume = new QGroupBox( 3, Qt::Vertical, i18n( "Volume" ), BOX_Main ); + Vol_Max = new QLabel( i18n( "Maximum" ), GROUP_Volume ); + Current_Volume = new QSlider ( 0, 100, 10, Resource->Audio_Volume, QSlider::Vertical, GROUP_Volume ); + connect( Current_Volume, SIGNAL( valueChanged(int) ), this, SLOT( slot_currentVolume(int) ) ); + Current_Volume->setTickmarks( QSlider::Right ); + Vol_Min = new QLabel( i18n( "Minimum" ), GROUP_Volume ); + + BOX_Options = new QVBox( BOX_Main ); + BUTTON_AudioCurrentOnly = new QCheckBox( i18n( "For Current Match Only" ), BOX_Options ); + BUTTON_AudioCurrentOnly->setChecked( Resource->OPTION_Audio_Current_Only ); + connect( BUTTON_AudioCurrentOnly, SIGNAL( toggled(bool) ), + this, SLOT( slot_AudioCurrentOnly(bool) ) ); +} +setPageAudio::~setPageAudio() +{ +} +/////////////////////////////////////// +// +// setPageAudio::slot_enableAudio +// +/////////////////////////////////////// +void setPageAudio::slot_enableAudio( bool state ) +{ + Resource->OPTION_Audio = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageAudio::slot_currentTheme +// +/////////////////////////////////////// +void setPageAudio::slot_currentTheme( int Index ) +{ + NewSounds = Index; + changeTheme = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageAudio::slot_currentVolume +// +/////////////////////////////////////// +void setPageAudio::slot_currentVolume( int Level ) +{ + Resource->Audio_Volume = Level; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageAudio::slot_AudioCurrentOnly +// +/////////////////////////////////////// +void setPageAudio::slot_AudioCurrentOnly( bool state ) +{ + Resource->OPTION_Audio_Current_Only = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageAudio::buildThemeList +// +/////////////////////////////////////// +void setPageAudio::buildThemeList( void ) +{ + QString buffer; + int tmp(0); + + Current_Theme->clear(); + Resource->readThemeDir(); + while(1) + { + buffer = Resource->getSounds( tmp ); + if( buffer.isEmpty() ) break; + buffer.remove( 0, 2 ); + buffer.replace( QRegExp("_"), " " ); + buffer.replace( QRegExp(".tar"), "" ); + buffer.replace( QRegExp(".gz"), "" ); + buffer.replace( QRegExp(".bz2"), "" ); + Current_Theme->insertItem( buffer, tmp ); + if( Resource->getSounds() == Resource->getSounds( tmp ) ) + { + Current_Theme->setCurrentItem( tmp ); + NewSounds = tmp; + } + tmp++; + } +} diff --git a/knights/setpageaudio.h b/knights/setpageaudio.h new file mode 100644 index 0000000..5d9c58b --- /dev/null +++ b/knights/setpageaudio.h @@ -0,0 +1,69 @@ +/*************************************************************************** + setpageaudio.h - description + ------------------- + begin : Thu Jan 10 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef SETPAGEAUDIO_H +#define SETPAGEAUDIO_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ + +class setPageAudio : public QVBoxLayout +{ + Q_OBJECT + public: + setPageAudio(QWidget *parent=0, resource *Rsrc=0); + ~setPageAudio(); + void buildThemeList( void ); + int NewSounds; + bool changeTheme; + signals: + void enableApply( void ); + public slots: + void slot_enableAudio( bool ); + void slot_currentTheme( int ); + void slot_currentVolume( int ); + void slot_AudioCurrentOnly( bool ); + private: + QWidget *Parent; + resource *Resource; + + QCheckBox *BUTTON_enableAudio; + QGroupBox *GROUP_Theme; + KComboBox *Current_Theme; + QHBox *BOX_Main; + QGroupBox *GROUP_Volume; + QLabel *Vol_Min; + QSlider *Current_Volume; + QLabel *Vol_Max; + QVBox *BOX_Options; + QCheckBox *BUTTON_AudioCurrentOnly; +}; + +#endif diff --git a/knights/setpagedisplay.cpp b/knights/setpagedisplay.cpp new file mode 100644 index 0000000..1cf82d9 --- /dev/null +++ b/knights/setpagedisplay.cpp @@ -0,0 +1,563 @@ +/*************************************************************************** + setpagedisplay.cpp - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "setpagedisplay.moc" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +setPageDisplay::setPageDisplay(QWidget *parent, resource *Rsrc ) : QVBoxLayout(parent) +{ + QStyle& Style = QApplication::style(); + Resource = Rsrc; + margin = Style.defaultFrameWidth(); + NewBoards = 0; + NewChessmen = 0; + changeTheme = FALSE; + refreshBoard = FALSE; + rebuildConsole = FALSE; + + TabParent = new QTabWidget( parent, "setPageDisplay" ); + initTab1(); + initTab2(); + addWidget( TabParent ); +} +setPageDisplay::~setPageDisplay() +{ + delete Show_Splashscreen; + delete Board_Orientation; + delete GROUP_General_Graphics; + delete Size_Max; + delete Size_Min; + delete Current_Theme_Size; + delete Current_Boards; + delete Current_Chessmen; + delete GROUP_Boards; + delete GROUP_Chessmen; + delete BOX_Themes; + delete Tab1; + delete Tab2; + delete TabParent; +} +/////////////////////////////////////// +// +// setPageDisplay::initTab1 +// +/////////////////////////////////////// +void setPageDisplay::initTab1( void ) +{ + Tab1 = new QVBox( TabParent ); + Tab1->setMargin( margin ); + BOX_Themes = new QHBox( Tab1 ); + GROUP_Boards = new QGroupBox( 1, + Qt::Vertical, + i18n( "Board Themes" ), + BOX_Themes ); + Current_Boards = new KComboBox ( GROUP_Boards ); + GROUP_Chessmen = new QGroupBox( 1, + Qt::Vertical, + i18n( "Chessman Themes" ), + BOX_Themes ); + Current_Chessmen = new KComboBox ( GROUP_Chessmen ); + + GROUP_Theme_Size = new QGroupBox( 3, + Qt::Horizontal, + i18n( "Theme Size" ), + Tab1 ); + + Size_Min = new QLabel( i18n( "Small" ), GROUP_Theme_Size ); + Current_Theme_Size = new QSlider ( 0, + 14, + 2, + ( Resource->ThemeSize - IMAGE_MIN ) / 8 , + QSlider::Horizontal, + GROUP_Theme_Size ); + Size_Max = new QLabel( i18n( "Large" ), GROUP_Theme_Size ); + + GROUP_SCID_Images = new QGroupBox( 2, Qt::Horizontal, i18n("Player Images File:"), Tab1 ); + EDIT_SCID_Images = new KLineEdit( GROUP_SCID_Images ); + EDIT_SCID_Images->setText( Resource->SCID_Image_Path ); + connect( EDIT_SCID_Images, SIGNAL( textChanged(const QString&) ), this, SLOT( slot_SCID_Images(const QString&) ) ); + BUTTON_SCID_Images = new QPushButton( GROUP_SCID_Images ); + BUTTON_SCID_Images->setPixmap( Resource->LoadIcon( QString( "fileopen" ), KIcon::Toolbar ) ); + connect( BUTTON_SCID_Images, SIGNAL( clicked() ), this, SLOT( slot_SCID_Images_Button() ) ); + + GROUP_General_Graphics = new QGroupBox( 4, + Qt::Vertical, + i18n( "Other Display Options" ), + Tab1 ); + + Board_Orientation = new QCheckBox( i18n( "Reverse Board Orientation" ), GROUP_General_Graphics ); + Board_Orientation->setChecked( Resource->OPTION_Board_Orientation ); + connect( Board_Orientation, SIGNAL( toggled(bool) ), + this, SLOT( slotToggle_Board_Orientation(bool) ) ); + + Show_Splashscreen = new QCheckBox( i18n( "Display Startup Logo" ), GROUP_General_Graphics ); + Show_Splashscreen->setChecked( Resource->OPTION_Show_Splash ); + connect( Show_Splashscreen, SIGNAL( toggled(bool) ), + this, SLOT( slotToggle_Splashscreen(bool) ) ); + + Auto_Preview = new QCheckBox( i18n( "Automatic Preview" ), GROUP_General_Graphics ); + Auto_Preview->setChecked( Resource->OPTION_Auto_Preview ); + connect( Auto_Preview, SIGNAL( toggled(bool) ), + this, SLOT( slotToggle_Auto_Preview(bool) ) ); + + Show_Last_Move = new QCheckBox( i18n( "Show Last Move" ), GROUP_General_Graphics ); + Show_Last_Move->setChecked( Resource->OPTION_Show_Last_Move ); + connect( Show_Last_Move, SIGNAL( toggled(bool) ), + this, SLOT( slotToggle_Show_Last_Move(bool) ) ); + + Animate_Move = new QCheckBox( i18n( "Animate Moves" ), GROUP_General_Graphics ); + Animate_Move->setChecked( Resource->OPTION_Animate_Moves ); + connect( Animate_Move, SIGNAL( toggled(bool) ), + this, SLOT( slotToggle_Animate_Move(bool) ) ); + + Show_Coord = new QCheckBox( i18n( "Show Coordinates" ), GROUP_General_Graphics ); + Show_Coord->setChecked( Resource->OPTION_Show_Coord ); + connect( Show_Coord, SIGNAL( toggled(bool) ), + this, SLOT( slotToggle_Show_Coord(bool) ) ); + + Current_Theme_Size->setTickmarks( QSlider::Below ); + Current_Boards->setEditable( FALSE ); + Current_Chessmen->setEditable( FALSE ); + buildThemeList(); + connect( Current_Boards, SIGNAL( activated(int) ), + this, SLOT( slotCurrent_Boards(int) ) ); + connect( Current_Chessmen, SIGNAL( activated(int) ), + this, SLOT( slotCurrent_Chessmen(int) ) ); + connect( Current_Theme_Size, SIGNAL( valueChanged(int) ), + this, SLOT( slotCurrent_Theme_Size(int) ) ); + TabParent->addTab( Tab1, i18n("General") ); +} +/////////////////////////////////////// +// +// setPageDisplay::initTab2 +// +/////////////////////////////////////// +void setPageDisplay::initTab2( void ) +{ + QPixmap ColorsIcon( Resource->LoadIcon( QString("colorize"), KIcon::Toolbar ) ); + Tab2 = new QFrame( TabParent ); + Tab2->setMargin( margin ); + + GRID_Style = new QGridLayout( Tab2, 11, 5, margin ); + + Console_Sample = new QTextView( Tab2 ); + Console_Sample->setTextFormat( Qt::RichText ); + GRID_Style->addMultiCellWidget( Console_Sample, 5, 10, 1, 1 ); + + Default_Button = new QPushButton( i18n("Restore Defaults"), Tab2 ); + connect( Default_Button, SIGNAL( clicked() ), this, SLOT( slot_setDefault() ) ); + GRID_Style->addWidget( Default_Button, 11, 1 ); + + Fonts_Button_Standard = new QPushButton( i18n("Standard Font..."), Tab2 ); + connect( Fonts_Button_Standard, SIGNAL( clicked() ), this, SLOT( slot_Font_Standard() ) ); + GRID_Style->addWidget( Fonts_Button_Standard, 5, 3 ); + + Colors_Button_Standard = new QPushButton( Tab2 ); + Colors_Button_Standard->setPixmap( ColorsIcon ); + connect( Colors_Button_Standard, SIGNAL( clicked() ), this, SLOT( slot_Color_Standard() ) ); + GRID_Style->addWidget( Colors_Button_Standard, 5, 5 ); + + Fonts_Button_PrivateTell = new QPushButton( i18n("Private Font..."), Tab2 ); + connect( Fonts_Button_PrivateTell, SIGNAL( clicked() ), this, SLOT( slot_Font_PrivateTell() ) ); + GRID_Style->addWidget( Fonts_Button_PrivateTell, 6, 3 ); + + Colors_Button_PrivateTell = new QPushButton( Tab2 ); + Colors_Button_PrivateTell->setPixmap( ColorsIcon ); + connect( Colors_Button_PrivateTell, SIGNAL( clicked() ), this, SLOT( slot_Color_PrivateTell() ) ); + GRID_Style->addWidget( Colors_Button_PrivateTell, 6, 5 ); + + Fonts_Button_ChannelTell = new QPushButton( i18n("Channel Font..."), Tab2 ); + connect( Fonts_Button_ChannelTell, SIGNAL( clicked() ), this, SLOT( slot_Font_ChannelTell() ) ); + GRID_Style->addWidget( Fonts_Button_ChannelTell, 7, 3 ); + + Colors_Button_ChannelTell = new QPushButton( Tab2 ); + Colors_Button_ChannelTell->setPixmap( ColorsIcon ); + connect( Colors_Button_ChannelTell, SIGNAL( clicked() ), this, SLOT( slot_Color_ChannelTell() ) ); + GRID_Style->addWidget( Colors_Button_ChannelTell, 7, 5 ); + + Fonts_Button_Shout = new QPushButton( i18n("Shout Font..."), Tab2 ); + connect( Fonts_Button_Shout, SIGNAL( clicked() ), this, SLOT( slot_Font_Shout() ) ); + GRID_Style->addWidget( Fonts_Button_Shout, 8, 3 ); + + Colors_Button_Shout = new QPushButton( Tab2 ); + Colors_Button_Shout->setPixmap( ColorsIcon ); + connect( Colors_Button_Shout, SIGNAL( clicked() ), this, SLOT( slot_Color_Shout() ) ); + GRID_Style->addWidget( Colors_Button_Shout, 8, 5 ); + + Fonts_Button_Whisper = new QPushButton( i18n("Whisper Font..."), Tab2 ); + connect( Fonts_Button_Whisper, SIGNAL( clicked() ), this, SLOT( slot_Font_Whisper() ) ); + GRID_Style->addWidget( Fonts_Button_Whisper, 9, 3 ); + + Colors_Button_Whisper = new QPushButton( Tab2 ); + Colors_Button_Whisper->setPixmap( ColorsIcon ); + connect( Colors_Button_Whisper, SIGNAL( clicked() ), this, SLOT( slot_Color_Whisper() ) ); + GRID_Style->addWidget( Colors_Button_Whisper, 9, 5 ); + + Fonts_Button_Notification = new QPushButton( i18n("Notification Font..."), Tab2 ); + connect( Fonts_Button_Notification, SIGNAL( clicked() ), this, SLOT( slot_Font_Notification() ) ); + GRID_Style->addWidget( Fonts_Button_Notification, 10, 3 ); + + Colors_Button_Notification = new QPushButton( Tab2 ); + Colors_Button_Notification->setPixmap( ColorsIcon ); + connect( Colors_Button_Notification, SIGNAL( clicked() ), this, SLOT( slot_Color_Notification() ) ); + GRID_Style->addWidget( Colors_Button_Notification, 10, 5 ); + + Colors_Button_Background = new QPushButton( Tab2 ); + Colors_Button_Background->setPixmap( ColorsIcon ); + connect( Colors_Button_Background, SIGNAL( clicked() ), this, SLOT( slot_Color_Background() ) ); + GRID_Style->addWidget( Colors_Button_Background, 11, 5 ); + + resetSampleConsole(); + TabParent->addTab( Tab2, i18n("Console") ); +} +/////////////////////////////////////// +// +// setPageDisplay::slot_setDefault +// +/////////////////////////////////////// +void setPageDisplay::slot_setDefault(void) +{ + Resource->FONT_Standard = KGlobalSettings::fixedFont(); + Resource->FONT_PrivateTell = KGlobalSettings::fixedFont(); + Resource->FONT_ChannelTell = KGlobalSettings::fixedFont(); + Resource->FONT_Shout = KGlobalSettings::fixedFont(); + Resource->FONT_Whisper = KGlobalSettings::fixedFont(); + Resource->FONT_Notification = KGlobalSettings::fixedFont(); + Resource->COLOR_Background = Resource->COLOR_White; + Resource->COLOR_Standard = Resource->COLOR_Black; + Resource->COLOR_PrivateTell = QColor( 128, 0, 128 ); // Purple + Resource->COLOR_ChannelTell = QColor( 0, 0, 160 ); // Blue + Resource->COLOR_Shout = QColor( 160, 0, 0 ); // Red + Resource->COLOR_Whisper = QColor( 0, 160, 0 ); // Green + Resource->COLOR_Notification = QColor( 0, 128, 128 ); // Cyan + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slot_Font_????? +// +/////////////////////////////////////// +void setPageDisplay::slot_Font_Standard(void) +{ + int value = KFontDialog::getFont( Resource->FONT_Standard ); + if( value != KFontDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Font_PrivateTell(void) +{ + int value = KFontDialog::getFont( Resource->FONT_PrivateTell ); + if( value != KFontDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Font_ChannelTell(void) +{ + int value = KFontDialog::getFont( Resource->FONT_ChannelTell ); + if( value != KFontDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Font_Shout(void) +{ + int value = KFontDialog::getFont( Resource->FONT_Shout ); + if( value != KFontDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Font_Whisper(void) +{ + int value = KFontDialog::getFont( Resource->FONT_Whisper ); + if( value != KFontDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Font_Notification(void) +{ + int value = KFontDialog::getFont( Resource->FONT_Notification ); + if( value != KFontDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slot_Color_????? +// +/////////////////////////////////////// +void setPageDisplay::slot_Color_Background(void) +{ + int value = KColorDialog::getColor( Resource->COLOR_Background ); + if( value != KColorDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Color_Standard(void) +{ + int value = KColorDialog::getColor( Resource->COLOR_Standard ); + if( value != KColorDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Color_PrivateTell(void) +{ + int value = KColorDialog::getColor( Resource->COLOR_PrivateTell ); + if( value != KColorDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Color_ChannelTell(void) +{ + int value = KColorDialog::getColor( Resource->COLOR_ChannelTell ); + if( value != KColorDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Color_Shout(void) +{ + int value = KColorDialog::getColor( Resource->COLOR_Shout ); + if( value != KColorDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Color_Whisper(void) +{ + int value = KColorDialog::getColor( Resource->COLOR_Whisper ); + if( value != KColorDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +void setPageDisplay::slot_Color_Notification(void) +{ + int value = KColorDialog::getColor( Resource->COLOR_Notification ); + if( value != KColorDialog::Accepted ) return; + resetSampleConsole(); + rebuildConsole = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotCurrent_Boards +// +/////////////////////////////////////// +void setPageDisplay::slotCurrent_Boards( int Index ) +{ + NewBoards = Index; + changeTheme = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotCurrent_Chessmen +// +/////////////////////////////////////// +void setPageDisplay::slotCurrent_Chessmen( int Index ) +{ + NewChessmen = Index; + changeTheme = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotCurrent_Theme_Size +// +/////////////////////////////////////// +void setPageDisplay::slotCurrent_Theme_Size( int Index ) +{ + Resource->ThemeSize = 32 + ( Index * 8 ); + changeTheme = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotToggle_Board_Orientation +// +/////////////////////////////////////// +void setPageDisplay::slotToggle_Board_Orientation( bool state ) +{ + Resource->OPTION_Board_Orientation = state; + refreshBoard = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotToggle_Splashscreen +// +/////////////////////////////////////// +void setPageDisplay::slotToggle_Splashscreen( bool state ) +{ + Resource->OPTION_Show_Splash = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotToggle_Auto_Preview +// +/////////////////////////////////////// +void setPageDisplay::slotToggle_Auto_Preview( bool state ) +{ + Resource->OPTION_Auto_Preview = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotToggle_Show_Last_Move +// +/////////////////////////////////////// +void setPageDisplay::slotToggle_Show_Last_Move( bool state ) +{ + Resource->OPTION_Show_Last_Move = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotToggle_Animate_Move +// +/////////////////////////////////////// +void setPageDisplay::slotToggle_Animate_Move( bool state ) +{ + Resource->OPTION_Animate_Moves = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slotToggle_Show_Coord +// +/////////////////////////////////////// +void setPageDisplay::slotToggle_Show_Coord( bool state ) +{ + Resource->OPTION_Show_Coord = state; + refreshBoard = TRUE; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::buildThemeList +// +/////////////////////////////////////// +void setPageDisplay::buildThemeList( void ) +{ + QString buffer; + int tmp(0); + + Current_Boards->clear(); + Current_Chessmen->clear(); + Resource->readThemeDir(); + while(1) + { + buffer = Resource->getBoard( tmp ); + if( buffer.isEmpty() ) break; + buffer.remove( 0, 2 ); + buffer.replace( QRegExp("_"), " " ); + buffer.replace( QRegExp(".tar"), "" ); + buffer.replace( QRegExp(".gz"), "" ); + buffer.replace( QRegExp(".bz2"), "" ); + Current_Boards->insertItem( buffer, tmp ); + if( Resource->getBoard() == Resource->getBoard( tmp ) ) + { + Current_Boards->setCurrentItem( tmp ); + NewBoards = tmp; + } + tmp++; + } + /* ...and for Chessmen */ + tmp = 0; + while(1) + { + buffer = Resource->getChessmen( tmp ); + if( buffer.isEmpty() ) break; + buffer.remove( 0, 2 ); + buffer.replace( QRegExp("_"), " " ); + buffer.replace( QRegExp(".tar"), "" ); + buffer.replace( QRegExp(".gz"), "" ); + buffer.replace( QRegExp(".bz2"), "" ); + Current_Chessmen->insertItem( buffer, tmp ); + if( Resource->getChessmen() == Resource->getChessmen( tmp ) ) + { + Current_Chessmen->setCurrentItem( tmp ); + NewChessmen = tmp; + } + tmp++; + } +} +/////////////////////////////////////// +// +// setPageDisplay::resetSampleConsole +// +/////////////////////////////////////// +void setPageDisplay::resetSampleConsole( void ) +{ + Resource->buildStyle(); + Console_Sample->setPaper( QBrush( Resource->COLOR_Background ) ); + Console_Sample->setText( QString( "" + i18n( "Standard" ) + "\n" ) ); + Console_Sample->append( QString( "" + i18n( "Private Tell" ) + "\n" ) ); + Console_Sample->append( QString( "" + i18n( "Channel Tell" ) + "\n" ) ); + Console_Sample->append( QString( "" + i18n( "Shout" ) + "\n" ) ); + Console_Sample->append( QString( "" + i18n( "Whisper" ) + "\n" ) ); + Console_Sample->append( QString( "" + i18n( "Notification" ) + "" ) ); +} +/////////////////////////////////////// +// +// setPageDisplay::slot_SCID_Images +// +/////////////////////////////////////// +void setPageDisplay::slot_SCID_Images( const QString& string ) +{ + Resource->SCID_Image_Path = string; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageDisplay::slot_SCID_Images_Button +// +/////////////////////////////////////// +void setPageDisplay::slot_SCID_Images_Button( void ) +{ + QString temp; + + temp = KFileDialog::getOpenFileName( QString::null, + QString( "*" ), + Tab1, + i18n( "Find Player Images File..." ) ); + if( temp.isEmpty() ) return; + EDIT_SCID_Images->setText( temp ); + Resource->SCID_Image_Path = temp; + emit enableApply(); +} + + diff --git a/knights/setpagedisplay.h b/knights/setpagedisplay.h new file mode 100644 index 0000000..d69fc59 --- /dev/null +++ b/knights/setpagedisplay.h @@ -0,0 +1,139 @@ +/*************************************************************************** + setpagedisplay.h - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef SETPAGEDISPLAY_H +#define SETPAGEDISPLAY_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ + +class setPageDisplay : public QVBoxLayout +{ + Q_OBJECT + + public: + setPageDisplay(QWidget *parent=0, resource *Rsrc=0); + ~setPageDisplay(); + void buildThemeList( void ); + int NewBoards; + int NewChessmen; + bool changeTheme; + bool refreshBoard; + bool rebuildConsole; + + public slots: + void slotCurrent_Boards( int ); + void slotCurrent_Chessmen( int ); + void slotCurrent_Theme_Size( int ); + void slotToggle_Board_Orientation( bool ); + void slotToggle_Splashscreen( bool ); + void slotToggle_Auto_Preview( bool ); + void slotToggle_Show_Last_Move( bool ); + void slotToggle_Animate_Move( bool ); + void slotToggle_Show_Coord( bool ); + void slot_SCID_Images( const QString& ); + void slot_SCID_Images_Button( void ); + + void slot_setDefault(void); + + void slot_Color_Background(void); + void slot_Color_Standard(void); + void slot_Color_PrivateTell(void); + void slot_Color_ChannelTell(void); + void slot_Color_Shout(void); + void slot_Color_Whisper(void); + void slot_Color_Notification(void); + void slot_Font_Standard(void); + void slot_Font_PrivateTell(void); + void slot_Font_ChannelTell(void); + void slot_Font_Shout(void); + void slot_Font_Whisper(void); + void slot_Font_Notification(void); + + signals: + void enableApply( void ); + + protected: + void initTab1( void ); + void initTab2( void ); + void resetSampleConsole( void ); + + private: + resource *Resource; + int margin; + + QTabWidget *TabParent; + + /* Tab 1 : General */ + QVBox *Tab1; + QHBox *BOX_Themes; + QGroupBox *GROUP_Boards; + KComboBox *Current_Boards; + QGroupBox *GROUP_Chessmen; + KComboBox *Current_Chessmen; + QGroupBox *GROUP_Theme_Size; + QLabel *Size_Min; + QSlider *Current_Theme_Size; + QLabel *Size_Max; + QGroupBox *GROUP_SCID_Images; + KLineEdit *EDIT_SCID_Images; + QPushButton *BUTTON_SCID_Images; + QGroupBox *GROUP_General_Graphics; + QCheckBox *Board_Orientation; + QCheckBox *Show_Splashscreen; + QCheckBox *Auto_Preview; + QCheckBox *Show_Last_Move; + QCheckBox *Animate_Move; + QCheckBox *Show_Coord; + + /* Tab 2 : Console */ + QFrame *Tab2; + QGridLayout *GRID_Style; + QTextView *Console_Sample; + QPushButton *Default_Button; + QPushButton *Fonts_Button_Standard; + QPushButton *Fonts_Button_PrivateTell; + QPushButton *Fonts_Button_ChannelTell; + QPushButton *Fonts_Button_Shout; + QPushButton *Fonts_Button_Whisper; + QPushButton *Fonts_Button_Notification; + QPushButton *Colors_Button_Standard; + QPushButton *Colors_Button_PrivateTell; + QPushButton *Colors_Button_ChannelTell; + QPushButton *Colors_Button_Shout; + QPushButton *Colors_Button_Whisper; + QPushButton *Colors_Button_Notification; + QPushButton *Colors_Button_Background; +}; + +#endif diff --git a/knights/setpageengines.cpp b/knights/setpageengines.cpp new file mode 100644 index 0000000..938d001 --- /dev/null +++ b/knights/setpageengines.cpp @@ -0,0 +1,362 @@ +/*************************************************************************** + setpageengines.cpp - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "setpageengines.moc" + +setPageEngines::setPageEngines(QWidget *parent, resource *Rsrc ) : QVBoxLayout(parent) +{ + Parent = parent; + Resource = Rsrc; + Engine_Dialog = NULL; + Engines_ListView = NULL; + + BOX_Current = new QHBox( parent ); + addWidget( BOX_Current ); + + /* Engines to play White */ + GROUP_White_Current = new QGroupBox( 3, + Qt::Vertical, + i18n( "Engines to Play White" ), + BOX_Current ); + + White_Use_Book = new QCheckBox( i18n( "Enable Book Engine" ), GROUP_White_Current ); + Engines_White = new KComboBox ( GROUP_White_Current ); + Engines_White_Book = new KComboBox ( GROUP_White_Current ); + Engines_White->setEditable( FALSE ); + Engines_White_Book->setEditable( FALSE ); + + /* Engines to play Black */ + GROUP_Black_Current = new QGroupBox( 3, + Qt::Vertical, + i18n( "Engines to Play Black" ), + BOX_Current ); + + Black_Use_Book = new QCheckBox( i18n( "Enable Book Engine" ), GROUP_Black_Current ); + Engines_Black = new KComboBox ( GROUP_Black_Current ); + Engines_Black_Book = new KComboBox ( GROUP_Black_Current ); + Engines_Black->setEditable( FALSE ); + Engines_Black_Book->setEditable( FALSE ); + + /* Chess Engines ListView */ + GROUP_Engines = new QGroupBox( 2, + Qt::Horizontal, + i18n( "Chess Engines" ), + parent ); + addWidget( GROUP_Engines ); + + Engines_ListView = new KListView( GROUP_Engines ); + Engines_ListView->addColumn( i18n( "Name" ) ); + Engines_ListView->addColumn( i18n( "Protocol" ) ); + Engines_ListView->addColumn( i18n( "Wins" ) ); + Engines_ListView->addColumn( i18n( "Losses" ) ); + Engines_ListView->addColumn( i18n( "Draws" ) ); + Engines_ListView->setAllColumnsShowFocus( TRUE ); + Engines_ListView->setMultiSelection( FALSE ); + Engines_ListView->setShowSortIndicator( TRUE ); + Engines_ListView->restoreLayout( kapp->config(), "Engines_ListView" ); + + Engines_ButtonBox = new KButtonBox( GROUP_Engines, Vertical ); + Engines_Button_Add = Engines_ButtonBox->addButton( i18n( "&Add..." ) ); + Engines_Button_Change = Engines_ButtonBox->addButton( i18n( "&Modify..." ) ); + Engines_Button_Delete = Engines_ButtonBox->addButton( i18n( "&Delete..." ) ); + Engines_ButtonBox->layout(); + + BuildEngineData(); + + connect( Engines_Button_Add, SIGNAL( clicked() ), this, SLOT( slotEngine_Add() ) ); + connect( Engines_Button_Change, SIGNAL( clicked() ), this, SLOT( slotEngine_Modify() ) ); + connect( Engines_Button_Delete, SIGNAL( clicked() ), this, SLOT( slotEngine_Delete() ) ); + connect( Engines_White, SIGNAL( activated(int) ), this, SLOT( slotCurrent_White(int) ) ); + connect( Engines_White_Book, SIGNAL( activated(int) ), this, SLOT( slotCurrent_White_Book(int) ) ); + connect( Engines_Black, SIGNAL( activated(int) ), this, SLOT( slotCurrent_Black(int) ) ); + connect( Engines_Black_Book, SIGNAL( activated(int) ), this, SLOT( slotCurrent_Black_Book(int) ) ); + connect( White_Use_Book, SIGNAL( toggled(bool) ), this, SLOT( slotToggle_White_Book(bool) ) ); + connect( Black_Use_Book, SIGNAL( toggled(bool) ), this, SLOT( slotToggle_Black_Book(bool) ) ); + connect( Engines_ListView, SIGNAL( selectionChanged() ), this, SLOT( selectionChanged() ) ); +} +setPageEngines::~setPageEngines() +{ + Engines_ListView->saveLayout( kapp->config(), "Engines_ListView" ); + delete Engines_ButtonBox; + delete Engines_ListView; + delete GROUP_Engines; + delete GROUP_Black_Current; + delete GROUP_White_Current; +} +/////////////////////////////////////// +// +// setPageEngines::BuildEngineData +// +/////////////////////////////////////// +void setPageEngines::BuildEngineData( void ) +{ + bool WHITE_FLAG(FALSE), + WHITE_BK_FLAG(FALSE), + BLACK_FLAG(FALSE), + BLACK_BK_FLAG(FALSE); + QStringList EngineList; + QString proto; + int Index(0); + engineList::Iterator enginesIT; + + /* Clear Comboboxes */ + Engines_White->clear(); + Engines_White_Book->clear(); + Engines_Black->clear(); + Engines_Black_Book->clear(); + Engines_ListView->clear(); + + /* Handle status of Book-engine boxes */ + White_Use_Book->setChecked( Resource->OPTION_Book_White ); + Black_Use_Book->setChecked( Resource->OPTION_Book_Black ); + Engines_White_Book->setEnabled( Resource->OPTION_Book_White ); + Engines_Black_Book->setEnabled( Resource->OPTION_Book_Black ); + + /* Read the engine list */ + if( Resource->engines.isEmpty() ) return; + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + switch( (*enginesIT).Protocol ) + { + case UCI: + proto = "UCI"; + break; + case XBoard: // Fall through + default: + proto = "XBoard"; + break; + } + (void) new QListViewItem( Engines_ListView, + (*enginesIT).Name, + proto, + QString( "%1" ).arg( (*enginesIT).Wins ), + QString( "%1" ).arg( (*enginesIT).Losses ), + QString( "%1" ).arg( (*enginesIT).Draws ) ); + EngineList.append( (*enginesIT).Name ); + } + + /* Insert engines into comboboxes */ + EngineList.sort(); + Engines_White->insertStringList( EngineList ); + Engines_Black->insertStringList( EngineList ); + Engines_White_Book->insertStringList( EngineList ); + Engines_Black_Book->insertStringList( EngineList ); + + /* Now run the list again, setting the current engine for each combobox */ + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).CurrentRef & ENGINE_WHITE_BK ) + for( Index = 0; Index < Engines_White_Book->count(); Index++ ) + if( Engines_White_Book->text(Index) == (*enginesIT).Name ) + { + Engines_White_Book->setCurrentItem(Index); + WHITE_BK_FLAG = TRUE; + } + if( (*enginesIT).CurrentRef & ENGINE_BLACK_BK ) + for( Index = 0; Index < Engines_Black_Book->count(); Index++ ) + if( Engines_Black_Book->text(Index) == (*enginesIT).Name ) + { + Engines_Black_Book->setCurrentItem(Index); + BLACK_BK_FLAG = TRUE; + } + if( (*enginesIT).CurrentRef & ENGINE_WHITE ) + for( Index = 0; Index < Engines_White->count(); Index++ ) + if( Engines_White->text(Index) == (*enginesIT).Name ) + { + Engines_White->setCurrentItem(Index); + WHITE_FLAG = TRUE; + } + if( (*enginesIT).CurrentRef & ENGINE_BLACK ) + for( Index = 0; Index < Engines_Black->count(); Index++ ) + if( Engines_Black->text(Index) == (*enginesIT).Name ) + { + Engines_Black->setCurrentItem(Index); + BLACK_FLAG = TRUE; + } + } + + /* This prevents a bug where you had to modify the current_engine_comboboxes + before you could get any engines to run. */ + if( ( !WHITE_FLAG ) && ( Engines_White->count() ) ) slotCurrent_White( Engines_White->currentItem() ); + if( ( !BLACK_FLAG ) && ( Engines_Black->count() ) ) slotCurrent_Black( Engines_Black->currentItem() ); + if( ( !WHITE_BK_FLAG ) && ( Engines_White_Book->count() ) ) slotCurrent_White_Book( Engines_White_Book->currentItem() ); + if( ( !BLACK_BK_FLAG ) && ( Engines_Black_Book->count() ) ) slotCurrent_Black_Book( Engines_Black_Book->currentItem() ); + + Engines_Button_Change->setEnabled( FALSE ); + Engines_Button_Delete->setEnabled( FALSE ); +} +/////////////////////////////////////// +// +// setPageEngines::slotEngine_Add +// +/////////////////////////////////////// +void setPageEngines::slotEngine_Add( void ) +{ + Engine_Dialog = new dlg_engine( Parent, "EngineDialog", Resource ); + connect( Engine_Dialog, SIGNAL( destroyed() ), this, SLOT( BuildEngineData() ) ); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::slotEngine_Modify +// +/////////////////////////////////////// +void setPageEngines::slotEngine_Modify( void ) +{ + QListViewItem *Item; + QList Select = Engines_ListView->selectedItems(); + + if( Select.isEmpty() ) return; + Item = Select.first(); + Engine_Dialog = new dlg_engine( Parent, "EngineDialog", Resource, Item->text(0) ); + connect( Engine_Dialog, SIGNAL( destroyed() ), this, SLOT( BuildEngineData() ) ); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::slotEngine_Delete +// +/////////////////////////////////////// +void setPageEngines::slotEngine_Delete( void ) +{ + engineList::Iterator enginesIT; + QListViewItem *Item; + QList Select = Engines_ListView->selectedItems(); + + if( Select.isEmpty() ) return; + Item = Select.first(); + + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).Name == Item->text(0) ) break; + } + Resource->engines.remove(enginesIT); + BuildEngineData(); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::slotCurrent_White +// +/////////////////////////////////////// +void setPageEngines::slotCurrent_White( int Index ) +{ + QString Name; + engineList::Iterator enginesIT; + + Name = Engines_White->text(Index); + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).CurrentRef & ENGINE_WHITE ) (*enginesIT).CurrentRef -= ENGINE_WHITE; + if( (*enginesIT).Name == Name ) (*enginesIT).CurrentRef |= ENGINE_WHITE; + } + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::slotCurrent_White_Book +// +/////////////////////////////////////// +void setPageEngines::slotCurrent_White_Book( int Index ) +{ + QString Name; + engineList::Iterator enginesIT; + + Name = Engines_White_Book->text(Index); + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).CurrentRef & ENGINE_WHITE_BK ) (*enginesIT).CurrentRef -= ENGINE_WHITE_BK; + if( (*enginesIT).Name == Name ) (*enginesIT).CurrentRef |= ENGINE_WHITE_BK; + } + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::slotCurrent_Black +// +/////////////////////////////////////// +void setPageEngines::slotCurrent_Black( int Index ) +{ + QString Name; + engineList::Iterator enginesIT; + + Name = Engines_Black->text(Index); + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).CurrentRef & ENGINE_BLACK ) (*enginesIT).CurrentRef -= ENGINE_BLACK; + if( (*enginesIT).Name == Name ) (*enginesIT).CurrentRef |= ENGINE_BLACK; + } + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::slotCurrent_Black_Book +// +/////////////////////////////////////// +void setPageEngines::slotCurrent_Black_Book( int Index ) +{ + QString Name; + engineList::Iterator enginesIT; + + Name = Engines_Black_Book->text(Index); + for ( enginesIT = Resource->engines.begin(); enginesIT != Resource->engines.end(); ++enginesIT ) + { + if( (*enginesIT).CurrentRef & ENGINE_BLACK_BK ) (*enginesIT).CurrentRef -= ENGINE_BLACK_BK; + if( (*enginesIT).Name == Name ) (*enginesIT).CurrentRef |= ENGINE_BLACK_BK; + } + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::slotToggle_White_Book +// +/////////////////////////////////////// +void setPageEngines::slotToggle_White_Book( bool state ) +{ + Resource->OPTION_Book_White = state; + BuildEngineData(); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::slotToggle_Black_Book +// +/////////////////////////////////////// +void setPageEngines::slotToggle_Black_Book( bool state ) +{ + Resource->OPTION_Book_Black = state; + BuildEngineData(); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageEngines::selectionChanged +// +/////////////////////////////////////// +void setPageEngines::selectionChanged( void ) +{ + if( Engines_ListView->selectedItem() == 0 ) + { + Engines_Button_Change->setEnabled( FALSE ); + Engines_Button_Delete->setEnabled( FALSE ); + } + else + { + Engines_Button_Change->setEnabled( TRUE ); + Engines_Button_Delete->setEnabled( TRUE ); + } +} diff --git a/knights/setpageengines.h b/knights/setpageengines.h new file mode 100644 index 0000000..130b151 --- /dev/null +++ b/knights/setpageengines.h @@ -0,0 +1,90 @@ +/*************************************************************************** + setpageengines.h - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef SETPAGEENGINES_H +#define SETPAGEENGINES_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "dlg_engine.h" + +/** + *@author Troy Corbin Jr. + */ + +class setPageEngines : public QVBoxLayout +{ + Q_OBJECT + public: + setPageEngines(QWidget *parent=0, resource *Rsrc=0); + ~setPageEngines(); + + public slots: + + void slotEngine_Add( void ); + void slotEngine_Modify( void ); + void slotEngine_Delete( void ); + + void slotCurrent_White( int ); + void slotCurrent_White_Book( int ); + void slotCurrent_Black( int ); + void slotCurrent_Black_Book( int ); + + void slotToggle_White_Book( bool ); + void slotToggle_Black_Book( bool ); + + signals: + + void enableApply( void ); + + protected slots: + void BuildEngineData( void ); + void selectionChanged( void ); + + private: + QWidget *Parent; + resource *Resource; + + QHBox *BOX_Current; + QGroupBox *GROUP_White_Current; + KComboBox *Engines_White; + QCheckBox *White_Use_Book; + KComboBox *Engines_White_Book; + QGroupBox *GROUP_Black_Current; + KComboBox *Engines_Black; + QCheckBox *Black_Use_Book; + KComboBox *Engines_Black_Book; + + QGroupBox *GROUP_Engines; + KListView *Engines_ListView; + KButtonBox *Engines_ButtonBox; + QPushButton *Engines_Button_Add; + QPushButton *Engines_Button_Change; + QPushButton *Engines_Button_Delete; + dlg_engine *Engine_Dialog; +}; + +#endif diff --git a/knights/setpagegeneral.cpp b/knights/setpagegeneral.cpp new file mode 100644 index 0000000..d79b8c9 --- /dev/null +++ b/knights/setpagegeneral.cpp @@ -0,0 +1,224 @@ +/*************************************************************************** + setpagegeneral.cpp - description + ------------------- + begin : Fri Nov 23 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include "setpagegeneral.moc" + +setPageGeneral::setPageGeneral(QWidget *parent, resource *Rsrc ) : QVBoxLayout(parent) +{ + Parent = parent; + Resource = Rsrc; + + GROUP_UserName = new QGroupBox( 1, + Qt::Horizontal, + i18n( "Your Name:" ), + parent ); + addWidget( GROUP_UserName ); + EDIT_UserName = new KLineEdit( GROUP_UserName ); + EDIT_UserName->setText( Resource->Local_Player ); + connect( EDIT_UserName, SIGNAL( textChanged(const QString&) ), this, SLOT( slot_UserName(const QString&) ) ); + + BOX_SaveInit = new QHBox( parent ); + addWidget( BOX_SaveInit ); + + GROUP_OnInit = new QButtonGroup( 3, Qt::Vertical, i18n("When Knights Begins It Should:"), BOX_SaveInit ); + BUTTON_Init_Nothing = new QRadioButton( i18n( "Do Nothing" ), GROUP_OnInit ); + BUTTON_Init_VsPC = new QRadioButton( i18n( "Start a Match vs. PC" ), GROUP_OnInit ); + BUTTON_Init_Connect = new QRadioButton( i18n( "Connect to ICS" ), GROUP_OnInit ); + GROUP_OnInit->setExclusive( TRUE ); + if( Resource->OPTION_On_Init == 0 ) GROUP_OnInit->setButton( 0 ); + else if( Resource->OPTION_On_Init == MENU_VS_PC ) GROUP_OnInit->setButton( 1 ); + else GROUP_OnInit->setButton( 2 ); + connect( GROUP_OnInit, SIGNAL( clicked(int) ), + this, SLOT( slot_Init(int) ) ); + + GROUP_AutoSave = new QButtonGroup( 3, Qt::Vertical, i18n("Save Match on Close?"), BOX_SaveInit ); + BUTTON_AutoSave_Yes = new QRadioButton( i18n( "Yes" ), GROUP_AutoSave ); + BUTTON_AutoSave_No = new QRadioButton( i18n( "No" ), GROUP_AutoSave ); + BUTTON_AutoSave_Ask = new QRadioButton( i18n( "Ask" ), GROUP_AutoSave ); + GROUP_AutoSave->setExclusive( TRUE ); + if( Resource->PromptForSaving == "Yes" ) GROUP_AutoSave->setButton( 0 ); + else if( Resource->PromptForSaving == "No" ) GROUP_AutoSave->setButton( 1 ); + else GROUP_AutoSave->setButton( 2 ); + connect( GROUP_AutoSave, SIGNAL( clicked(int) ), + this, SLOT( slot_AutoSave(int) ) ); + + GROUP_Reuse_PGN = new QGroupBox( 2, + Qt::Vertical, + i18n( "Append to Save File:" ), + parent ); + addWidget( GROUP_Reuse_PGN ); + BUTTON_Reuse_PGN = new QCheckBox( i18n( "Append to Save File" ), GROUP_Reuse_PGN ); + BUTTON_Reuse_PGN->setChecked( Resource->OPTION_Reuse_PGN ); + connect( BUTTON_Reuse_PGN, SIGNAL( toggled(bool) ), + this, SLOT( slot_Reuse_PGN(bool) ) ); + + BOX_Reuse_PGN = new QHBox( GROUP_Reuse_PGN ); + EDIT_PGN_Filename = new KLineEdit( BOX_Reuse_PGN ); + EDIT_PGN_Filename->setText( Resource->PGN_Filename ); + connect( EDIT_PGN_Filename, SIGNAL( textChanged(const QString&) ), this, SLOT( slot_PGN_Filename(const QString&) ) ); + BUTTON_PGN_Filename = new QPushButton( BOX_Reuse_PGN ); + BUTTON_PGN_Filename->setPixmap( Resource->LoadIcon( QString( "fileopen" ), KIcon::Toolbar ) ); + connect( BUTTON_PGN_Filename, SIGNAL( clicked() ), this, SLOT( slot_PGN_Filename_Button() ) ); + EDIT_PGN_Filename->setEnabled( Resource->OPTION_Reuse_PGN ); + BUTTON_PGN_Filename->setEnabled( Resource->OPTION_Reuse_PGN ); + + BUTTON_Pause_On_Minimize = new QCheckBox( i18n( "Pause on Minimize" ), parent ); + BUTTON_Pause_On_Minimize->setChecked( Resource->OPTION_Pause_On_Minimize ); + connect( BUTTON_Pause_On_Minimize, SIGNAL( toggled(bool) ), + this, SLOT( slot_Pause_On_Minimize(bool) ) ); + addWidget( BUTTON_Pause_On_Minimize ); + + BUTTON_Auto_Queen = new QCheckBox( i18n( "Always Promote to Queen" ), parent ); + BUTTON_Auto_Queen->setChecked( Resource->OPTION_Auto_Queen ); + connect( BUTTON_Auto_Queen, SIGNAL( toggled(bool) ), + this, SLOT( slot_Auto_Queen(bool) ) ); + addWidget( BUTTON_Auto_Queen ); + + BUTTON_Auto_Flag = new QCheckBox( i18n( "Call Flag Automatically" ), parent ); + BUTTON_Auto_Flag->setChecked( Resource->OPTION_Auto_Call_Flag ); + connect( BUTTON_Auto_Flag, SIGNAL( toggled(bool) ), + this, SLOT( slot_Auto_Flag(bool) ) ); + addWidget( BUTTON_Auto_Flag ); +} +setPageGeneral::~setPageGeneral() +{ +} +/////////////////////////////////////// +// +// setPageGeneral::slot_AutoSave +// +/////////////////////////////////////// +void setPageGeneral::slot_AutoSave( int state ) +{ + switch( state ) + { + case 0: + Resource->PromptForSaving = "Yes"; + break; + case 1: + Resource->PromptForSaving = "No"; + break; + case 2: + Resource->PromptForSaving = ""; + break; + } + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageGeneral::slot_Init +// +/////////////////////////////////////// +void setPageGeneral::slot_Init( int state ) +{ + switch( state ) + { + case 0: + Resource->OPTION_On_Init = 0; + break; + case 1: + Resource->OPTION_On_Init = MENU_VS_PC; + break; + case 2: + Resource->OPTION_On_Init = MENU_CONNECT; + break; + } + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageGeneral::slot_Pause_On_Minimize +// +/////////////////////////////////////// +void setPageGeneral::slot_Pause_On_Minimize( bool state ) +{ + Resource->OPTION_Pause_On_Minimize = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageGeneral::slot_Auto_Queen +// +/////////////////////////////////////// +void setPageGeneral::slot_Auto_Queen( bool state ) +{ + Resource->OPTION_Auto_Queen = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageGeneral::slot_Auto_Flag +// +/////////////////////////////////////// +void setPageGeneral::slot_Auto_Flag( bool state ) +{ + Resource->OPTION_Auto_Call_Flag = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageGeneral::slot_UserName +// +/////////////////////////////////////// +void setPageGeneral::slot_UserName( const QString& string ) +{ + Resource->Local_Player = string; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageGeneral::slot_Reuse_PGN +// +/////////////////////////////////////// +void setPageGeneral::slot_Reuse_PGN( bool state ) +{ + Resource->OPTION_Reuse_PGN = state; + EDIT_PGN_Filename->setEnabled( state ); + BUTTON_PGN_Filename->setEnabled( state ); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageGeneral::slot_PGN_Filename +// +/////////////////////////////////////// +void setPageGeneral::slot_PGN_Filename( const QString& string ) +{ + Resource->PGN_Filename = string; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageGeneral::slot_PGN_Filename_Button +// +/////////////////////////////////////// +void setPageGeneral::slot_PGN_Filename_Button( void ) +{ + QString temp; + + temp = KFileDialog::getOpenFileName( QString::null, + QString( "*" ), + BOX_Reuse_PGN, + i18n( "Find PGN..." ) ); + if( temp.isEmpty() ) return; + EDIT_PGN_Filename->setText( temp ); + Resource->PGN_Filename = temp; + emit enableApply(); +} + diff --git a/knights/setpagegeneral.h b/knights/setpagegeneral.h new file mode 100644 index 0000000..16ada66 --- /dev/null +++ b/knights/setpagegeneral.h @@ -0,0 +1,80 @@ +/*************************************************************************** + setpagegeneral.h - description + ------------------- + begin : Fri Nov 23 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef SETPAGEGENERAL_H +#define SETPAGEGENERAL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ + +class setPageGeneral : public QVBoxLayout +{ + Q_OBJECT + public: + setPageGeneral(QWidget *parent=0, resource *Rsrc=0); + ~setPageGeneral(); + signals: + void enableApply( void ); + public slots: + void slot_AutoSave( int state ); + void slot_Init( int state ); + void slot_UserName( const QString& ); + void slot_Pause_On_Minimize( bool state ); + void slot_Auto_Queen( bool state ); + void slot_Auto_Flag( bool state ); + void slot_Reuse_PGN( bool ); + void slot_PGN_Filename( const QString& ); + void slot_PGN_Filename_Button( void ); + private: + QWidget *Parent; + resource *Resource; + + QGroupBox *GROUP_UserName; + KLineEdit *EDIT_UserName; + QHBox *BOX_SaveInit; + QButtonGroup *GROUP_AutoSave; + QRadioButton *BUTTON_AutoSave_Yes; + QRadioButton *BUTTON_AutoSave_No; + QRadioButton *BUTTON_AutoSave_Ask; + QButtonGroup *GROUP_OnInit; + QRadioButton *BUTTON_Init_Nothing; + QRadioButton *BUTTON_Init_VsPC; + QRadioButton *BUTTON_Init_Connect; + QGroupBox *GROUP_Reuse_PGN; + QCheckBox *BUTTON_Reuse_PGN; + QHBox *BOX_Reuse_PGN; + KLineEdit *EDIT_PGN_Filename; + QPushButton *BUTTON_PGN_Filename; + QCheckBox *BUTTON_Pause_On_Minimize; + QCheckBox *BUTTON_Auto_Queen; + QCheckBox *BUTTON_Auto_Flag; +}; + +#endif diff --git a/knights/setpageservers.cpp b/knights/setpageservers.cpp new file mode 100644 index 0000000..8d570a1 --- /dev/null +++ b/knights/setpageservers.cpp @@ -0,0 +1,379 @@ +/*************************************************************************** + setpageservers.cpp - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "setpageservers.moc" +#include +#include + +setPageServers::setPageServers(QWidget *parent, resource *Rsrc ) : QVBoxLayout(parent) +{ + QStyle& Style = QApplication::style(); + margin = Style.defaultFrameWidth(); + Resource = Rsrc; + Servers_ListView = NULL; + resetServer = FALSE; + + TabParent = new QTabWidget( parent, "setPageDisplay" ); + initTab1(); + initTab2(); + addWidget( TabParent ); +} +setPageServers::~setPageServers() +{ + Servers_ListView->saveLayout( kapp->config(), "Servers_ListView" ); + delete Servers_ButtonBox; + delete Servers_ListView; + delete GROUP_Servers; + delete GROUP_Current; +} +/////////////////////////////////////// +// +// setPageServers::initTab1 +// +/////////////////////////////////////// +void setPageServers::initTab1( void ) +{ + Tab1 = new QVBox( TabParent ); + Tab1->setMargin( margin ); + + /* Current Server */ + GROUP_Current = new QGroupBox( 1, + Qt::Vertical, + i18n( "Current Server" ), + Tab1 ); + + Servers = new KComboBox ( GROUP_Current ); + Servers->setEditable( FALSE ); + + /* Chess Servers ListView */ + GROUP_Servers = new QGroupBox( 2, + Qt::Horizontal, + i18n( "Chess Servers" ), + Tab1 ); + + Servers_ListView = new KListView( GROUP_Servers ); + Servers_ListView->addColumn( i18n( "Name" ) ); + Servers_ListView->addColumn( i18n( "URL" ) ); + Servers_ListView->setAllColumnsShowFocus( TRUE ); + Servers_ListView->setMultiSelection( FALSE ); + Servers_ListView->setShowSortIndicator( TRUE ); + Servers_ListView->restoreLayout( kapp->config(), "Servers_ListView" ); + + Servers_ButtonBox = new KButtonBox( GROUP_Servers, Vertical ); + Servers_Button_Add = Servers_ButtonBox->addButton( i18n( "&Add..." ) ); + Servers_Button_Change = Servers_ButtonBox->addButton( i18n( "&Modify..." ) ); + Servers_Button_Delete = Servers_ButtonBox->addButton( i18n( "&Delete..." ) ); + Servers_ButtonBox->layout(); + + BuildServerData(); + + connect( Servers_Button_Add, SIGNAL( clicked() ), this, SLOT( slotServer_Add() ) ); + connect( Servers_Button_Change, SIGNAL( clicked() ), this, SLOT( slotServer_Modify() ) ); + connect( Servers_Button_Delete, SIGNAL( clicked() ), this, SLOT( slotServer_Delete() ) ); + connect( Servers, SIGNAL( activated(int) ), this, SLOT( slotCurrent(int) ) ); + connect( Servers_ListView, SIGNAL( selectionChanged() ), this, SLOT( selectionChanged() ) ); + + TabParent->addTab( Tab1, i18n("Servers") ); +} +/////////////////////////////////////// +// +// setPageServers::initTab2 +// +/////////////////////////////////////// +void setPageServers::initTab2( void ) +{ + QStringList FilterLevels; + Tab2 = new QVBox( TabParent ); + Tab2->setMargin( margin ); + + /* Current Profanity Filter */ + BOX_Profanity = new QGroupBox( 1, + Qt::Vertical, + i18n( "Profanity Filter" ), + Tab2 ); + COMBO_Profanity = new KComboBox ( BOX_Profanity ); + COMBO_Profanity->setEditable( FALSE ); + FilterLevels << i18n("Filter Everything") << i18n("Default") << "---" << "---" << "---" << i18n("No Filtering"); + COMBO_Profanity->insertStringList( FilterLevels ); + COMBO_Profanity->setCurrentItem( Resource->OPTION_Profanity ); + connect( COMBO_Profanity, SIGNAL( activated(int) ), this, SLOT( slot_Profanity(int) ) ); + + BUTTON_Auto_Close_ICS = new QCheckBox( i18n( "Automatically Close Previous ICS Match" ), Tab2 ); + BUTTON_Auto_Close_ICS->setChecked( Resource->OPTION_Auto_Close_Last_ICS ); + connect( BUTTON_Auto_Close_ICS, SIGNAL( toggled(bool) ), + this, SLOT( slot_Auto_Close_ICS(bool) ) ); + + BUTTON_Private = new QCheckBox( i18n( "Private Matches" ), Tab2 ); + BUTTON_Private->setChecked( Resource->OPTION_Private ); + connect( BUTTON_Private, SIGNAL( toggled(bool) ), this, SLOT( slot_Private(bool) ) ); + + BUTTON_Premove = new QCheckBox( i18n( "Enable Premove" ), Tab2 ); + BUTTON_Premove->setChecked( Resource->OPTION_Premove ); + connect( BUTTON_Premove, SIGNAL( toggled(bool) ), this, SLOT( slot_Premove(bool) ) ); + + BUTTON_Kibitz = new QCheckBox( i18n( "Enable Kibitzes" ), Tab2 ); + BUTTON_Kibitz->setChecked( Resource->OPTION_Kibitz ); + connect( BUTTON_Kibitz, SIGNAL( toggled(bool) ), this, SLOT( slot_Kibitz(bool) ) ); + + BUTTON_Tell = new QCheckBox( i18n( "Enable Unregistered Tells" ), Tab2 ); + BUTTON_Tell->setChecked( Resource->OPTION_Tell ); + connect( BUTTON_Tell, SIGNAL( toggled(bool) ), this, SLOT( slot_Tell(bool) ) ); + + BUTTON_Shout = new QCheckBox( i18n( "Enable Shouts" ), Tab2 ); + BUTTON_Shout->setChecked( Resource->OPTION_Shout ); + connect( BUTTON_Shout, SIGNAL( toggled(bool) ), this, SLOT( slot_Shout(bool) ) ); + + BUTTON_Seek = new QCheckBox( i18n( "Enable Seeks" ), Tab2 ); + BUTTON_Seek->setChecked( Resource->OPTION_Seek ); + connect( BUTTON_Seek, SIGNAL( toggled(bool) ), this, SLOT( slot_Seek(bool) ) ); + + BOX_SeekTimer = new QHBox( Tab2 ); + BUTTON_SeekTimer = new QSpinBox( 3, 120, 1, BOX_SeekTimer ); + BUTTON_SeekTimer->setSuffix( i18n(" sec.") ); + BUTTON_SeekTimer->setValue( Resource->Seek_Timer / 10 ); + connect( BUTTON_SeekTimer, SIGNAL( valueChanged(int) ), + this, SLOT( slot_SeekTimer(int) ) ); + LABEL_SeekTimer = new QLabel( i18n("Seconds Between Seek Updates"), BOX_SeekTimer ); + + TabParent->addTab( Tab2, i18n("Options") ); +} +/////////////////////////////////////// +// +// setPageServers::BuildServerData +// +/////////////////////////////////////// +void setPageServers::BuildServerData( void ) +{ + bool SERVER_FLAG(FALSE); + QStringList ServerList; + int Index(0); + serverList::Iterator serversIT; + + /* Clear Comboboxes */ + Servers->clear(); + Servers_ListView->clear(); + /* Read the server list */ + if( Resource->servers.isEmpty() ) return; + for ( serversIT = Resource->servers.begin(); serversIT != Resource->servers.end(); ++serversIT ) + { + (void) new QListViewItem( Servers_ListView, + (*serversIT).Name, + (*serversIT).URL ); + ServerList.append( (*serversIT).Name ); + } + /* Insert engines into comboboxes */ + ServerList.sort(); + Servers->insertStringList( ServerList ); + /* Now run the list again, setting the current engine for each combobox */ + for ( serversIT = Resource->servers.begin(); serversIT != Resource->servers.end(); ++serversIT ) + { + if( (*serversIT).CurrentRef ) + for( Index = 0; Index < Servers->count(); Index++ ) + if( Servers->text(Index) == (*serversIT).Name ) + { + Servers->setCurrentItem(Index); + SERVER_FLAG = TRUE; + } + } + /* This prevents a bug where you had to modify the current_server_combobox + before you could get any servers to run. */ + if( ( !SERVER_FLAG ) && ( Servers->count() ) ) slotCurrent( Servers->currentItem() ); + + Servers_Button_Change->setEnabled( FALSE ); + Servers_Button_Delete->setEnabled( FALSE ); +} +/////////////////////////////////////// +// +// setPageServers::slotServer_Add +// +/////////////////////////////////////// +void setPageServers::slotServer_Add( void ) +{ + Server_Dialog = new dlg_server( TabParent, "ServerDialog", Resource ); + connect( Server_Dialog, SIGNAL( destroyed() ), this, SLOT( BuildServerData() ) ); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageServers::slotServer_Modify +// +/////////////////////////////////////// +void setPageServers::slotServer_Modify( void ) +{ + QListViewItem *Item; + QList Select = Servers_ListView->selectedItems(); + + if( Select.isEmpty() ) return; + Item = Select.first(); + Server_Dialog = new dlg_server( TabParent, "ServerDialog", Resource, Item->text(0) ); + connect( Server_Dialog, SIGNAL( destroyed() ), this, SLOT( BuildServerData() ) ); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageServers::slotServer_Delete +// +/////////////////////////////////////// +void setPageServers::slotServer_Delete( void ) +{ + serverList::Iterator serversIT; + QListViewItem *Item; + QList Select = Servers_ListView->selectedItems(); + + if( Select.isEmpty() ) return; + Item = Select.first(); + + for ( serversIT = Resource->servers.begin(); serversIT != Resource->servers.end(); ++serversIT ) + { + if( (*serversIT).Name == Item->text(0) ) break; + } + Resource->servers.remove(serversIT); + BuildServerData(); + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageServers::slotCurrent +// +/////////////////////////////////////// +void setPageServers::slotCurrent( int Index ) +{ + QString Name; + serverList::Iterator serversIT; + + Name = Servers->text(Index); + for ( serversIT = Resource->servers.begin(); serversIT != Resource->servers.end(); ++serversIT ) + { + if( (*serversIT).CurrentRef ) (*serversIT).CurrentRef = FALSE; + if( (*serversIT).Name == Name ) (*serversIT).CurrentRef = TRUE; + } + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageServers::slot_Profanity +// +/////////////////////////////////////// +void setPageServers::slot_Profanity( int Index ) +{ + Resource->OPTION_Profanity = Index; + emit enableApply(); + resetServer = TRUE; +} +/////////////////////////////////////// +// +// setPageServers::slot_Premove +// +/////////////////////////////////////// +void setPageServers::slot_Premove( bool state ) +{ + Resource->OPTION_Premove = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageServers::slot_Shout +// +/////////////////////////////////////// +void setPageServers::slot_Shout( bool state ) +{ + Resource->OPTION_Shout = state; + emit enableApply(); + resetServer = TRUE; +} +/////////////////////////////////////// +// +// setPageServers::slot_Private +// +/////////////////////////////////////// +void setPageServers::slot_Private( bool state ) +{ + Resource->OPTION_Private = state; + emit enableApply(); + resetServer = TRUE; +} +/////////////////////////////////////// +// +// setPageServers::slot_Kibitz +// +/////////////////////////////////////// +void setPageServers::slot_Kibitz( bool state ) +{ + Resource->OPTION_Kibitz = state; + emit enableApply(); + resetServer = TRUE; +} +/////////////////////////////////////// +// +// setPageServers::slot_Tell +// +/////////////////////////////////////// +void setPageServers::slot_Tell( bool state ) +{ + Resource->OPTION_Tell = state; + emit enableApply(); + resetServer = TRUE; +} +/////////////////////////////////////// +// +// setPageServers::slot_Seek +// +/////////////////////////////////////// +void setPageServers::slot_Seek( bool state ) +{ + Resource->OPTION_Seek = state; + emit enableApply(); + resetServer = TRUE; +} +/////////////////////////////////////// +// +// setPageServers::slot_Auto_Close_ICS +// +/////////////////////////////////////// +void setPageServers::slot_Auto_Close_ICS( bool state ) +{ + Resource->OPTION_Auto_Close_Last_ICS = state; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageServers::slot_SeekTimer +// +/////////////////////////////////////// +void setPageServers::slot_SeekTimer( int value ) +{ + Resource->Seek_Timer = value * 10; + emit enableApply(); +} +/////////////////////////////////////// +// +// setPageServers::selectionChanged +// +/////////////////////////////////////// +void setPageServers::selectionChanged( void ) +{ + if( Servers_ListView->selectedItem() == 0 ) + { + Servers_Button_Change->setEnabled( FALSE ); + Servers_Button_Delete->setEnabled( FALSE ); + } + else + { + Servers_Button_Change->setEnabled( TRUE ); + Servers_Button_Delete->setEnabled( TRUE ); + } +} diff --git a/knights/setpageservers.h b/knights/setpageservers.h new file mode 100644 index 0000000..4f4c21c --- /dev/null +++ b/knights/setpageservers.h @@ -0,0 +1,112 @@ +/*************************************************************************** + setpageservers.h - description + ------------------- + begin : Thu Aug 16 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef SETPAGESERVERS_H +#define SETPAGESERVERS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "dlg_server.h" + +/** + *@author Troy Corbin Jr. + */ + +class setPageServers : public QVBoxLayout +{ + Q_OBJECT + public: + setPageServers(QWidget *parent=0, resource *Rsrc=0); + ~setPageServers(); + bool resetServer; + + public slots: + void slotServer_Add( void ); + void slotServer_Modify( void ); + void slotServer_Delete( void ); + + void slotCurrent( int ); + + void slot_Premove( bool ); + void slot_Private( bool ); + void slot_Profanity( int ); + void slot_Kibitz( bool ); + void slot_Tell( bool ); + void slot_Shout( bool ); + void slot_Seek( bool ); + void slot_SeekTimer( int value ); + void slot_Auto_Close_ICS( bool state ); + + signals: + void enableApply( void ); + + protected slots: + void BuildServerData( void ); + void selectionChanged( void ); + + protected: + void initTab1( void ); + void initTab2( void ); + + private: + resource *Resource; + int margin; + QTabWidget *TabParent; + + /* Tab 1 : Servers */ + QVBox *Tab1; + QGroupBox *GROUP_Current; + QGroupBox *GROUP_Servers; + KComboBox *Servers; + KListView *Servers_ListView; + KButtonBox *Servers_ButtonBox; + QPushButton *Servers_Button_Add; + QPushButton *Servers_Button_Change; + QPushButton *Servers_Button_Delete; + dlg_server *Server_Dialog; + /* Tab 2 : Options */ + QVBox *Tab2; + QGroupBox *BOX_Profanity; + KComboBox *COMBO_Profanity; + QCheckBox *BUTTON_Premove; + QCheckBox *BUTTON_Private; + QCheckBox *BUTTON_Kibitz; + QCheckBox *BUTTON_Tell; + QCheckBox *BUTTON_Shout; + QCheckBox *BUTTON_Seek; + QCheckBox *BUTTON_Auto_Close_ICS; + QHBox *BOX_SeekTimer; + QSpinBox *BUTTON_SeekTimer; + QLabel *LABEL_SeekTimer; +}; + +#endif diff --git a/knights/splash.cpp b/knights/splash.cpp new file mode 100644 index 0000000..cfccb62 --- /dev/null +++ b/knights/splash.cpp @@ -0,0 +1,40 @@ +/*************************************************************************** + splash.cpp - description + ------------------- + begin : Tue Jul 17 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "splash.moc" +#include +#include +#include +#include + +splash::splash() : + QWidget( 0, "splash", Qt::WStyle_Customize | Qt::WStyle_NoBorder ) +{ + QPixmap SplashImage( locate("data", "knights/splash.png" ) ); + setPaletteBackgroundPixmap( SplashImage ); + + QSize Hint = SplashImage.size(); + setFixedSize( Hint ); + + move( ( QApplication::desktop()->width() - Hint.width() ) / 2, + ( QApplication::desktop()->height() - Hint.height() ) / 2 ); + show(); + repaint( FALSE ); +} +splash::~splash() +{ +} diff --git a/knights/splash.h b/knights/splash.h new file mode 100644 index 0000000..93cdc6c --- /dev/null +++ b/knights/splash.h @@ -0,0 +1,35 @@ +/*************************************************************************** + splash.h - description + ------------------- + begin : Tue Jul 17 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef SPLASH_H +#define SPLASH_H + +#include + +/** + *@author Troy Corbin Jr. + */ + +class splash : public QWidget +{ + Q_OBJECT + public: + splash(); + ~splash(); +}; + +#endif diff --git a/knights/tab_pgnview.cpp b/knights/tab_pgnview.cpp new file mode 100644 index 0000000..4164f31 --- /dev/null +++ b/knights/tab_pgnview.cpp @@ -0,0 +1,160 @@ +/*************************************************************************** + tab_pgnview.cpp - description + ------------------- + begin : Sat Jan 25 2003 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "tab_pgnview.moc" +#include "tabmanager.h" +#include "resource.h" +#include "pgn.h" +#include +#include +#include +#include +#include + +tab_pgnView::tab_pgnView(pgn *parent, resource *Rsrc ) : KnightsTextView(0,Rsrc) +{ + myParent = parent; + whiteImage = NULL; + blackImage = NULL; + + QString source = locate( "appdata", "pgn_template.kml" ); + QFile file( source ); + if( file.open( IO_ReadOnly ) ) + { + QTextStream stream( &file ); + document = stream.read(); + file.close(); + } + else + { + kdWarning() << "tab_pgnView::tab_pgnView: Can not find PGN Template" << endl; + } +} + +tab_pgnView::~tab_pgnView() +{ + if( whiteImage ) + delete whiteImage; + if( blackImage ) + delete blackImage; +} +/////////////////////////////////////// +// +// tab_pgnView::init +// +/////////////////////////////////////// +void tab_pgnView::init( void ) +{ + /* Replace macros with data */ + document.replace( QRegExp( "%site%" ), myParent->TAG_Site ); + document.replace( QRegExp( "%date%" ), myParent->TAG_Date ); + document.replace( QRegExp( "%round%" ), myParent->TAG_Round ); + document.replace( QRegExp( "%result%" ), myParent->TAG_Result ); + document.replace( QRegExp( "%white%" ), myParent->TAG_White ); + document.replace( QRegExp( "%whitetitle%" ), myParent->TAG_WhiteTitle ); + document.replace( QRegExp( "%whiteelo%" ), myParent->TAG_WhiteElo ); + document.replace( QRegExp( "%whiteuscf%" ), myParent->TAG_WhiteUSCF ); + document.replace( QRegExp( "%whitena%" ), myParent->TAG_WhiteNA ); + document.replace( QRegExp( "%whitetype%" ), myParent->TAG_WhiteType ); + document.replace( QRegExp( "%black%" ), myParent->TAG_Black ); + document.replace( QRegExp( "%blacktitle%" ), myParent->TAG_BlackTitle ); + document.replace( QRegExp( "%blackelo%" ), myParent->TAG_BlackElo ); + document.replace( QRegExp( "%blackuscf%" ), myParent->TAG_BlackUSCF ); + document.replace( QRegExp( "%blackna%" ), myParent->TAG_BlackNA ); + document.replace( QRegExp( "%blacktype%" ), myParent->TAG_BlackType ); + document.replace( QRegExp( "%time%" ), myParent->TAG_Time ); + document.replace( QRegExp( "%utctime%" ), myParent->TAG_UTCTime ); + document.replace( QRegExp( "%utcdate%" ), myParent->TAG_UTCDate ); + document.replace( QRegExp( "%event%" ), myParent->TAG_Event ); + document.replace( QRegExp( "%eventdate%" ), myParent->TAG_EventDate ); + document.replace( QRegExp( "%eventsponsor"), myParent->TAG_EventSponsor ); + document.replace( QRegExp( "%section%" ), myParent->TAG_Section ); + document.replace( QRegExp( "%stage%" ), myParent->TAG_Stage ); + document.replace( QRegExp( "%board%" ), myParent->TAG_Board ); + document.replace( QRegExp( "%opening%" ), myParent->TAG_Opening ); + document.replace( QRegExp( "%variation%" ), myParent->TAG_Variation ); + document.replace( QRegExp( "%subvariation%" ), myParent->TAG_SubVariation ); + document.replace( QRegExp( "%eco%" ), myParent->TAG_ECO ); + document.replace( QRegExp( "%nic%" ), myParent->TAG_NIC ); + document.replace( QRegExp( "%timecontrol%" ), myParent->TAG_TimeControl ); + document.replace( QRegExp( "%termination%" ), myParent->TAG_Termination ); + document.replace( QRegExp( "%setup%" ), myParent->TAG_SetUp ); + document.replace( QRegExp( "%fen%" ), myParent->TAG_FEN ); + document.replace( QRegExp( "%annotator%" ), myParent->TAG_Annotator ); + document.replace( QRegExp( "%mode%" ), myParent->TAG_Mode ); + document.replace( QRegExp( "%plycount%" ), myParent->TAG_PlyCount ); + + /* Get the White Player's Image */ + QPixmap wi = myResource->loadSCIDImage( myParent->TAG_White ); + if( wi.isNull() ) + { + if( myParent->TAG_WhiteType == "program" ) + wi.load( locate("data", "knights/default-engine-portrait.jpg" ) ); + else + wi.load( locate("data", "knights/default-portrait.jpg" ) ); + } + whiteImage = new KTempFile(); + whiteImage->setAutoDelete( TRUE ); + wi.save( whiteImage->name(), "PNG" ); + document.replace( QRegExp( "%whiteimage%" ), whiteImage->name() ); + + /* Get the Black Player's Image */ + QPixmap bi = myResource->loadSCIDImage( myParent->TAG_Black ); + if( bi.isNull() ) + { + if( myParent->TAG_BlackType == "program" ) + bi.load( locate("data", "knights/default-engine-portrait.jpg" ) ); + else + bi.load( locate("data", "knights/default-portrait.jpg" ) ); + } + blackImage = new KTempFile(); + blackImage->setAutoDelete( TRUE ); + bi.save( blackImage->name(), "PNG" ); + document.replace( QRegExp( "%blackimage%" ), blackImage->name() ); + + /* Obtain the move data */ + QString moves; + QStringList *list; + if( myParent->Move_Data.isEmpty() ) + { + list = myParent->notation(2); + } + else + { + list = new QStringList( myParent->Move_Data ); + } + + /* Do some formatting and then merge the strings */ + for( QStringList::Iterator i = list->begin(); i != list->end(); i++ ) + { + (*i).replace( QRegExp( "[^\\0040-\\0176]" ), "" ); + (*i).replace( QRegExp( "\\(" ), "(" ); + (*i).replace( QRegExp( "\\)" ), ")" ); + (*i).replace( QRegExp( "\\{" ), "{" ); + (*i).replace( QRegExp( "\\}" ), "}" ); + } + moves = list->join( " " ); + delete list; + + int pos = document.find( "%moves%" ); + if( pos != -1 ) + { + document.remove( (unsigned int)pos, 7 ); + document.insert( (unsigned int)pos, moves ); + } + setText( document ); +} diff --git a/knights/tab_pgnview.h b/knights/tab_pgnview.h new file mode 100644 index 0000000..d5a9a4b --- /dev/null +++ b/knights/tab_pgnview.h @@ -0,0 +1,47 @@ +/*************************************************************************** + tab_pgnview.h - description + ------------------- + begin : Sat Jan 25 2003 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef TAB_PGNVIEW_H +#define TAB_PGNVIEW_H + +#include "knightstextview.h" +#include + +/** + *@author Troy Corbin Jr. + */ + +class resource; +class pgn; +class KTempFile; + +class tab_pgnView : public KnightsTextView +{ + Q_OBJECT + public: + tab_pgnView(pgn *parent, resource *Rsrc ); + ~tab_pgnView(); + void init( void ); + + protected: + pgn *myParent; + QString document; + KTempFile *whiteImage; + KTempFile *blackImage; +}; + +#endif diff --git a/knights/tab_seeklist.cpp b/knights/tab_seeklist.cpp new file mode 100644 index 0000000..d7554a3 --- /dev/null +++ b/knights/tab_seeklist.cpp @@ -0,0 +1,209 @@ +/*************************************************************************** + tab_seeklist.cpp - description + ------------------- + begin : Sat Sep 14 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "tab_seeklist.moc" +#include "resource.h" +#include +#include + +tab_SeekList::tab_SeekList(QWidget *parent, const char *name, resource *Rsrc ) : KListView(parent,name) +{ + myResource = Rsrc; + seek = FALSE; + addColumn( i18n( "Name" ) ); + addColumn( i18n( "Rating" ) ); + addColumn( i18n( "Match Type" ) ); + addColumn( i18n( "Is Rated?" ) ); + addColumn( i18n( "Base Time" ) ); + addColumn( i18n( "Increment" ) ); + setShowSortIndicator( TRUE ); + setAllColumnsShowFocus( TRUE ); + setMultiSelection( FALSE ); + restoreLayout( kapp->config(), "Sought_ListView" ); + + menuSeek = new KPopupMenu( this ); + menuSeek->setCheckable( TRUE ); + menuSeek->insertItem( i18n("Seek Matches"), this, SLOT( menuFunct(int) ), 0, MENU_SEEK ); + menuSeek->insertSeparator(); + menuSeek->insertItem( i18n("Accept This Match"), this, SLOT( menuFunct(int) ), 0, MENU_ACCEPT_MATCH ); + menuSeek->insertItem( i18n("Tell..."), this, SLOT( menuFunct(int) ), 0, MENU_TELL ); + menuSeek->insertItem( i18n("Assess..."), this, SLOT( menuFunct(int) ), 0, MENU_ASSESS ); + menuSeek->insertItem( i18n("Player Info"), this, SLOT( menuFunct(int) ), 0, MENU_FINGER ); + menuSeek->insertItem( QIconSet( myResource->LoadIcon( QString("history"), KIcon::Small ) ), + i18n("Player History"), this, SLOT( menuFunct(int) ), 0, MENU_HISTORY ); + menuSeek->insertSeparator(); + menuSeek->insertItem( i18n("Add to Friends"), this, SLOT( menuFunct(int) ), 0, MENU_NOTIFY ); + menuSeek->insertItem( i18n("Ignore This Player"), this, SLOT( menuFunct(int) ), 0, MENU_CENSOR ); + menuSeek->setItemChecked( MENU_SEEK, FALSE ); + + connect( this, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ), + this, SLOT( display_menuSeek( QListViewItem*, const QPoint&, int ) ) ); + connect( this, SIGNAL( executed( QListViewItem* ) ), + this, SLOT( selectMatch( QListViewItem* ) ) ); +} +tab_SeekList::~tab_SeekList() +{ +} +/////////////////////////////////////// +// +// tab_SeekList::recvCMD +// +/////////////////////////////////////// +void tab_SeekList::recvCMD( const Command& command ) +{ + switch(((Command)command).getCommand()) + { + case CMD_Add_Sought_Match: + addSoughtItem( ((Command)command).getData() ); + break; + case CMD_Show_Sought_List: + updateSoughtList(); + break; + case CMD_Hide_Sought_List: + clear(); + seek = FALSE; + break; + default: + break; + } +} +/////////////////////////////////////// +// +// tab_SeekList::updateSoughtList +// +/////////////////////////////////////// +void tab_SeekList::updateSoughtList( void ) +{ + unsigned int loop; + + clear(); + for( loop = 0; loop < SF_01.count(); loop++ ) + { + (void) new KListViewItem( this, + SF_01[loop], + SF_02[loop], + SF_03[loop], + SF_04[loop], + SF_05[loop] + i18n(" min."), + SF_06[loop] + i18n(" sec."), + SF_07[loop] ); + } + SF_01.clear(); + SF_02.clear(); + SF_03.clear(); + SF_04.clear(); + SF_05.clear(); + SF_06.clear(); + SF_07.clear(); + seek = TRUE; +} +/////////////////////////////////////// +// +// tab_SeekList::addSoughtItem +// +/////////////////////////////////////// +void tab_SeekList::addSoughtItem( const QString &src ) +{ + QStringList fields = QStringList::split( QChar(' '), src, FALSE ); + SF_01 << fields[2]; // Name + SF_02 << fields[1]; // Rating + SF_03 << fields[6]; // Match Type + SF_04 << fields[5]; // Is Rated? + SF_05 << fields[3]; // Base Time + SF_06 << fields[4]; // Increment + SF_07 << fields[0]; // ID# +} +/////////////////////////////////////// +// +// tab_SeekList::display_menuSeek +// +/////////////////////////////////////// +void tab_SeekList::display_menuSeek( QListViewItem *Item, const QPoint &Pos, int ) +{ + bool enable; + if( Item != NULL ) + { + setSelected( Item, TRUE ); + selectedPlayerName = Item->text(0).replace( QRegExp("\\(.+\\)"), QString("") ); + selectedMatchID = Item->text(6).toInt(); + enable = TRUE; + } + else + { + enable = FALSE; + } + menuSeek->setItemChecked( MENU_SEEK, seek ); + menuSeek->setItemEnabled( MENU_FINGER, enable ); + menuSeek->setItemEnabled( MENU_TELL, enable ); + menuSeek->setItemEnabled( MENU_NOTIFY, enable ); + menuSeek->setItemEnabled( MENU_CENSOR, enable ); + menuSeek->setItemEnabled( MENU_HISTORY, enable ); + menuSeek->setItemEnabled( MENU_ACCEPT_MATCH, enable ); + menuSeek->setItemEnabled( MENU_ASSESS, enable ); + menuSeek->popup( Pos ); +} +/////////////////////////////////////// +// +// tab_SeekList::selectMatch +// +/////////////////////////////////////// +void tab_SeekList::selectMatch( int matchID ) +{ + if( matchID ) + emit sendCMD( Command( 0, CMD_Start_Match, QString::number( matchID ) ) ); +} +void tab_SeekList::selectMatch( QListViewItem *Item ) +{ + selectMatch( Item->text(6).toInt() ); +} +/////////////////////////////////////// +// +// tab_SeekList::menuFunct +// +/////////////////////////////////////// +void tab_SeekList::menuFunct( int funct ) +{ + switch( funct ) + { + case MENU_SEEK: + emit sendCMD( Command( 0, CMD_Toggle_Seek ) ); + break; + case MENU_FINGER: + emit sendCMD( Command( 0, CMD_Player_Finger, selectedPlayerName ) ); + break; + case MENU_TELL: + emit sendCMD( Command( 0, CMD_Set_Input, QString( "tell %1 " ).arg( selectedPlayerName ) ) ); + break; + case MENU_NOTIFY: + emit sendCMD( Command( 0, CMD_Add_Friend, selectedPlayerName ) ); + break; + case MENU_CENSOR: + emit sendCMD( Command( 0, CMD_Ignore_Player, selectedPlayerName ) ); + break; + case MENU_HISTORY: + emit sendCMD( Command( 0, CMD_Player_History, selectedPlayerName ) ); + break; + case MENU_ACCEPT_MATCH: + emit sendCMD( Command( 0, CMD_Start_Match, QString::number( selectedMatchID ) ) ); + break; + case MENU_ASSESS: + emit sendCMD( Command( 0, CMD_Assess, selectedPlayerName ) ); + break; + default: + break; + } +} diff --git a/knights/tab_seeklist.h b/knights/tab_seeklist.h new file mode 100644 index 0000000..9796130 --- /dev/null +++ b/knights/tab_seeklist.h @@ -0,0 +1,75 @@ +/*************************************************************************** + tab_seeklist.h - description + ------------------- + begin : Sat Sep 14 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef TAB_SEEKLIST_H +#define TAB_SEEKLIST_H + +#include +#include +#include +#include +#include "command.h" + +/** + *@author Troy Corbin Jr. + */ + +class resource; + +class tab_SeekList : public KListView +{ + Q_OBJECT + + private: + resource *myResource; + KPopupMenu *menuSeek; + bool seek; + int selectedMatchID; + QString selectedPlayerName; + /* + These StringLists temporarily store Sought Game data + until all ads have been displayed. + */ + QStringList SF_01; + QStringList SF_02; + QStringList SF_03; + QStringList SF_04; + QStringList SF_05; + QStringList SF_06; + QStringList SF_07; + + public: + tab_SeekList(QWidget *parent=0, const char *name=0, resource *Rsrc=0); + ~tab_SeekList(); + + public slots: + void recvCMD( const Command& ); + void display_menuSeek( QListViewItem*, const QPoint&, int ); + void selectMatch( QListViewItem *Item ); + void selectMatch( int ); + void menuFunct( int ); + + signals: + void sendCMD( const Command& ); + + protected: + void addSoughtItem( const QString& ); + void updateSoughtList( void ); + +}; + +#endif diff --git a/knights/tabbox.cpp b/knights/tabbox.cpp new file mode 100644 index 0000000..bc8baed --- /dev/null +++ b/knights/tabbox.cpp @@ -0,0 +1,208 @@ +/*************************************************************************** + tabbox.cpp - description + ------------------- + begin : Fri Sep 13 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "tabbox.moc" +#include "tabpage.h" +#include "resource.h" +#include "accel.h" +#include +#include +#include + +TabBox::TabBox( resource *rsrc ) : QVBox(0,"TabBox",Qt::WDestructiveClose) +{ + myResource = rsrc; + setMargin( QApplication::style().defaultFrameWidth() ); + + myTabs = new QTabWidget( this, "myTabs" ); + myTabs->setTabShape( QTabWidget::Rounded ); + myTabs->setTabPosition( QTabWidget::Top ); + + myAccel = new Accel( this, myResource->myAccel ); + + connect( myTabs, SIGNAL( currentChanged( QWidget* ) ), this, SLOT( changeMyCaption( QWidget* ) ) ); + connect( this, SIGNAL( focus( const QChar& ) ), myResource->myAccel, SIGNAL( focus( const QChar& ) ) ); +} +TabBox::~TabBox() +{ + while( myTabs->count() ) + { + removeTab( myTabs->page(0), TRUE ); + } + delete myAccel; +} +/////////////////////////////////////// +// +// TabBox::keyPressEvent +// +/////////////////////////////////////// +void TabBox::keyPressEvent( QKeyEvent *e ) +{ + QChar input; + + if( ( e->state() | Qt::ShiftButton ) == Qt::ShiftButton ) + { + input = e->text().at(0); + if( input.isLetterOrNumber() ) + { + emit focus( input ); + e->accept(); + return; + } + } + e->ignore(); +} +/////////////////////////////////////// +// +// TabBox::addTab +// +/////////////////////////////////////// +void TabBox::addTab( QWidget *child, const QString &caption ) +{ + if( QString( child->className() ) == "TabPage" ) + { + myTabs->addTab( child, caption ); + myTabs->showPage( child ); + changeMyCaption( child ); + connect( child, SIGNAL( newParent( TabBox* ) ), this, SIGNAL( newTabBox( TabBox* ) ) ); + connect( child, SIGNAL( requestDestruction() ), this, SLOT( destroyChild() ) ); + } + else + { + TabPage *newPage = new TabPage( (QWidget*)this, child, myResource ); + newPage->setCaption( caption ); + + myTabs->addTab( newPage, caption ); + myTabs->showPage( newPage ); + changeMyCaption( newPage ); + connect( newPage, SIGNAL( newParent( TabBox* ) ), this, SIGNAL( newTabBox( TabBox* ) ) ); + connect( newPage, SIGNAL( requestDestruction() ), this, SLOT( destroyChild() ) ); + } +} +/////////////////////////////////////// +// +// TabBox::removeTab +// +/////////////////////////////////////// +void TabBox::removeTab( QWidget *child, bool deleteChild ) +{ + if( QString( child->className() ) == "TabPage" ) + { + emit saveTabGeometry( QString( ((TabPage*)child)->getChild()->className() ), size() ); + myTabs->removePage( child ); + } + else + { + emit saveTabGeometry( QString( child->className() ), size() ); + myTabs->removePage( child->parentWidget() ); + } + + /* Delete it if requested */ + if( deleteChild ) + { + delete child; + } +} +/////////////////////////////////////// +// +// TabBox::showTab +// +/////////////////////////////////////// +void TabBox::showTab( QWidget *child ) +{ + if( isChild( child ) ) + myTabs->showPage( child->parentWidget() ); +} +/////////////////////////////////////// +// +// TabBox::destroyChild +// +/////////////////////////////////////// +void TabBox::destroyChild( void ) +{ + QObject *child = ((QObject*)sender()); + + /* Be careful... make sure we have a valid child calling us */ + if( child == NULL ) + return; + if( !child->isWidgetType() ) + return; + if( !isChild( ((QWidget*)child) ) ) + return; + + /* Nuke it */ + removeTab( ((QWidget*)child), TRUE ); + + if( count() == 0 ) + { + /* TabManager will be notified of the delete via QObject::destroyed(QObject*) */ + delete this; + } +} +/////////////////////////////////////// +// +// TabBox::changeMyCaption +// +/////////////////////////////////////// +void TabBox::changeMyCaption( QWidget *child ) +{ + setCaption( i18n("%1 - Knights").arg( myTabs->tabLabel( child ) ) ); +} +/////////////////////////////////////// +// +// TabBox::count +// +/////////////////////////////////////// +int TabBox::count( void ) +{ + return myTabs->count(); +} +/////////////////////////////////////// +// +// TabBox::isChild +// +/////////////////////////////////////// +bool TabBox::isChild( QWidget *child ) +{ + for( int tmp=0; tmp < myTabs->count(); tmp++ ) + { + if( myTabs->page(tmp) == child ) + return TRUE; + if( ((TabPage*)myTabs->page(tmp))->getChild() == child ) + return TRUE; + } + return FALSE; +} +/////////////////////////////////////// +// +// TabBox::changeCaption +// +/////////////////////////////////////// +void TabBox::changeCaption( QWidget *child, const QString &caption ) +{ + if( QString( child->className() ) == "TabPage" ) + { + ((TabPage*)child)->setCaption( caption ); + myTabs->setTabLabel( child, caption ); + } + else if( isChild( child ) ) + { + ((TabPage*)child->parentWidget())->setCaption( caption ); + myTabs->setTabLabel( child->parentWidget(), caption ); + } + changeMyCaption( myTabs->currentPage() ); +} diff --git a/knights/tabbox.h b/knights/tabbox.h new file mode 100644 index 0000000..0f3cffb --- /dev/null +++ b/knights/tabbox.h @@ -0,0 +1,65 @@ +/*************************************************************************** + tabbox.h - description + ------------------- + begin : Fri Sep 13 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef TABBOX_H +#define TABBOX_H + +#include +#include "accel.h" + +class QTabWidget; +class resource; + +/** + *@author Troy Corbin Jr. + */ + +class TabBox : public QVBox +{ + Q_OBJECT + public: + TabBox( resource *rsrc=0 ); + virtual ~TabBox(); + void keyPressEvent( QKeyEvent* ); + void addTab( QWidget *child, const QString &caption ); + void removeTab( QWidget *child, bool deleteChild=FALSE ); + bool isChild( QWidget *child ); + void showTab( QWidget *child ); + void changeCaption( QWidget *child, const QString &caption ); + int count( void ); + + signals: + void newTabBox( TabBox* ); + void saveTabGeometry( const QString&, const QSize& ); + void focus( const QChar& ); + + protected slots: + void changeMyCaption( QWidget *child ); + + /** + This removes and deletes a Tab if it's a child of this widget. + Never call this directly; Only with a Signal! + */ + void destroyChild( void ); + + private: + QTabWidget *myTabs; + Accel *myAccel; + resource *myResource; +}; + +#endif diff --git a/knights/tabgrip.cpp b/knights/tabgrip.cpp new file mode 100644 index 0000000..563dd8f --- /dev/null +++ b/knights/tabgrip.cpp @@ -0,0 +1,109 @@ +/*************************************************************************** + tabgrip.cpp - description + ------------------- + begin : Fri Sep 13 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "tabgrip.moc" +#include "resource.h" +#include + +TabGrip::TabGrip(QWidget *parent, const char *name ) : QWidget(parent,name) +{ + setMaximumSize( 3200, 12 ); + setMinimumSize( 32, 12 ); + + isDragging = FALSE; + couldDrag = FALSE; + + setCursor( Qt::SizeAllCursor ); + + show(); +} +TabGrip::~TabGrip() +{ +} +/////////////////////////////////////// +// +// TabGrip::paintEvent +// +/////////////////////////////////////// +void TabGrip::paintEvent( QPaintEvent* ) +{ + QPainter paint( this ); + QColorGroup group( colorGroup() ); + paint.setPen( group.light() ); + paint.drawLine( 2, 2, width() - 3, 2 ); + paint.drawLine( 2, 5, width() - 3, 5 ); + paint.drawLine( 2, 8, width() - 3, 8 ); + paint.setPen( group.dark() ); + paint.drawLine( 2, 3, width() - 3, 3 ); + paint.drawLine( 2, 6, width() - 3, 6 ); + paint.drawLine( 2, 9, width() - 3, 9 ); +} +/////////////////////////////////////// +// +// TabGrip::mousePressEvent +// +/////////////////////////////////////// +void TabGrip::mousePressEvent( QMouseEvent *event ) +{ + event->accept(); + if(event->button() == Qt::LeftButton) + { + couldDrag = TRUE; + offset = mapToGlobal( event->pos() ); + offset.setX( topLevelWidget()->x() - offset.x() ); + offset.setY( topLevelWidget()->y() - offset.y() ); + } +} +/////////////////////////////////////// +// +// TabGrip::mouseMoveEvent +// +/////////////////////////////////////// +void TabGrip::mouseMoveEvent( QMouseEvent *event ) +{ + /* + By default, MouseMoveEvent is never called unless the user has + a button held down, so this should only be called if we're dragging. + */ + event->accept(); + if( couldDrag == TRUE ) + { + /* Dragging Page */ + isDragging = TRUE; + couldDrag = FALSE; + QApplication::setOverrideCursor( Qt::SizeAllCursor ); + } +} +/////////////////////////////////////// +// +// TabGrip::mouseReleaseEvent +// +/////////////////////////////////////// +void TabGrip::mouseReleaseEvent( QMouseEvent *event ) +{ + event->accept(); + if(event->button() == Qt::LeftButton) + { + couldDrag = FALSE; + if( isDragging ) + { + QApplication::restoreOverrideCursor(); + isDragging = FALSE; + emit wasDragged( event->globalPos(), offset ); + } + } +} diff --git a/knights/tabgrip.h b/knights/tabgrip.h new file mode 100644 index 0000000..a568a2e --- /dev/null +++ b/knights/tabgrip.h @@ -0,0 +1,47 @@ +/*************************************************************************** + tabgrip.h - description + ------------------- + begin : Fri Sep 13 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef TABGRIP_H +#define TABGRIP_H + +#include + +/** + *@author Troy Corbin Jr. + */ + +class TabGrip : public QWidget +{ + Q_OBJECT + public: + TabGrip(QWidget *parent=0, const char *name=0); + ~TabGrip(); + void paintEvent( QPaintEvent* ); + void mouseMoveEvent( QMouseEvent *event ); + void mousePressEvent( QMouseEvent *event ); + void mouseReleaseEvent( QMouseEvent *event ); + + signals: + void wasDragged( const QPoint&, const QPoint& ); + + private: + bool isDragging; + bool couldDrag; + QPoint offset; +}; + +#endif diff --git a/knights/tabmanager.cpp b/knights/tabmanager.cpp new file mode 100644 index 0000000..f2d72fc --- /dev/null +++ b/knights/tabmanager.cpp @@ -0,0 +1,202 @@ +/*************************************************************************** + tabmanager.cpp - description + ------------------- + begin : Sat Sep 14 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "tabmanager.moc" +#include "resource.h" +#include + +static QString myConfigGroup( "TabManager" ); + +TabManager::TabManager( resource *rsrc ) : QObject() +{ + myResource = rsrc; + appConfig = kapp->config(); +} + +TabManager::~TabManager() +{ +} + +/////////////////////////////////////// +// +// TabManager::addTab +// +/////////////////////////////////////// +void TabManager::addTab( QWidget *child, const QString &caption ) +{ + TabBox *boxPtr; + + if( myList.count() == 0 ) + { + /* First Tab always generates a new TabBox */ + boxPtr = new TabBox( myResource ); + manageNewBox( boxPtr ); + boxPtr->addTab( child, caption ); + + /* Get Geometry from Saved Config */ + appConfig->setGroup( myConfigGroup ); + QSize defaultSize( 420, 360 ); + QSize newSize = appConfig->readSizeEntry( QString( child->className() ), &defaultSize ); + boxPtr->resize( newSize ); + boxPtr->show(); + } + else + { + boxPtr = myList.at(0); + boxPtr->addTab( child, caption ); + } +} +/////////////////////////////////////// +// +// TabManager::changeCaption +// +/////////////////////////////////////// +void TabManager::changeCaption( QWidget *child, const QString &caption ) +{ + TabBox *boxPtr = getParentBox( child ); + + if( boxPtr != NULL ) + { + boxPtr->changeCaption( child, caption ); + } +} +/////////////////////////////////////// +// +// TabManager::removeTab +// +/////////////////////////////////////// +void TabManager::removeTab( QObject *child ) +{ + /* Make sure this is a QWidget we can manipulate */ + if( !child->isWidgetType() ) + { + kdError() << "TabManager::removeTab: Can not remove non-widget class " << child->className() << endl; + return; + } + + if( myList.find( ((TabBox*)child) ) != -1 ) + { + /* Remove Child Directly */ + myList.remove( ((TabBox*)child) ); + return; + } + + QString childName( ((QWidget*)child)->className() ); + TabBox *boxPtr = getParentBox( ((QWidget*)child) ); + + /* Remove this Child's Parent, the TabPage */ + if( boxPtr != NULL ) + { + kdDebug() << "Removing child: " << childName << endl; + boxPtr->removeTab( ((QWidget*)child), TRUE ); + if( boxPtr->count() == 0 ) + { + myList.remove( boxPtr ); + delete boxPtr; + } + return; + } + kdWarning() << "Could not find child: " << childName << endl; +} +/////////////////////////////////////// +// +// TabManager::showTab +// +/////////////////////////////////////// +void TabManager::showTab( QWidget *child ) +{ + TabBox *boxPtr = getParentBox( child ); + if( boxPtr != NULL ) + { + boxPtr->showTab( child ); + } +} +/////////////////////////////////////// +// +// TabManager::isTab +// +/////////////////////////////////////// +bool TabManager::isTab( QWidget *child ) +{ + if( getParentBox( child ) == NULL ) + { + return FALSE; + } + return TRUE; +} +/////////////////////////////////////// +// +// TabManager::saveTabGeometry +// +/////////////////////////////////////// +void TabManager::saveTabGeometry( const QString &childName, const QSize &childSize ) +{ + /* Save This Widget's Size For Later */ + appConfig->setGroup( myConfigGroup ); + appConfig->writeEntry( childName, childSize ); + appConfig->sync(); + + kdDebug() << "Saved geometry for Widget: " << childName << endl; +} +/////////////////////////////////////// +// +// TabManager::childEvent +// +/////////////////////////////////////// +void TabManager::childEvent( QChildEvent *event ) +{ + if( event->inserted() ) + { + /* New Child */ + if( QString( event->child()->className() ) == "TabBox" ) + { + manageNewBox( ((TabBox*)event->child()) ); + return; + } + addTab( ((QWidget*)event->child()), QString( "Untitled" ) ); + } +} +/////////////////////////////////////// +// +// TabManager::manageNewBox +// +/////////////////////////////////////// +void TabManager::manageNewBox( TabBox *newBox ) +{ + myList.append( newBox ); + connect( newBox, SIGNAL( destroyed( QObject* ) ), this, SLOT( removeTab( QObject* ) ) ); + connect( newBox, SIGNAL( saveTabGeometry( const QString&, const QSize& ) ), this, SLOT( saveTabGeometry( const QString&, const QSize& ) ) ); + connect( newBox, SIGNAL( newTabBox( TabBox* ) ), this, SLOT( manageNewBox( TabBox* ) ) ); +} +/////////////////////////////////////// +// +// TabManager::getParentBox +// +/////////////////////////////////////// +TabBox* TabManager::getParentBox( QWidget *child ) +{ + TabBox *boxPtr; + for( unsigned int index=0; index < myList.count(); index++ ) + { + boxPtr = myList.at(index); + if( boxPtr->isChild( child ) ) + { + return boxPtr; + } + } + return NULL; +} diff --git a/knights/tabmanager.h b/knights/tabmanager.h new file mode 100644 index 0000000..78ae9ac --- /dev/null +++ b/knights/tabmanager.h @@ -0,0 +1,62 @@ +/*************************************************************************** + tabmanager.h - description + ------------------- + begin : Sat Sep 14 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef TABMANAGER_H +#define TABMANAGER_H + +#include +#include +#include +#include +#include "tabbox.h" + +/** + *@author Troy Corbin Jr. + */ + +typedef QPtrList TabBoxList; +class resource; + +class TabManager : public QObject +{ + Q_OBJECT + public: + TabManager( resource *rsrc ); + ~TabManager(); + void addTab( QWidget *child, const QString &caption ); + void childEvent( QChildEvent *event ); + void changeCaption( QWidget *child, const QString &caption ); + void showTab( QWidget *child ); + bool isTab( QWidget *child ); + + public slots: + void removeTab( QObject *child ); + + protected slots: + void manageNewBox( TabBox *newBox ); + void saveTabGeometry( const QString&, const QSize& ); + + protected: + TabBox* getParentBox( QWidget* ); + + private: + TabBoxList myList; + KConfig *appConfig; + resource *myResource; +}; + +#endif diff --git a/knights/tabpage.cpp b/knights/tabpage.cpp new file mode 100644 index 0000000..863e34d --- /dev/null +++ b/knights/tabpage.cpp @@ -0,0 +1,164 @@ +/*************************************************************************** + tabpage.cpp - description + ------------------- + begin : Fri Sep 13 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "tabpage.moc" +#include "tabmanager.h" +#include "tabgrip.h" +#include "resource.h" +#include +#include +#include +#include +#include + +/////////////////////////////////////// +// +// TabPage::constructor +// +/////////////////////////////////////// +TabPage::TabPage( QWidget *parent, QWidget *child, resource *rsrc ) : QVBox(parent) +{ + myResource = rsrc; + myChild = child; + + actionBar = new QHBox( this ); + actionBar->show(); + + grip = new TabGrip( actionBar ); + connect( grip, SIGNAL( wasDragged(const QPoint&, const QPoint&) ), this, SLOT( tabDragged(const QPoint&, const QPoint&) ) ); + + KIconLoader icons( QString( "knights" ) ); + QPixmap map = icons.loadIcon( QString("tab_remove"), KIcon::Small, 0, KIcon::DefaultState, 0, TRUE ); + if( map.isNull() ) + { + /* Keep for backward compatability with KDE 3.0 */ + map = icons.loadIcon( QString("fileclose"), KIcon::Small ); + } + + closeButton = new QToolButton( actionBar, "closeButton" ); + closeButton->setIconSet( QIconSet( map ) ); + closeButton->setAutoRaise( TRUE ); + closeButton->setTextLabel( i18n( "Close This Tab" ), TRUE ); + closeButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); + connect( closeButton, SIGNAL( clicked() ), this, SIGNAL( requestDestruction() ) ); + + myChild->reparent( this, QPoint( 0, 0 ), TRUE ); + myChild->show(); + show(); +} +/////////////////////////////////////// +// +// TabPage::destructor +// +/////////////////////////////////////// +TabPage::~TabPage() +{ +} +/////////////////////////////////////// +// +// TabPage::tabDragged +// +/////////////////////////////////////// +void TabPage::tabDragged( const QPoint &dest, const QPoint &offset ) +{ + TabBox *myParent = parentTabBox(); + if( myParent != NULL ) + { + QWidget *destWidget = QApplication::widgetAt( dest, TRUE ); + /* Find a TabBox */ + while(1) + { + if( destWidget == NULL ) + { + /* Create new TabBox */ + TabBox *newBox = new TabBox( myResource ); + newBox->resize( myParent->size() ); + newBox->move( dest + offset ); + newBox->show(); + emit newParent( newBox ); + myParent->removeTab( this ); + newBox->addTab( this, myCaption ); + break; + } + if( QString( destWidget->className() ) == "TabBox" ) + { + if( myParent != ((TabBox*)destWidget) ) + { + /* We can latch on here */ + myParent->removeTab( this ); + ((TabBox*)destWidget)->addTab( this, myCaption ); + break; + } + else + { + break; + } + } + destWidget = destWidget->parentWidget(); + } + if( myParent->count() == 0 ) + { + /* TabManager will be notified of the delete via QObject::destroyed(QObject*) */ + delete myParent; + } + } + else + { + kdError() << "TabPage::tabDragged: Can not move without a parent TabBox." << endl; + } +} +/////////////////////////////////////// +// +// TabPage::setCaption +// +/////////////////////////////////////// +void TabPage::setCaption( const QString &caption ) +{ + myCaption = caption; +} +/////////////////////////////////////// +// +// TabPage::parentTabBox +// +/////////////////////////////////////// +TabBox* TabPage::parentTabBox( void ) +{ + QWidget *myParent = this->parentWidget(); + if( QString( myParent->className() ) == "QWidgetStack" ) + { + myParent = myParent->parentWidget(); + if( QString( myParent->className() ) == "QTabWidget" ) + { + myParent = myParent->parentWidget(); + if( QString( myParent->className() ) == "TabBox" ) + { + return ((TabBox*)myParent); + } + } + } + return NULL; +} +/////////////////////////////////////// +// +// TabPage::getChild +// +/////////////////////////////////////// +QWidget* TabPage::getChild( void ) +{ + return myChild; +} + diff --git a/knights/tabpage.h b/knights/tabpage.h new file mode 100644 index 0000000..d5aeb28 --- /dev/null +++ b/knights/tabpage.h @@ -0,0 +1,64 @@ +/*************************************************************************** + tabpage.h - description + ------------------- + begin : Fri Sep 13 2002 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sf.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef TABPAGE_H +#define TABPAGE_H + +#include +#include +#include +#include +#include +#include "tabbox.h" + +/** + *@author Troy Corbin Jr. + */ +class resource; +class QToolButton; +class TabGrip; + +class TabPage : public QVBox +{ + Q_OBJECT + public: + TabPage( QWidget *parent, QWidget *child, resource *rsrc ); + ~TabPage(); + void setCaption( const QString& ); + QWidget* getChild( void ); + + protected slots: + void tabDragged( const QPoint&, const QPoint& ); + + signals: + void newParent( TabBox* ); + void requestDestruction( void ); + + protected: + TabBox* parentTabBox( void ); + + private: + QString myCaption; + QHBox *actionBar; + TabGrip *grip; + QToolButton *closeButton; + + QWidget *myChild; + resource *myResource; +}; + +#endif diff --git a/knights/thinbuttons.cpp b/knights/thinbuttons.cpp new file mode 100644 index 0000000..ed97ba5 --- /dev/null +++ b/knights/thinbuttons.cpp @@ -0,0 +1,262 @@ +/*************************************************************************** + thinbuttons.cpp - description + ------------------- + begin : Tue Nov 13 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "thinbuttons.moc" +#include +#include +#include + +thinbuttons::thinbuttons(QWidget *parent, const char *name, resource *Rsrc ) : QFrame(parent,name) +{ + Resource = Rsrc; + rightClickID = 0; + setFixedSize( 8, 8 ); + + /* Build the pop-up menu */ + matchMenu = new KPopupMenu( this ); + matchMenu->insertItem( QIconSet( Resource->LoadIcon( QString("filesave"), KIcon::Small ) ), + i18n("&Save Match"), MENU_SAVE ); + matchMenu->insertItem( QIconSet( Resource->LoadIcon( QString("filesave"), KIcon::Small ) ), + i18n("Save Match &As..."), MENU_SAVEAS ); + matchMenu->insertSeparator(); + matchMenu->insertItem( QIconSet( Resource->LoadIcon( QString("fileprint"), KIcon::Small ) ), + i18n("&Print Notation..."), MENU_PRINT ); + matchMenu->insertSeparator(); + matchMenu->insertItem( QIconSet( Resource->LoadIcon( QString("fileclose"), KIcon::Small ) ), + i18n("&Close Match"), MENU_CLOSE ); + connect( matchMenu, SIGNAL( activated(int) ), this, SLOT( menuClicked(int) ) ); +} +thinbuttons::~thinbuttons() +{ +} +/////////////////////////////////////// +// +// thinbuttons::childEvent +// +/////////////////////////////////////// +void thinbuttons::childEvent( QChildEvent * cev ) +{ + /* Make sure this method only effects child buttons */ + if( QString( cev->child()->name() ) != QString( "MatchSelector" ) ) + return; + if( cev->removed() ) + remove( (QButton*)cev->child() ); +} +/////////////////////////////////////// +// +// thinbuttons::create +// +/////////////////////////////////////// +QButton* thinbuttons::create( int id ) +{ + Buttons *newBut; + QPushButton *newButton; + + newButton = new QPushButton( this, "MatchSelector" ); + + newBut = new Buttons; + newBut->button = newButton; + newBut->ID = id; + buttons.append( newBut ); + + newButton->setToggleButton( TRUE ); + newButton->setText( QString("Match") ); + newButton->show(); + + connect( newButton, SIGNAL( clicked() ), this, SLOT( buttonClicked() ) ); + return newButton; +} +/////////////////////////////////////// +// +// thinbuttons::setButton +// +/////////////////////////////////////// +void thinbuttons::setButton( int id ) +{ + Buttons *currentBut; + unsigned int Index; + + for( Index = 0; Index < buttons.count(); Index++ ) + { + currentBut = buttons.at( Index ); + if( currentBut->ID == id ) + { + currentBut->button->setDown( TRUE ); + if( currentBut->button->isToggleButton() ) + if( currentBut->button->state() != QButton::On ) + currentBut->button->toggle(); + } + else + { + currentBut->button->setDown( FALSE ); + if( currentBut->button->isToggleButton() ) + if( currentBut->button->state() == QButton::On ) + currentBut->button->toggle(); + } + } +} +/////////////////////////////////////// +// +// thinbuttons::find +// +/////////////////////////////////////// +QButton* thinbuttons::find( int id ) +{ + unsigned int tmp; + + for( tmp = 0; tmp < buttons.count(); tmp++ ) + if( buttons.at( tmp )->ID == id ) + return buttons.at( tmp )->button; + return NULL; +} +/////////////////////////////////////// +// +// thinbuttons::id +// +/////////////////////////////////////// +int thinbuttons::id( QButton* button ) +{ + unsigned int tmp; + + for( tmp = 0; tmp < buttons.count(); tmp++ ) + if( buttons.at( tmp )->button == button ) + return buttons.at( tmp )->ID; + return -1; +} +/////////////////////////////////////// +// +// thinbuttons::remove +// +/////////////////////////////////////// +void thinbuttons::remove( QButton* button ) +{ + unsigned int tmp; + + for( tmp = 0; tmp < buttons.count(); tmp++ ) + if( buttons.at( tmp )->button == button ) + { + disconnect( buttons.at( tmp )->button, SIGNAL( clicked() ), this, SLOT( buttonClicked() ) ); + buttons.remove( tmp ); + } +} +void thinbuttons::remove( const int &id ) +{ + QButton *butt; + + butt = find(id); + if( butt != NULL ) + { + remove( butt ); + delete butt; + } +} +/////////////////////////////////////// +// +// thinbuttons::buttonClicked +// +/////////////////////////////////////// +void thinbuttons::buttonClicked( void ) +{ + const QObject *incomming; + int Clicked; + unsigned int tmp; + + incomming = sender(); + for( tmp = 0; tmp < buttons.count(); tmp++ ) + if( buttons.at( tmp )->button == ( const QButton* )incomming ) + { + Clicked = buttons.at( tmp )->ID; + if( Clicked == Null ) return; + setButton( Clicked ); + emit leftClick( Clicked ); + } +} +/////////////////////////////////////// +// +// thinbuttons::resize +// +/////////////////////////////////////// +void thinbuttons::resize( const int Width ) +{ + Buttons *button; + QStyle& Style = QApplication::style(); + int margin; + unsigned int Index; + + margin = Style.defaultFrameWidth(); + if( buttons.count() != 0 ) buttWidth = ( Width / buttons.count() ) - ( margin * 2 ); + else buttWidth = 0; + setFixedSize( Width, Resource->Widget_Height + margin ); + for( Index = 0; Index < buttons.count(); Index++ ) + { + button = buttons.at( Index ); + button->button->setFixedSize( buttWidth, Resource->Widget_Height ); + button->button->move( ( Index * ( buttWidth + ( margin * 2 ) ) ) + margin , margin ); + } +} +/////////////////////////////////////// +// +// thinbuttons::mousePressEvent +// +/////////////////////////////////////// +void thinbuttons::mousePressEvent( QMouseEvent *event ) +{ + QStyle& Style = QApplication::style(); + int margin, xpos(0), index(0); + + /* We only want RightClick */ + if(event->button() != Qt::RightButton) + { + return; + } + event->accept(); + margin = Style.defaultFrameWidth(); + /* No Buttons, No Menu */ + if( !buttons.count() ) + { + return; + } + /* Figure out which button was pressed */ + xpos += margin; + while( xpos < event->x() ) + { + if( ( event->x() >= xpos ) && ( event->x() <= ( xpos + buttWidth ) ) ) + { + break; + } + xpos += ( margin << 1 ) + buttWidth; + index++; + } + /* Clicked the right margin */ + if( xpos >= event->x() ) + { + return; + } + /* Clicked a button, let's dance */ + matchMenu->popup( event->globalPos() ); + rightClickID = buttons.at(index)->ID; + emit rightClick( rightClickID ); +} +/////////////////////////////////////// +// +// thinbuttons::menuClicked +// +/////////////////////////////////////// +void thinbuttons::menuClicked( int item ) +{ + emit menuItemSelected( rightClickID, item ); +} diff --git a/knights/thinbuttons.h b/knights/thinbuttons.h new file mode 100644 index 0000000..3171189 --- /dev/null +++ b/knights/thinbuttons.h @@ -0,0 +1,71 @@ +/*************************************************************************** + thinbuttons.h - description + ------------------- + begin : Tue Nov 13 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef THINBUTTONS_H +#define THINBUTTONS_H + +#include +#include +#include +#include "definitions.h" +#include "resource.h" + +/** + *@author Troy Corbin Jr. + */ +struct Buttons +{ + QButton *button; + int ID; +}; + +class thinbuttons : public QFrame +{ + Q_OBJECT + public: + thinbuttons(QWidget *parent=0, const char *name=0, resource *Rsrc=0); + ~thinbuttons(); + void mousePressEvent( QMouseEvent *event ); + void setButton( int id ); + QButton* find( int id ); + QButton* create( int id ); + void remove( QButton* button ); + void remove( const int &id ); + void resize( const int Width ); + int id( QButton * ); + + signals: + void leftClick( int id ); + void rightClick( int id ); + void menuItemSelected( int id, int item ); + + protected slots: + void buttonClicked(void); + void menuClicked( int item ); + + protected: + void childEvent( QChildEvent * ); + + private: + resource *Resource; + KPopupMenu *matchMenu; + QList buttons; + int buttWidth; + int rightClickID; +}; + +#endif diff --git a/knights/wiz_setup.cpp b/knights/wiz_setup.cpp new file mode 100644 index 0000000..e584de3 --- /dev/null +++ b/knights/wiz_setup.cpp @@ -0,0 +1,360 @@ +/*************************************************************************** + wiz_setup.cpp - description + ------------------- + begin : Wed Nov 21 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "wiz_setup.moc" + +wiz_setup::wiz_setup(QWidget *parent, const char *name, resource *Rsrc ) : KWizard(parent,name,TRUE) +{ + myResource = Rsrc; + steps = 0; + setMaximumSize( 800, 600 ); + + /* + Call Order Of Pages: + + Page 1 - Introduction + Page 6 - Accept License + Page 3 - Setup Engines + Page 4 - Setup Servers + Page 5 - Finished + */ + initPage1(); +// initPage6(); + if( myResource->Config_Version < 1 ) + { +// initPage2(); + initPage3(); + initPage4(); + } + initPage5(); + setCaption( i18n( "Knights Setup Wizard" ) ); + + connect( this, SIGNAL( selected(const QString&) ), this, SLOT( slot_Work(const QString&) ) ); +} +wiz_setup::~wiz_setup() +{ +} +/////////////////////////////////////// +// +// wiz_setup::initPage1 +// +/////////////////////////////////////// +void wiz_setup::initPage1( void ) +{ + Page1 = new QFrame( this ); + P1B1 = new QGridLayout( Page1, 1, 4, 8 ); + + SideImage1 = new QLabel( Page1 ); + SideImage1->setPixmap( locate("data", "knights/wizard.png" ) ); + P1B1->addWidget( SideImage1, 1, 1 ); + + WelcomeMessage = new QLabel( Page1 ); + WelcomeMessage->setAlignment( Qt::AlignLeft | Qt::AlignTop | Qt::WordBreak ); + WelcomeMessage->setText( i18n( "Thank you for installing Knights, the graphical chess interface for KDE. To help you get started quickly, there are a few things Knights will need to setup. You should click 'Next' to see what they are." ) ); + P1B1->addWidget( WelcomeMessage, 1, 3 ); + + addPage( Page1, i18n("Welcome to Knights v%1!").arg(_VERSION_) ); + setNextEnabled( Page1, TRUE ); + setHelpEnabled( Page1, FALSE ); +} +/////////////////////////////////////// +// +// wiz_setup::initPage2 +// +/////////////////////////////////////// +void wiz_setup::initPage2( void ) +{ + Page2 = new QFrame( this ); + P2B1 = new QGridLayout( Page2, 2, 4, 8 ); + + SideImage2 = new QLabel( Page2 ); + SideImage2->setPixmap( locate("data", "knights/wizard.png" ) ); + P2B1->addMultiCellWidget( SideImage2, 1, 2, 1, 1 ); + + pgnExplain = new QLabel( Page2 ); + pgnExplain->setAlignment( Qt::AlignLeft | Qt::AlignTop | Qt::WordBreak ); + pgnExplain->setText( i18n( "When Knights saves a match to disk, it uses Portable Game Notation (PGN) to store the match. Several other computer chess games use PGN too. If you like, Knights can be the default PGN viewer on this system." ) ); + P2B1->addWidget( pgnExplain, 1, 3 ); + + pgnButtons = new QButtonGroup( 2, Qt::Vertical, i18n( "Let Knights handle PGN files?" ), Page2 ); + pgnYes = new QRadioButton( i18n( "Yes" ), pgnButtons ); + pgnNo = new QRadioButton( i18n( "No" ), pgnButtons ); + pgnButtons->setButton( 0 ); + P2B1->addWidget( pgnButtons, 2, 3 ); + + addPage( Page2, i18n("Let Knights handle your .pgn files?") ); + setHelpEnabled( Page2, FALSE ); +} +/////////////////////////////////////// +// +// wiz_setup::initPage3 +// +/////////////////////////////////////// +void wiz_setup::initPage3( void ) +{ + Page3 = new QFrame( this ); + P3B1 = new QGridLayout( Page3, 2, 4, 8 ); + + SideImage3 = new QLabel( Page3 ); + SideImage3->setPixmap( locate("data", "knights/wizard.png" ) ); + P3B1->addMultiCellWidget( SideImage3, 1, 2, 1, 1 ); + + engineExplain = new QLabel( Page3 ); + engineExplain->setAlignment( Qt::AlignLeft | Qt::AlignTop | Qt::WordBreak ); + engineExplain->setText( i18n( "Knights can not play a chess match against you without help. Known as Chess Engines, these helpers can be found on the Internet and are often included with your distribution. Knights can look for Chess Engines that you may already have. If found, Knights will configure itself to use them." ) ); + P3B1->addWidget( engineExplain, 1, 3 ); + + engineButtons = new QButtonGroup( 2, Qt::Vertical, i18n( "Let Knights search for chess engines?" ), Page3 ); + engineYes = new QRadioButton( i18n( "Yes" ), engineButtons ); + engineNo = new QRadioButton( i18n( "No" ), engineButtons ); + engineButtons->setButton( 0 ); + P3B1->addWidget( engineButtons, 2, 3 ); + + addPage( Page3, i18n("Let Knights search for chess engines?") ); + setHelpEnabled( Page3, FALSE ); +} +/////////////////////////////////////// +// +// wiz_setup::initPage4 +// +/////////////////////////////////////// +void wiz_setup::initPage4( void ) +{ + Page4 = new QFrame( this ); + P4B1 = new QGridLayout( Page4, 2, 4, 8 ); + + SideImage4 = new QLabel( Page4 ); + SideImage4->setPixmap( locate("data", "knights/wizard.png" ) ); + P4B1->addMultiCellWidget( SideImage4, 1, 2, 1, 1 ); + + serverExplain = new QLabel( Page4 ); + serverExplain->setAlignment( Qt::AlignLeft | Qt::AlignTop | Qt::WordBreak ); + serverExplain->setText( i18n( "In order for you to play chess online, Knights will have to connect to a chess server. Knights has a list of several of these servers. If you like, this list can be used to automatically configure Knights." ) ); + P4B1->addWidget( serverExplain, 1, 3 ); + + serverButtons = new QButtonGroup( 2, Qt::Vertical, i18n( "Let Knights configure chess servers?" ), Page4 ); + serverYes = new QRadioButton( i18n( "Yes" ), serverButtons ); + serverNo = new QRadioButton( i18n( "No" ), serverButtons ); + serverButtons->setButton( 0 ); + P4B1->addWidget( serverButtons, 2, 3 ); + + addPage( Page4, i18n("Let Knights configure chess servers?") ); + setHelpEnabled( Page4, FALSE ); +} +/////////////////////////////////////// +// +// wiz_setup::initPage5 +// +/////////////////////////////////////// +void wiz_setup::initPage5( void ) +{ + Page5 = new QFrame( this ); + P5B1 = new QGridLayout( Page5, 2, 4, 8 ); + + SideImage5 = new QLabel( Page5 ); + SideImage5->setPixmap( locate("data", "knights/wizard.png" ) ); + P5B1->addMultiCellWidget( SideImage5, 1, 2, 1, 1 ); + + FinishExplain = new QLabel( Page5 ); + FinishExplain->setAlignment( Qt::AlignLeft | Qt::AlignTop | Qt::WordBreak ); + FinishExplain->setText( i18n( "Knights has now configured itself according to your choices. We strongly recommend that you read the documentation to make full use of all that Knights has to offer. You can access it by pressing F1." ) ); + P5B1->addWidget( FinishExplain, 1, 3 ); + + addPage( Page5, i18n("Setup Complete") ); + setFinish( Page5, TRUE ); + setHelpEnabled( Page5, FALSE ); +} +/////////////////////////////////////// +// +// wiz_setup::initPage6 +// +/////////////////////////////////////// +void wiz_setup::initPage6( void ) +{ + QString f( locate("data", "LICENSES/GPL_V2") ); + QString licenseText(""); + Page6 = new QVBox( this ); + + /* Setup License View */ + licenseView = new KnightsTextView( Page6, myResource ); + if (!f.isEmpty()) + { + QFile file(f); + if (file.open(IO_ReadOnly)) + { + QTextStream str(&file); + licenseText += str.read(); + } + } + licenseText.append( "" ); + licenseView->setText( licenseText ); + + licenseButtons = new QButtonGroup( 2, Qt::Horizontal, i18n( "Do you accept the terms of our license?" ), Page6 ); + licenseYes = new QRadioButton( i18n( "Yes" ), licenseButtons ); + licenseNo = new QRadioButton( i18n( "No" ), licenseButtons ); + licenseButtons->setButton( 1 ); + + addPage( Page6, i18n("Please read and accept our license:") ); + setHelpEnabled( Page6, FALSE ); + connect( licenseButtons, SIGNAL( clicked(int) ), this, SLOT( slot_License(int) ) ); +} +/////////////////////////////////////// +// +// wiz_setup::slot_Work +// +/////////////////////////////////////// +void wiz_setup::slot_Work( const QString& pageTitle ) +{ + /* Don't let 'em past the license */ + if( pageTitle == title( Page6 ) ) + { + setNextEnabled( Page6, FALSE ); + } + + /* Don't proceed unless we're ready to work */ + if( pageTitle != title( Page5 ) ) return; + setBackEnabled( Page5, FALSE ); + if( myResource->Config_Version < 1 ) + { +// if( pgnButtons->selected() == pgnYes ) +// setupPGN(); + if( engineButtons->selected() == engineYes ) + findEngines(); + if( serverButtons->selected() == serverYes ) + setupServers(); + } + myResource->ConfigWrite(); + setFinishEnabled( Page5, TRUE ); +} +/////////////////////////////////////// +// +// wiz_setup::setupPGN +// +/////////////////////////////////////// +void wiz_setup::setupPGN( void ) +{ +} +/////////////////////////////////////// +// +// wiz_setup::setupServers +// +/////////////////////////////////////// +void wiz_setup::setupServers( void ) +{ + serverResource *newServer; + QStringList names, urls, ports; + unsigned int loop; + + names << i18n("Free Internet Chess Server") << i18n("Internet Chess Club") << i18n("Global Chess Server") << i18n("Chess.Net"); + names << i18n("Chess-Square.Com") << i18n("Australian FICS") << i18n("Brazilian FICS") << i18n("Chilean FICS"); + names << i18n("Croatian FICS") << i18n("Dutch FICS") << i18n("French FICS") << i18n("German FICS") << i18n("Swedish FICS"); + urls << "freechess.org" << "chessclub.com" << "global.chessparlor.com" << "chess.net"; + urls << "chess-square.com" << "zics.org" << "jogo.cex.org.br" << "ajedrez.cec.uchile.cl"; + urls << "fly.cc.fer.hr" << "freechess.nl" << "jeu.echecs.com" << "chess.unix-ag.uni-kl.de" << "chess.mds.mdh.se"; + ports << "5000" << "5000" << "6000" << "5000" << "5000" << "5000" << "5000" << "5000"; + ports << "7890" << "5000" << "5000" << "5000" << "5000"; + + for( loop = 0; loop < names.count(); loop++ ) + { + kdDebug() << "adding " << names[loop] << endl; + newServer = new serverResource; + newServer->Name = names[loop]; + newServer->URL = urls[loop]; + newServer->Port = ports[loop].toInt(); + newServer->LogFile = QString::null; + newServer->UserName = QString::null; + newServer->Password = QString::null; + newServer->StorePass = FALSE; + if( !loop ) newServer->CurrentRef = TRUE; + else newServer->CurrentRef = FALSE; + myResource->servers.append( *newServer ); + delete newServer; + } +} +/////////////////////////////////////// +// +// wiz_setup::findEngines +// +/////////////////////////////////////// +void wiz_setup::findEngines( void ) +{ + engineResource *newEngine; + QStringList names, filenames; + KProcess *Shell; + bool foundOne( FALSE ); + unsigned int loop; + + names << "GNUChess" << "Crafty" << "Sjeng" << "KnightCap" << "BabyChess" << "Phalanx-XXII"; + names << "Bowron Abernethy Chess Engine" << "Cilian" << "Faile" << "OliThink" << "Pepito"; + names << "Yace"; + filenames << "gnuchessx" << "crafty" << "sjeng" << "KnightCap" << "babychess-xboard-engine"; + filenames << "phalanx" << "BACE" << "linuxCilian.exe" << "faile" << "olithink" << "pepito"; + filenames << "yace"; + + for( loop = 0; loop < filenames.count(); loop++ ) + { + Shell = new KProcess(); + (*Shell) << filenames[loop]; + if( Shell->start() ) + { + kdWarning() << "Adding " << names[loop] << " to knightsrc" << endl; + newEngine = new engineResource; + newEngine->Name = names[loop]; + newEngine->Filename = filenames[loop]; + newEngine->Arguments = QString::null; + newEngine->LogFile = QString::null; + newEngine->Protocol = XBoard; + newEngine->Wins = 0; + newEngine->Losses = 0; + newEngine->Draws = 0; + if( foundOne ) + newEngine->CurrentRef = 0; + else + newEngine->CurrentRef = ENGINE_WHITE | ENGINE_BLACK | ENGINE_WHITE_BK | ENGINE_BLACK_BK; + myResource->engines.append( *newEngine ); + delete newEngine; + foundOne = TRUE; + } + Shell->kill(); + delete Shell; + } +} +/////////////////////////////////////// +// +// wiz_setup::slot_License +// +/////////////////////////////////////// +void wiz_setup::slot_License( int index ) +{ + if( index == 0 ) + { + setNextEnabled( Page6, TRUE ); + myResource->Accepted_License = TRUE; + } + else + { + setNextEnabled( Page6, FALSE ); + myResource->Accepted_License = FALSE; + } +} diff --git a/knights/wiz_setup.h b/knights/wiz_setup.h new file mode 100644 index 0000000..edd5f9e --- /dev/null +++ b/knights/wiz_setup.h @@ -0,0 +1,96 @@ +/*************************************************************************** + wiz_setup.h - description + ------------------- + begin : Wed Nov 21 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef WIZ_SETUP_H +#define WIZ_SETUP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "definitions.h" +#include "knightstextview.h" + +/** + *@author Troy Corbin Jr. + */ + +class wiz_setup : public KWizard +{ + Q_OBJECT + public: + wiz_setup( QWidget *parent=0, const char *name=0, resource *Rsrc=0 ); + ~wiz_setup(); + protected slots: + void slot_Work( const QString& pageTitle ); + void slot_License( int ); + protected: + void initPage1( void ); + void initPage2( void ); + void initPage3( void ); + void initPage4( void ); + void initPage5( void ); + void initPage6( void ); + void findEngines( void ); + void setupServers( void ); + void setupPGN( void ); + private: + resource *myResource; + int steps; + + QFrame *Page1; + QGridLayout *P1B1; + QLabel *SideImage1; + QLabel *WelcomeMessage; + QFrame *Page2; + QGridLayout *P2B1; + QLabel *SideImage2; + QLabel *pgnExplain; + QButtonGroup *pgnButtons; + QRadioButton *pgnYes; + QRadioButton *pgnNo; + QFrame *Page3; + QGridLayout *P3B1; + QLabel *SideImage3; + QLabel *engineExplain; + QButtonGroup *engineButtons; + QRadioButton *engineYes; + QRadioButton *engineNo; + QFrame *Page4; + QGridLayout *P4B1; + QLabel *SideImage4; + QLabel *serverExplain; + QButtonGroup *serverButtons; + QRadioButton *serverYes; + QRadioButton *serverNo; + QFrame *Page5; + QGridLayout *P5B1; + QLabel *SideImage5; + QLabel *FinishExplain; + QVBox *Page6; + KnightsTextView *licenseView; + QButtonGroup *licenseButtons; + QRadioButton *licenseYes; + QRadioButton *licenseNo; +}; + +#endif diff --git a/media/KBDefault.tar.gz b/media/KBDefault.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..299b37861f9fddb30ce0c971a45239e392ed8b38 GIT binary patch literal 105539 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�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
mv-F7!by^SCu=Va_Gc9OCf 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 TK!E~_k45zIIonMJC}B7XDGHZ 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 literal 0 HcmV?d00001 diff --git a/media/KSDefault.tar.gz b/media/KSDefault.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..27db3eee98a6070e6e846362dbc6609083336632 GIT binary patch literal 130182 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

o;%GjZh|xFWZ*% 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 T{$2jxxcq+rNGF!Z0DuAjKQCz{ literal 0 HcmV?d00001 diff --git a/media/Makefile.am b/media/Makefile.am new file mode 100644 index 0000000..1458b76 --- /dev/null +++ b/media/Makefile.am @@ -0,0 +1,65 @@ +####### kdevelop will overwrite this part!!! (begin)########## + + +EXTRA_DIST = hi48-mime-pgn.png hi16-mime-pgn.png KSDefault.tar.gz default-portrait.jpg hi64-app-knights.png pgn_template.kml hi64-mime-pgn.png hi32-mime-pgn.png icon-general.png hi32-app-knights.png default-engine-portrait.jpg KBDefault.tar.gz wizard.png hi48-app-knights.png KCDefault.tar.gz hi16-app-knights.png icon-display.png Makefile.am + +install-data-local: + $(mkinstalldirs) $(kde_icondir)/hicolor/48x48/mimetypes/ + $(INSTALL_DATA) $(srcdir)/hi48-mime-pgn.png $(kde_icondir)/hicolor/48x48/mimetypes/pgn.png + $(mkinstalldirs) $(kde_icondir)/hicolor/16x16/mimetypes/ + $(INSTALL_DATA) $(srcdir)/hi16-mime-pgn.png $(kde_icondir)/hicolor/16x16/mimetypes/pgn.png + $(mkinstalldirs) $(kde_datadir)/knights/themes/ + $(INSTALL_DATA) $(srcdir)/KSDefault.tar.gz $(kde_datadir)/knights/themes/KSDefault.tar.gz + $(mkinstalldirs) $(kde_datadir)/knights/ + $(INSTALL_DATA) $(srcdir)/default-portrait.jpg $(kde_datadir)/knights/default-portrait.jpg + $(mkinstalldirs) $(kde_icondir)/hicolor/64x64/apps/ + $(INSTALL_DATA) $(srcdir)/hi64-app-knights.png $(kde_icondir)/hicolor/64x64/apps/knights.png + $(mkinstalldirs) $(kde_datadir)/knights/ + $(INSTALL_DATA) $(srcdir)/splash.png $(kde_datadir)/knights/splash.png + $(mkinstalldirs) $(kde_datadir)/knights/ + $(INSTALL_DATA) $(srcdir)/pgn_template.kml $(kde_datadir)/knights/pgn_template.kml + $(mkinstalldirs) $(kde_icondir)/hicolor/64x64/mimetypes/ + $(INSTALL_DATA) $(srcdir)/hi64-mime-pgn.png $(kde_icondir)/hicolor/64x64/mimetypes/pgn.png + $(mkinstalldirs) $(kde_icondir)/hicolor/32x32/mimetypes/ + $(INSTALL_DATA) $(srcdir)/hi32-mime-pgn.png $(kde_icondir)/hicolor/32x32/mimetypes/pgn.png + $(mkinstalldirs) $(kde_datadir)/knights/ + $(INSTALL_DATA) $(srcdir)/icon-general.png $(kde_datadir)/knights/icon-general.png + $(mkinstalldirs) $(kde_icondir)/hicolor/32x32/apps/ + $(INSTALL_DATA) $(srcdir)/hi32-app-knights.png $(kde_icondir)/hicolor/32x32/apps/knights.png + $(mkinstalldirs) $(kde_datadir)/knights/ + $(INSTALL_DATA) $(srcdir)/default-engine-portrait.jpg $(kde_datadir)/knights/default-engine-portrait.jpg + $(mkinstalldirs) $(kde_datadir)/knights/themes/ + $(INSTALL_DATA) $(srcdir)/KBDefault.tar.gz $(kde_datadir)/knights/themes/KBDefault.tar.gz + $(mkinstalldirs) $(kde_datadir)/knights/ + $(INSTALL_DATA) $(srcdir)/wizard.png $(kde_datadir)/knights/wizard.png + $(mkinstalldirs) $(kde_icondir)/hicolor/48x48/apps/ + $(INSTALL_DATA) $(srcdir)/hi48-app-knights.png $(kde_icondir)/hicolor/48x48/apps/knights.png + $(mkinstalldirs) $(kde_datadir)/knights/themes/ + $(INSTALL_DATA) $(srcdir)/KCDefault.tar.gz $(kde_datadir)/knights/themes/KCDefault.tar.gz + $(mkinstalldirs) $(kde_icondir)/hicolor/16x16/apps/ + $(INSTALL_DATA) $(srcdir)/hi16-app-knights.png $(kde_icondir)/hicolor/16x16/apps/knights.png + $(mkinstalldirs) $(kde_datadir)/knights/ + $(INSTALL_DATA) $(srcdir)/icon-display.png $(kde_datadir)/knights/icon-display.png + +uninstall-local: + -rm -f $(kde_icondir)/hicolor/48x48/mimetypes/pgn.png + -rm -f $(kde_icondir)/hicolor/16x16/mimetypes/pgn.png + -rm -f $(kde_datadir)/knights/themes/KSDefault.tar.gz + -rm -f $(kde_datadir)/knights/default-portrait.jpg + -rm -f $(kde_icondir)/hicolor/64x64/apps/knights.png + -rm -f $(kde_datadir)/knights/splash.png + -rm -f $(kde_datadir)/knights/pgn_template.kml + -rm -f $(kde_icondir)/hicolor/64x64/mimetypes/pgn.png + -rm -f $(kde_icondir)/hicolor/32x32/mimetypes/pgn.png + -rm -f $(kde_datadir)/knights/icon-general.png + -rm -f $(kde_icondir)/hicolor/32x32/apps/knights.png + -rm -f $(kde_datadir)/knights/default-engine-portrait.jpg + -rm -f $(kde_datadir)/knights/themes/KBDefault.tar.gz + -rm -f $(kde_datadir)/knights/wizard.png + -rm -f $(kde_icondir)/hicolor/48x48/apps/knights.png + -rm -f $(kde_datadir)/knights/themes/KCDefault.tar.gz + -rm -f $(kde_icondir)/hicolor/16x16/apps/knights.png + -rm -f $(kde_datadir)/knights/icon-display.png + +####### kdevelop will overwrite this part!!! (end)############ + diff --git a/media/default-engine-portrait.jpg b/media/default-engine-portrait.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a15adebe12cfcd77acffd1797ded576949d88ae5 GIT binary patch literal 2534 zcmb7GS6GvY68%#kQEF%=0TKv^(%g-}E+wI<35W^B1 z2(S?uAlw5E9E%F_iwO!;yL2ulM9n!QNR4c3?#nA943N{ zgv35cgp8aVLI#15S5i43uYguWAdu=vw5lo=i;&^#03eGPwB@d?HR5`4uar8l#lBSmR^G^mw{`m!SYoc-#2oO>K zFE;>&LO^1o5Dp>I{Rfc$2!p@~h@3heN>Q-V@JkU+0+JArs8I+4umHY3B4wkuXlWu3 z7={eRp-cfoYLaTGNonVAN$u=ASyueUm9}r_=*L$`&UQK(5)R>RR2L zdsXtRZWmm9e)b68SH4eBK>MB~{jlU!bVjj9rmOCZ@3eWf>Cf3?bzKU0b->Z zyxxkzgchasq6^d$EBtSB`t`L7XSW{dcdf%$C9h)H<=!EtRZf<11-{76FcORJYh~pF z;gM(F=CLi-NcD~bl5w5-t4HyB?E+O(!=z(QocpxD(K1?2HdsoNY3uTsw{mih{j>Fn zPk#;Gc^k0%ZMoLL6X}1PvQG5e9A6Rm_i>8uXCmyMT3ypj<6AJy+vRwm7Z*-xwoYvC z9iXT0x(I=>#tY-kDe5r|^Z-r2iKHA5%6Kc*b!kRo=jYJ8iyw35aTZK>aSL^3CFgUN zn-n28!_uCGNuwn`$fo3IbMyVps&c)JyrrzHj&N18)D~P{W}G)lQgwceKL5h&W_$T9 z8CgHn%MX+NwmqCfGND$Er*Ns{U1 zHT(iM{zSV~5;VQTNwOg8G3@n+Px-1iD-LLL5$WjC^NTx*H_!0LoaKpTL^Bsl%8d=Luk$&{g-`N5N`r03ZNtoh>u94|fCg2n8}R`S z4VY;fhr5wVRa)mHw>n`%0whI8*m zPtDZdDk@oRTImb_;_feB;?wDYxunNL|T1V-i>tSr9fqH=t96{YQ0JU>=*OvPJ#5iP(}Luxj3&V z@|@{QVkP@ey?slJ(lT;X%2Sl2bO+4FOPe05QvfP&0)64G&^|ZK%uS7=_T-`c_{D9) z_a5e$(JKeCO-E-R0l{nIE|;C(=tDiW`HN0{;j;SsfCf5r8CJY5Xk4-gerICm;2vI0 zXN?ZX22qRIZ?*-GuU_6n`;fPiA{ZHAdE>)vH^J2=55H6^cW4)w>Rs) zx+mAxx4n}7hUAQ4Q-vwloEGT zj(UcN%8R>Z){r{CCiu$6vzc&a)Tv?<_CQu2i;DCHEmAWtxINz9K9+FVvDB;k*lZcT_e%2D8jFNMoosu16ml?+?OysUvMrZQ z4Sn8_YLhzD=i22yy6-uSToHiW;4TahJC@_NvcKq-=7f)jA)#? zWPP|ma3t!qoe#3U@jfnyqZhT}Rv zVt1K3xm=T)41fL$+2-c_q~4%)zQd>aR_W7`4WCCQ6>oT`YtI)QD#sq(7m+@^gZBBD zn%Qfl5YC#$HSKQn`mI8|m_k4ydaOnW#7{$yMI8p+;oo78?1ApZUvKp*cpA z?%&~Eu~zxr*eDuT2z+!d%_QrGXI4Rvu;jvENOlh)7hU?3%WdZ2k^SknA~M83T+qg5 zDPK7|9+arnndcRkVugNpOvMg=RKwufhChO3+GF!x&t0}s+V~Y(v}iqrW;a^xDeCp| zaibpr`tzEe;)FsOs4Qb6JxDY+2PTf3Jzt{E8=gaW9y6jlV^Q(=siEeLN7n@UCl<$ zu19aqu1KL{GbI*zk75c{tSj9>;&PWoBra8AB+V!Pv4igoY@)8P_%_O_DTYs|ge1M(U=qoiLUm$95tN zNwTCYl`Y}K$=J!#$sA>AGqj02p7T8S-hc1w`+1(v=Xt)L&-?v(zTd6!tvLWqwWrtv zAP@*}lpJ7d6WDFTW}b;)GVoEs5kYv*AST{{;_S9H1=s)(FnBv4l8^wEfP-sj+H^mVE=En z+5ik3U;u6qkSYMifFKyqRu`ZQfB>*$H{id(5wIO#C`1Y=xi&`wATSIJfk9zA|Ly=u zdZDl#7%2iAOG3!1TDcpZ3BM+vQC!!A8Uy+6oVzeNU}I9_hLiqjIBvP1|reGKrp}&;F=p(t!g)#OF`{@gn9b) zMv2B;nYr_=DW^!5sau7%ooglJ%1T3=r_n=F+d%Z61ZGCut0EpPba2mW`9B1){Jf}h zFH{3oYsT~wucJ(-6Q=lqg;sut(Bw24E)(Rwx2G4X;+~l7@ zm=_mk==L9&aW!nC^5yv{SPq`?CWx*$+~>oIX@46Z#wB#9qPc*Y|Ikm1N5<5p%*JK< z#Sv=j_oU#29stxt%`%Usa)>trYtS6u_|tO3A=Kkq)7`IH3`efaA4933|>rLKaScY(L^O&j6v`9aOw5PN` z=i7}xdOsASe#+;d>o7gX;Kh_N;?lepIZlXdDXUV6A%DpgC`^4CGY@k9aY}ANnFP01 z*^lPpL2&!2(n*%b$co*qNt4CBo}vpZ-PPi{C!!}+VLaPXZHMro3LcRt*C<`*wC?+E zI^=1WPxYXtYMHxUvSPN&z@s>HqH?ga3AajNKaugqvgi1~T=L|>Q@e#!{lwsBDlZ?< z%BZx-&MXu`n;ksVJnd_uqq(S{;@+zDnw)mhNK=#_#EDQ2HdlfOr*Gh1_$=4mQIn_?gV{TA5sQ`z2mJyqEH?_=}o_NPK#%$%|MSmkPh! zl1&5A9qcQokX@q6K&CIJZYh=6Srp(EC%h)s5~;mO3hf;K*0(Q|d9z(-$if0{ZQ9jE zfCILp%f*d5k0&9YojLE+I)a*wfE~KbGFwfedh)Jng{yzxKZ`CW{uYo^Dir@n+MU;| zBNXRFveU#B?2y1FrYnpPgw*UTfL;5|<752ADDmpp9REnBzKxn9Px>C~q2u$OF@{d6 zly?1R4^~x4Zmd4!BR+RoSI>q~!Sivz|K!;#tw${QbWq;fdPxPZVQH@3TE=8XhLL9} z|3$$dq0`1R}X5dr;^v2GjKWhUD;Uk62O zd#7IQ1XE8@@gr><*aDKBMXW1|oMYKaYL^M{#gq)VHGt{oSBDaGVY_j+(6VEe-f0-s zN2EbPB*bmJ+Edh9>h3jw9OO5DQo+1Ex_HI6*2QkH{2^KP9*RxD&c+wvREp{=SEJ(T zja{#Pr-Yw>K#Nr#weLiDV~8hTQ)iqA8r9(o`<|57ZaU5^Q_r_@uj>i;e!E)U>=77- zkC1u$LYBON$1(KI5JnPvZ5RCQ z^;8YJ$rUBLZsrt>$16PPB(->A>$guZvw87jfAS zW)rRJ%rF>KXhTTlfpi7outhcxe7;!1wAF_o5s=-{S`DI;}^W lYDI4AO^r6AH--5;{Xn*``(*r#&JxT=`UMtOleXuibd+8 zEwnp9aUsQ(bt|}0=%3I(p#O#&an)@L1tkggB-vJ(ae^+1m3om`%6y-ZoBjU=NYWH2G2 z+w!i4u;ZqI7g9rOuypR1-;RHDYP7%iT$#DYU!%)9FiBmHqT!vb*sbz=vm6 z7Zz7MnGn23GQ?GwbPKf4D&dP{Nrc`}-2LFTzR#|1Pd z8rB|6X|!vKs;s{J;W_{_>#kmoU=dh`hnAMyuy$=vZO*e98CmJ=i)(i~{gVIy_@YRS zCgQ-EiI1{4G0YNYBO*Amm~8&@ukfCqo3D%c&?xjmAHc> zr4#WGK{OIZ7%W}hk>SA~AFMvv?;*)z9eL8|F)rl0eGdTOT3!9sp%xq@U=`{Aw?`*6gCkDzYxB^)d z*O{GIG=z9?u>N- hL}W&0!W07=l}o$gGod|RCt_ylS^w;K@@<$o7^_JYF!a1SXliW1nDmjFn>+X3nQ@V}m?$1N%rG&yRFliZlqF3rSLq-uWFU~`EL{!7GI2yj}K2yP8K%Kn@#mb`;Kl74-7Ue z`o2%8RAOps>PRw~e7w54dODxa=K%uE21;vmQwD=UQmGV{Wic``(my&n`Y4yn^)wh< zIk!J;`p&VrH!rcIO-)FwP_RCRO;m6Tnid}1zmM;U{@$MK_37#9^BVvo98gEQV&=WY z@tcU}AyyoNcvw@e2$IndKXe-xu3qQV$w9u%%`h|dt`lh6yh5R9x0EY_%=R|+4vlhY z>^0frLnNc2IwTUnURxo$HAH(dMl50lfYwbwIuRxr4dI1TnEo1{o;~8w*^8S7i^VF^ zt6?aC)e5bqVKg+cxa?4_2=vlC&+go!b61u~G*0)W3gD(UEt8VbqM*0rYwF%%6KsLUE;<7^mgJd+s?B}mMe>y=dl}4ArShXDUE$m}~rrn8%PJVv;0pl(pAqTITHa_zqjX1`aKMMTf`^mgp|wy?yj zdpB6B2!g6c;g`wI-5s==pgafVJD?i@`tIAp1aRis@a36P2M-{9hpzRe^`CHP2`JhV z7Rs}cu8nR20MvlFu8!^G`g)LV73tbYVWYhD`FbkpZWc9vCZ0TUr1+il7dhLQs9 zyJ+R1rH58NTKRzHNo&W#`b4f%&RCt_imCcW3S9QhL+IydS@2jd;^}1Z`uKsWV?eEAoR-!~! z96}PLj9>tYA|WP>!iW)n0Tcch!~`i)6fwyl2_h)S2_hD8*QbIcm{hBc@~gLiX%2`BwhpZ& zTsD-+7Lhw80nE*&t^l-6^G8z|D|bHi`rSYO`mi(Xlb<>cFD zG>Oz@-HJs!KR=x{IN5~ULv7$WNypoJ?62(%f_EQim%`1!A0fByAnKm7`T+i!jO z{eS(@hu{B>Z%+qnIU5}wh(IQh>Az}!Ka`y1U^ZW0gj=Y$oiWN*V0TMwvCBn?S?_=TBSZdnfxw}LY zK)P{p{L0?TpS$_un>Sv3(dU5mS7yjz#?i;^hJ#IH1B_aTr+3gozd+^4e*7treO`2o?+!Rg$lPrYR z)D^|~9Hn|6f>0Z`Q*5nG7iT1Etxujjad&qg&mR8bU;h5i>wk3nGcSIOTwK5V_}}}B zX>JXjiNOT2!N3U2%^W2zXX_@et7X!Wl63yyKfm|whwuFDcyW6E!Fx)XvAE*k=!nc9$Q! zOWM2jQrW+emrspMpo#z?w5D(v8IX;Y+vYRuVu~kIxyUjyDkx)1jx(F!%Ax4)+h4x^ z+zX#fW$*ZI_u3aXh%H>kG|n@(GnpvX2DY9p4$FMBXzS6>=Q4^cSdv}5D;u7kg|l6*d~KUxK(hjmSRh}GSeC;NDXd0e&y}e zofq(1l9a3GE@vl@^dvGx!kw;6n#0Y2Xjx~hE2m0`%|fuwMG{St4vvmX*Z)86nFlvc z=H;!Vn;{GUR5OK5+SshhOacT01``b_)P^dwBmg)w*_ZBW5q;AA3Xqw;bFC&?A`?c) zO^Kk~R3bytB<#dYpqUw!38Vyq5=e5pdz_h93`qc5Yx6u$({yqEl-q{~-6WAj0w7HQ zL1#_Ip4Wu|36ZTrgka8ATr_Q}H{h55^fwpx-hXyCjmoCE=60NGs}fHi-RmwNC9GJw ztI4M1Ok~v#+Nz&|VMB+StjTS)Z8D5Ih3?rB?qb7(cYbjH{{Q^y`OkK%Tf^>>g_X5! z&d)x0_u&U0_M`Q|{b;0;3~1Y|f3Zf)nVQsI^vHAJd;$pOLH)7L#D+($A5+fXfGmCK> zJ8|;XAAIf$w{G29EEZQuY&M%H-MfFcwg3JHm*!+5sC1J%5<;Mn5tdB>Vb|M!r@0YE zH&L3Cg2^=QpIrO&8_VS~{_paTjEL*c9zS^b_x1S4owmhN!dT5ndUgg7oo8I@+G?0A z;Erwclt_?ZN@9wN{_^hUZ=T#;EEewm@t8)$YPI^*^Dq7Mzy9#nNB_9cC7X6T7;@QF z3u`hTnlaFIT67o+_Dfw@tCd+Hz+9KU`-|o89o)P-3`4DT9LHK~YwfDe%wZUo&%JhU zcqJ=Dn5&VebGe*tnlz4xb@kIJqAEoQQ?>}SI; zbX{j=?k(_2lrO+v2oL^Ri+S*gFeF)yR5yC^=k0|k`qCROj$j8>Ey=Y z&BNVcd2N4xzv~Lk2oT83%k^fxzFhje#52Eqa|=TVBAI)?|>8{K=VY|~O_gQn-}Q~G={+nCl1vlLa3 zLRC4narUXgEVGHE8R~>y^D}si4Qwql%#Si11ZGpQyquz>86iVD3RNq1tt|*7L)n^b zXT;+%&ML#{Y-$Zs+nSqNf{^>wu?89-jY%U?G)9}W%8R^Uy#{d8ZQAtEWRCt`FmrHD1R~g5D_uR+4$FC%|6UXFHn#M#4B?(jtMGYmO zEKtOA(+Gl)po_qY6`O9ls!$i~$R=UI4hbUxqU$O=BBd&6>Z*;^*pAb9#vUi*8PCkU z_nhyrxHFTCJ&lKQHs@a5qx=27|Mx%Nxz}Nbapld|Y$i8^F&42FBNj1&5kVV48$+xO zVHgs|ny?j7t!=PcdGwz>d-l9`<;s<}fDo|#-tX-YUuAM5od4cMf*|EG{lyT3%kB1!`L%b_5XHSGk_yI1WlFeBbYaiU>!K9>rQq7>3toXJ;?X z&CP9t7(js?0UHX9A9)hb%+9Tn)zp67Ao$Punyy-KZC zLn%cN1Q=r&9v;4W^5n^tn>TO14K(@zcyGM&(7XvmnHPubc{-a-H=7q0u`SN8}%OxJJuTffAVPWAe_lF7?V}1zS0$N)E z93VB4=H_i-1?ZIsXQyC2J_1`_K)YtKIMM3^nlR=&$54NAEU!XFcHcc z6q@z55+C0ACcN^2w%r3WW@S0$jl9y9>t0GEAoYZf3g= zALCoUewBkKzKY|dfS7ZaUZwi+EtckQZBwFJ46&jS6N3bJ3Ib0N_%3Nr_4MR^3NSI2 z?#b-b_kYIpkr~3xDhs#Yq1oKPQHtlzUZ9^+m5mlwG}gpe6QK}XM+iIzZ%fL36(~Op z@mh~P@VDRm3Ri)SBCJ?`{JXzGYM9SGJHw%UMJ%?*0}pe4R{?8cum{5B5^=RK?#ti(wftVTJ4V-4PxLvbJv zbTZ40j&bY+#WVU-CAGJ%M5fdc}U~sWGn4J~a>VZyX2aX=YRUT*!T4S^( z%8YOG!1|*W))>S@T^~4BP#Dyf6L}yHbTXUV(@KI{i`AMaic#S@o~L@0TF?7PTLEig zXdBXXWSatg0UoS2XgDGJ$8&ssD$i0W@kG7#Z{B?Ub-wcTbEGp_=H8zpzWZJ`^Uit^ zKM5)^V%#o(gF*d29&pkbPQCOJr_a2AN~M?@-^E+=*J)NNy&gzMOo~Qy0^oFdf;FGr z0|)lz*mLR|?3KjI6vl+%upNCYw*8>|(Fr94}b!Thh&+dT_*8@gpCU{UPQ;jq@ z9=cgWTSa~38J5cLcGp+30U`z@#u^1r^aN)B09jdUN`qF92Od;HCO&x|m8npfcd2Yd z6apx!h^*P{@qp`O@I3`stQfF@wFYYqTR)Ds0$4ylYPSAakHg(nk&!ij=xnxl7+1wC zd{SbgUg1$K=3%u(A?Gn#^rqIU!c|M>3x zzmt40j9onR;@J!5E|5z3NnNdBuhGdi6N44axaj1?VsI4<52sdd>tfG0p(n&;oHAr0EAf z#e9}rCO}Nw?rt8|c!+V6th7SfhD(BVGVcxE@8_uRHhcoaCSSyc_FHjma;RVhtl)?M z0%EXMaKwO3$|It|w9C^CK0qVt#jq?aETU{XdmTN|THN3Eh2Nl7ZfAk6Z) zV8ALgbX7u;mdIii3QP)s1S6K2Mapbt*?Wql3POSq7jZ5cFm_n?h-c?d`@!5GnGppn zG6Gpp3C0;rstA=trOb!{)foz?z;1^kS~EbM$|1=}iEJ_mnUVnG1k8j;Rf$TN3%ylm zkcje(!)WuowMc4kfpo*rAt0l&l#PHOGpZa@S%YU#m-C@>lM@^w|gh^fzAn!`I{T9gr-vhF!C%*$i76=4NIXLI)kpB{R{Y5SDY=LIbcF za&r*lX#C@U^XlnnJyk#$9Cf*~ZMnp7d0_0SXHAPkB9&qe*A9Q;i#I-T_r~Xb?auvA zlLRo&^LO8P{oDWRKeuoE`wnv$47HtXo0hV0dGMfb0ZfYlBGkl$5eQcSh2ZLXj4TJ7 zbVEySGbVAC5dyfBEzL)^eH#kmu(|d5fBo4ne{HkbbX|wPdwt)3`X_(p=AC=r*uGb9 z{?E45Rg0xK$qY)d6?5qarkf-R253Ze)HS!{lDGx@LBrQFf|LSFnM7#3ht6sfp9X- zN|J+VO0l&ia0&uSGc8FMR-U~H zRwbIzSrNtq&)yZiC=ES!jcE*1N0pEKiLbo;>%V*L^v=F`|1t0I==lCG|JGl8{XgEY zi!2+VFpx5+1Qq&DD)m+eeTD%>0Wz?Y|NfVbZ*H(2;RM`h=tHB|%Bq#&d}9fd)}<1KivpAjt)`Z4?;YXiv8N#S%*~0;^7| zP|tGJyx6qZYTT^X>mP?k(!&qld;gukS(fGR!F2C)vAXtyP_r#F+l*E$qX_?Ym4!>=wsm1)OT;d1S^#KD z%c8&zS&|_~!}9jm|N4*q?USGXYV`ftTd!Sy@0$<})nG;#1ruKS=b8CY{-Ph2^48!e zCuVSlc`D1Ah?0s%T{RLkQyRk+Q?qS)8UkfNRn4G7`{pbmVekFe`Zt#U|KHuArp{!pU9;U}S!l&jlGqG6c5p-I88?Ud^w1ARs_^LC zo=&k4E3cJ{0T>)ru%0MW1(65<;;vcq&5K|9os&EFe_Ri4Hk;!Y?q7YoF-$_oOtCkm zOQb;o5SW|gf^ncHqeFSo65GkH7N3i=*eYgegX*JM#F7F&d4Kh${D zEDV(S44OmYc45tg$|2t`?ZPaA5YSmU0Z=czeD7Djx;Z)hacBTkm85fQE|)OWK)9g2 zCJLREI{*n_B4th*8D;1~U8u^IG=n5f>5yD08sSAMRYFcM(jBL_UOBn@>5rLik|deg z>ZPB*{BM8ygHW^rRmj{s8oGl}#{wAiH7y*Z(6yS1b23F2-9Z8#UNFc_i?|e+>4dv& z4p!qhemt6e%5L7d_syf*arK^wP8pTpPVknLV(?7Nq6wBZX9R)Pu%$2MqDU2CQl%;h zV+V#WChI7KL?SixV?=yRzMiK{Qg`F!9v&2?)H099~T2_i*h0|6NO zK*BDkh(L8F0(+O3;L->%TvbL^pwem1R**Qj`fiCQZ(d!!>h90$`gze*Rco!amYG*q zS7#r-tEcbIX$BcpPCAtY(ODgh1*rhZ7TVA+aTs~%1Z;0<0jNr5Y$8A-$)4(?O1x@* zkx>mF{`sH1|NZZeo!#9mol62rEw!|q=3KI*?7LxZ`Rx6-u1^m|lhLR!^-*cIE4#{g zmTXN(t-Wp?w!?9bGPAJGv?QmpDsJV=qNxTqj!`SizQ-<2MmpALP4@Wx@0@8oy!Vsc z>fU&C(^p4b*X`NrC2LL7#pUC7KltF`+qoRiZ@6RhT1R${U0NAoSgTF)MP}5sRc;Q< zM~@x7(Fm2HGoh-@NO3?pzaPB*?zi86V8?f{xwT%e_ZeK4 zWtt|tdN_ah9X)>gbUGt5AS2urP=ZVWNYJ69KEpN3-aYTEB6<@fO5tqD)ZQVOLvAS8 z1hdwRq7i@r9kT#nn$#VB>YqJ$@Zg0PUN|~Biika+%gf70j~>1D+O_4`(}Syb=x~E* zJDI9Eg}vDqddmVuqsYQKDjr|D(feR0&Em5q=7y!{sJ?@hf&{}LN~FT}t9o7d$?C<= zzxwK{ckkXkIXU@ZS<1}Q)6~w?RyWlAAaui z-Tz7eL~kOh#7sC91~d4+49MOzdRitfoA1&Asx(BdyXveAGJ`qHBv8Zx+rcMzqhIzn zL*-d{h$&}y|hIy$<0 z_wN7sn_oV7{69|klmt>JZ9325U~SX42r`&SS#ij?cF;C!xO)}~2I`=%RRO{_U4Wo{ zF&h!CiT(HOMc)40;o)IKNNTN-d`{AHg#-{0>-GBN&Wq=}@2#%BIcOpPnwby)IlNM z8x|2IqdG?}Ea03+_~cK$aPQ^Yw{IUGA0HhZZ8n?d+&o7X5yLR7*X#9qJ&xmko?J}z z-M{+It#~H0l0k(+5OZpp{e0;o!hMVcAi1g)QmjHihN9C{36dg2n8Zak?RMwq=jZ3= zW>!_pvX~jkA1CP@5-bU#3ZUk40v+Y3!86Wh@4D!P zfoZHvmCUFnNXkOO1+>Ckb_SfCJ>7oqdwW289QzMYM$qLp10fW+1c6Cr%xX}y8Xtt#_93bAH;{&N`NSpR-w+| zj*cAJ;@Rx*h_cR#kcyK`1vi<2f>E895>Fuf!&0tRBh`f*+%D`hJGPa( zSxL04V_yVfS6I-8B$x>%-{rD++x9~mje99WqKgW0YV2A&VryYW31*c6C2VeHjq!Mn zN{OK2T5+*cn<84oczjzY9evWf5*u{w)Yc1V2e9CY%5O002ovPDHLk FV1m(2pcw!F literal 0 HcmV?d00001 diff --git a/media/hi48-mime-pgn.png b/media/hi48-mime-pgn.png new file mode 100644 index 0000000000000000000000000000000000000000..04489dc510991953fcccf31ac9c27864e2c1dfe9 GIT binary patch literal 3083 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 literal 0 HcmV?d00001 diff --git a/media/hi64-mime-pgn.png b/media/hi64-mime-pgn.png new file mode 100644 index 0000000000000000000000000000000000000000..224f36944087338794e3e734b96db8daabe0e817 GIT binary patch literal 4007 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 literal 0 HcmV?d00001 diff --git a/media/icon-general.png b/media/icon-general.png new file mode 100644 index 0000000000000000000000000000000000000000..8f82b320b8fa4087679037bd3cdd7002b8b19379 GIT binary patch literal 2037 zcmVNo&W#`b4f%&RCt_imCcW3S9QhL+IydS@2jd;^}1Z`uKsWV?eEAoR-!~! z96}PLj9>tYA|WP>!iW)n0Tcch!~`i)6fwyl2_h)S2_hD8*QbIcm{hBc@~gLiX%2`BwhpZ& zTsD-+7Lhw80nE*&t^l-6^G8z|D|bHi`rSYO`mi(Xlb<>cFD zG>Oz@-HJs!KR=x{IN5~ULv7$WNypoJ?62(%f_EQim%`1!A0fByAnKm7`T+i!jO z{eS(@hu{B>Z%+qnIU5}wh(IQh>Az}!Ka`y1U^ZW0gj=Y$oiWN*V0TMwvCBn?S?_=TBSZdnfxw}LY zK)P{p{L0?TpS$_un>Sv3(dU5mS7yjz#?i;^hJ#IH1B_aTr+3gozd+^4e*7treO`2o?+!Rg$lPrYR z)D^|~9Hn|6f>0Z`Q*5nG7iT1Etxujjad&qg&mR8bU;h5i>wk3nGcSIOTwK5V_}}}B zX>JXjiNOT2!N3U2%^W2zXX_@et7X!Wl63yyKfm|whwuFDcyW6E!Fx)XvAE*k=!nc9$Q! zOWM2jQrW+emrspMpo#z?w5D(v8IX;Y+vYRuVu~kIxyUjyDkx)1jx(F!%Ax4)+h4x^ z+zX#fW$*ZI_u3aXh%H>kG|n@(GnpvX2DY9p4$FMBXzS6>=Q4^cSdv}5D;u7kg|l6*d~KUxK(hjmSRh}GSeC;NDXd0e&y}e zofq(1l9a3GE@vl@^dvGx!kw;6n#0Y2Xjx~hE2m0`%|fuwMG{St4vvmX*Z)86nFlvc z=H;!Vn;{GUR5OK5+SshhOacT01``b_)P^dwBmg)w*_ZBW5q;AA3Xqw;bFC&?A`?c) zO^Kk~R3bytB<#dYpqUw!38Vyq5=e5pdz_h93`qc5Yx6u$({yqEl-q{~-6WAj0w7HQ zL1#_Ip4Wu|36ZTrgka8ATr_Q}H{h55^fwpx-hXyCjmoCE=60NGs}fHi-RmwNC9GJw ztI4M1Ok~v#+Nz&|VMB+StjTS)Z8D5Ih3?rB?qb7(cYbjH{{Q^y`OkK%Tf^>>g_X5! z&d)x0_u&U0_M`Q|{b;0;3~1Y|f3Zf)nVQsI^vHAJd;$pOLH)7L#D+($A5+fXfGmCK> zJ8|;XAAIf$w{G29EEZQuY&M%H-MfFcwg3JHm*!+5sC1J%5<;Mn5tdB>Vb|M!r@0YE zH&L3Cg2^=QpIrO&8_VS~{_paTjEL*c9zS^b_x1S4owmhN!dT5ndUgg7oo8I@+G?0A z;Erwclt_?ZN@9wN{_^hUZ=T#;EEewm@t8)$YPI^*^Dq7Mzy9#nNB_9cC7X6T7;@QF z3u`hTnlaFIT67o+_Dfw@tCd+Hz+9KU`-|o89o)P-3`4DT9LHK~YwfDe%wZUo&%JhU zcqJ=Dn5&VebGe*tnlz4xb@kIJqAEoQQ?>}SI; zbX{j=?k(_2lrO+v2oL^Ri+S*gFeF)yR5yC^=k0|k`qCROj$j8>Ey=Y z&BNVcd2N4xzv~Lk2oT83%k^fxzFhje#52Eqa|=TVBAI)?|>8{K=VY|~O_gQn-}Q~G={+nCl1vlLa3 zLRC4narUXgEVGHE8R~>y^D}si4Qwql%#Si11ZGpQyquz>86iVD3RNq1tt|*7L)n^b zXT;+%&ML#{Y-$Zs+nSqNf{^>wu?89-jY%U?G)9 + + + +
+ + +

%white% vs. %black%

+%event%
+Round: %round%
+%site%
+%date% %time%
+
+%moves% +
+
+

diff --git a/media/splash.png b/media/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..1b44017158a6aeb6fdf30fceaa4dff12f6c0a09a GIT binary patch literal 56726 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 Tkxkbo1pG*d$O@MV>iYa2M#-6@ literal 0 HcmV?d00001 diff --git a/patch-stamp b/patch-stamp new file mode 100644 index 0000000..37def0c --- /dev/null +++ b/patch-stamp @@ -0,0 +1,17 @@ +Patches applied in the Debian version of : + +debian/patches/01_gcc-4.0-fix.dpatch (Tommaso Moroni ): + No description. + +debian/patches/02_de.po.dpatch (Tommaso Moroni ): + No description. + +debian/patches/03_noGPLonload.dpatch (Claudio Moratti ): + No description. + +debian/patches/04_qt3_headers.dpatch (): + No description. + +debian/patches/kubuntu_01_fix_castle.dpatch (Martin Meredith ): + Fixes crash on castling + diff --git a/po/Makefile.am b/po/Makefile.am new file mode 100644 index 0000000..5e620c8 --- /dev/null +++ b/po/Makefile.am @@ -0,0 +1,7 @@ +####### kdevelop will overwrite this part!!! (begin)########## +POFILES = AUTO + + +EXTRA_DIST = de.gmo es.gmo fi.gmo et.gmo fr.gmo it.gmo + +####### kdevelop will overwrite this part!!! (end)############ diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..9eff6df --- /dev/null +++ b/po/de.po @@ -0,0 +1,2290 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-01-21 04:30-0600\n" +"PO-Revision-Date: 2002-06-19 19:41+0200\n" +"Last-Translator: Sascha Müller \n" +"Language-Team: Deutsch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 0.9.6\n" + +#: accel.cpp:23 +msgid "Previous Move" +msgstr "Vorheriger Zug" + +#: accel.cpp:24 +msgid "Next Move" +msgstr "Nächster Zug" + +#: accel.cpp:25 +msgid "Enter Text" +msgstr "Texteingabe" + +#: accel.cpp:26 +msgid "Page Up" +msgstr "Seite zurück" + +#: accel.cpp:27 +msgid "Page Down" +msgstr "Seite vor" + +#: accel.cpp:28 +msgid "Increase Board Size" +msgstr "Spielbrettgröße erhöhen" + +#: accel.cpp:29 +msgid "Decrease Board Size" +msgstr "Spielbrettgröße verringern" + +#: accel.cpp:30 +msgid "Last History Item" +msgstr "Vorheriger" + +#: accel.cpp:31 +msgid "Next History Item" +msgstr "Nächster" + +#: accel.cpp:32 +msgid "Reply to the Last Tell" +msgstr "Letzte Nachricht beantworten" + +#: accel.cpp:33 +msgid "Reply to the Channel" +msgstr "Antwort an den Raum" + +#: accel.cpp:34 +msgid "Kibitz" +msgstr "Kiebitzen" + +#: accel.cpp:35 setpagedisplay.cpp:523 +msgid "Whisper" +msgstr "Flüstern" + +#: challenge_graph.cpp:75 tab_seeklist.cpp:40 +msgid "Seek Matches" +msgstr "Partien suchen" + +#: challenge_graph.cpp:77 tab_seeklist.cpp:42 +msgid "Accept This Match" +msgstr "Diese Partie annehmen" + +#: challenge_graph.cpp:78 tab_seeklist.cpp:43 +msgid "Tell..." +msgstr "Nachricht..." + +#: challenge_graph.cpp:79 tab_seeklist.cpp:44 +msgid "Assess..." +msgstr "Bewerten..." + +#: challenge_graph.cpp:80 tab_seeklist.cpp:45 +msgid "Player Info" +msgstr "Spielerinformation" + +#: challenge_graph.cpp:82 tab_seeklist.cpp:47 +msgid "Player History" +msgstr "Spieler History" + +#: challenge_graph.cpp:84 tab_seeklist.cpp:49 +msgid "Add to Friends" +msgstr "Zu Freunden hinzufügen" + +#: challenge_graph.cpp:85 tab_seeklist.cpp:50 +msgid "Ignore This Player" +msgstr "Diesen Spieler ignorieren" + +#: challenge_graph.cpp:304 tab_seeklist.cpp:28 +msgid "Rating" +msgstr "Bewertung" + +#: challenge_graph.cpp:311 +#, fuzzy +msgid "Time" +msgstr "Titel" + +#: challenge_graph_view.cpp:105 +msgid " Name: %1 Rating: %2 Match Type: %3 %4 Base Time: %5 Increment: %6" +msgstr "" + +#: core.cpp:385 +#, fuzzy +msgid "Hint" +msgstr "Vorschlag:" + +#: core.cpp:388 +msgid "Tell User" +msgstr "" + +#: core.cpp:391 +msgid "Tell User Error" +msgstr "" + +#: core.cpp:397 +#, fuzzy +msgid "Tell Opponent" +msgstr "Computergegner" + +#: core.cpp:411 +#, fuzzy +msgid "Tell All" +msgstr "&Alles auswählen" + +#: core.cpp:646 +#, fuzzy +msgid "Load PGN..." +msgstr "Spiel laden..." + +#: core.cpp:690 +#, fuzzy +msgid "Would you like to save this match?" +msgstr "Möchten Sie dieses Spiel speichern?" + +#: core.cpp:691 +#, fuzzy +msgid "Save Match?" +msgstr "&Partie" + +#: core.cpp:710 +#, fuzzy +msgid "Save Match..." +msgstr "Spiel speichern &als..." + +#: dlg_challenge.cpp:25 +msgid "You've Been Challenged:" +msgstr "Sie wurden herausgefordert:" + +#: dlg_challenge.cpp:29 +msgid "Accept" +msgstr "Annehmen" + +#: dlg_challenge.cpp:30 +msgid "Decline" +msgstr "Ablehnen" + +#: dlg_challenge.cpp:49 +msgid "Time Odds Match" +msgstr "Partie mit unterschiedlicher Zeit" + +#: dlg_challenge.cpp:53 +msgid "Unrated" +msgstr "Nicht bewerted" + +#: dlg_challenge.cpp:54 +msgid "Rated" +msgstr "Bewerted" + +#: dlg_challenge.cpp:60 dlg_challenge.cpp:69 dlg_newmatch.cpp:87 +#: dlg_newmatch.cpp:104 tab_seeklist.cpp:101 +msgid " min." +msgstr " Min." + +#: dlg_challenge.cpp:61 dlg_challenge.cpp:70 dlg_newmatch.cpp:97 +#: dlg_newmatch.cpp:114 setpageservers.cpp:146 tab_seeklist.cpp:102 +msgid " sec." +msgstr " Sek." + +#: dlg_challenge.cpp:62 dlg_challenge.cpp:71 tab_seeklist.cpp:31 +msgid "Base Time" +msgstr "Basiszeit" + +#: dlg_challenge.cpp:63 dlg_challenge.cpp:72 tab_seeklist.cpp:32 +msgid "Increment" +msgstr "Erhöhen" + +#: dlg_challenge.cpp:109 +msgid "" +"%1 %2 vs. %3 %4\n" +"in a %5 match." +msgstr "" +"%1 %2 vs. %3 %4\n" +"in einer %5 Partie." + +#: dlg_challenge.cpp:124 dlg_challenge.cpp:125 +msgid "Time Controls" +msgstr "Zeiteinstellungen" + +#: dlg_challenge.cpp:154 +msgid "Counter Offer" +msgstr "Gegenangebot" + +#: dlg_engine.cpp:26 +msgid "Configure Engine" +msgstr "Engine konfigurieren" + +#: dlg_engine.cpp:38 +msgid "Engine Name" +msgstr "Name der Engine" + +#: dlg_engine.cpp:43 setpageengines.cpp:63 +msgid "Protocol" +msgstr "Protokoll" + +#: dlg_engine.cpp:48 +msgid "Engine Filename" +msgstr "Dateiname der Engine" + +#: dlg_engine.cpp:54 +msgid "Command Line Arguments" +msgstr "Kommandozeilenparameter" + +#: dlg_engine.cpp:59 dlg_server.cpp:88 +msgid "Log File" +msgstr "Log-Datei" + +#: dlg_login.cpp:21 +msgid "Login Prompt" +msgstr "Login" + +#: dlg_login.cpp:31 +msgid "Login:" +msgstr "Login:" + +#: dlg_login.cpp:32 +msgid "Password:" +msgstr "Passwort:" + +#: dlg_login.cpp:38 +msgid "Log in as guest" +msgstr "" + +#: dlg_login.cpp:54 +msgid "Login" +msgstr "Login" + +#: dlg_login.cpp:54 +msgid "Log in to the chess server using this name and password." +msgstr "Mit diesem Benutzer und Passwort beim Schachserver einwählen." + +#: dlg_newmatch.cpp:38 +#, fuzzy +msgid "Start a New Match" +msgstr "Eine Partie gegen den PC beginnen" + +#: dlg_newmatch.cpp:45 +#, fuzzy +msgid "White" +msgstr "Seite" + +#: dlg_newmatch.cpp:46 +#, fuzzy +msgid "Black" +msgstr "&Schwarz spielen" + +#: dlg_newmatch.cpp:59 dlg_newmatch.cpp:66 +msgid "Human" +msgstr "" + +#: dlg_newmatch.cpp:60 dlg_newmatch.cpp:67 +#, fuzzy +msgid "Computer" +msgstr "vs. Com&puter" + +#: dlg_newmatch.cpp:61 dlg_newmatch.cpp:68 +#, fuzzy +msgid "Email" +msgstr "vs. &Email" + +#: dlg_newmatch.cpp:85 dlg_newmatch.cpp:102 +#, fuzzy +msgid "Base Time:" +msgstr "Basiszeit" + +#: dlg_newmatch.cpp:90 dlg_newmatch.cpp:107 +#, fuzzy +msgid "Moves Per Base Time" +msgstr "Basiszeit" + +# German NAG values taken from: +# http://scid.sourceforge.net/dhelp/NAGs.html +#: dlg_newmatch.cpp:92 dlg_newmatch.cpp:109 +#, fuzzy +msgid " moves" +msgstr " Guter Zug" + +#: dlg_newmatch.cpp:95 dlg_newmatch.cpp:112 +#, fuzzy +msgid "Increment Per Move" +msgstr "Erhöhen" + +#: dlg_promote.cpp:94 +msgid "Promote your pawn to..." +msgstr "Bauer umwandeln in..." + +#: dlg_promote.cpp:101 +msgid "Pawn Promotion" +msgstr "Bauernumwandlung" + +#: dlg_selectemail.cpp:27 +msgid "Select Email Address" +msgstr "" + +#: dlg_selectengine.cpp:30 +msgid "Select Computer Player" +msgstr "" + +#: dlg_selectengine.cpp:41 +#, fuzzy +msgid "Computer Players" +msgstr "vs. Com&puter" + +#: dlg_selectengine.cpp:61 +#, fuzzy +msgid "Player Strength" +msgstr "Spieler History" + +#: dlg_selectengine.cpp:63 +msgid "Weak" +msgstr "" + +#: dlg_selectengine.cpp:70 +msgid "Strong" +msgstr "" + +#: dlg_server.cpp:25 +msgid "Configure Server" +msgstr "Server konfigurieren" + +#: dlg_server.cpp:37 +msgid "Server Name" +msgstr "Servername" + +#: dlg_server.cpp:44 +msgid "Server URL" +msgstr "Server URL" + +#: dlg_server.cpp:49 +msgid "Server Port" +msgstr "Server Port" + +#: dlg_server.cpp:56 +msgid "Username" +msgstr "Benutzername" + +#: dlg_server.cpp:59 +msgid "Remember My Password" +msgstr "Passwort speichern" + +#: dlg_server.cpp:64 +msgid "Password" +msgstr "Passwort" + +#: dlg_server.cpp:71 +msgid "Confirm Password" +msgstr "Passwort wiederholen" + +#: dlg_server.cpp:79 +msgid "Timeseal" +msgstr "Timeseal" + +#: dlg_settings.cpp:48 setpagedisplay.cpp:142 +msgid "General" +msgstr "Allgemein" + +#: dlg_settings.cpp:49 +msgid "Various aspects of Knights get configured here." +msgstr "Hier können verschiedene Einstellungen zu Knights vorgenommen werden." + +#: dlg_settings.cpp:55 +msgid "Display" +msgstr "Anzeige" + +#: dlg_settings.cpp:56 +msgid "These settings determine how Knights displays itself to you." +msgstr "Hier können Sie das Erscheinungsbild von Knights einstellen." + +#: dlg_settings.cpp:62 +msgid "Audio" +msgstr "Klänge" + +#: dlg_settings.cpp:63 +msgid "These settings determine what Knights sounds like." +msgstr "Hier können Sie die Klänge für Knights einrichten." + +#: dlg_settings.cpp:69 +msgid "Computer Opponents" +msgstr "Computergegner" + +#: dlg_settings.cpp:70 +msgid "Configure your chess engines here." +msgstr "Hier können Sie Ihre Schach-Engines einstellen." + +#: dlg_settings.cpp:76 setpageservers.cpp:65 +msgid "Chess Servers" +msgstr "Schach-Server" + +#: dlg_settings.cpp:77 +msgid "Configure your internet chess servers here." +msgstr "Hier können Sie Internet-Schach-Server konfigurieren." + +#: io_internet.cpp:80 +#, fuzzy +msgid "" +"There are no servers configured.\n" +"Please make sure you have at least one server configured." +msgstr "" +"Knights konnte Timeseal nicht starten.\n" +"Stellen Sie sicher, dass der angegebene Dateiname korrekt ist." + +#: io_internet.cpp:80 +#, fuzzy +msgid "Cannot find a server." +msgstr "Server nicht gefunden." + +#: io_internet.cpp:99 +msgid "" +"Knights can not start Timeseal.\n" +"Please make sure you have the correct path and filename configured." +msgstr "" +"Knights konnte Timeseal nicht starten.\n" +"Stellen Sie sicher, dass der angegebene Dateiname korrekt ist." + +#: io_internet.cpp:99 +#, fuzzy +msgid "Cannot find Timeseal." +msgstr "Timeseal nicht gefunden." + +#: io_internet.cpp:109 io_internet.cpp:121 +#, fuzzy +msgid "" +"Knights is unable to connect to the server.\n" +" Please make sure your internet connection is working and try again." +msgstr "" +"Knights konnte keine Verbindung mit diesem Server herstellen. Bitte " +"überprüfen Sie Benutzernamen und Passwort." + +#: io_internet.cpp:109 io_internet.cpp:121 +#, fuzzy +msgid "Cannot connect to server." +msgstr "Mit Server verbinden" + +#: io_internet.cpp:144 +#, fuzzy +msgid "%1 Console" +msgstr "Konsole" + +#: io_internet.cpp:149 +msgid "Sought Matches List" +msgstr "" + +#: io_internet.cpp:154 +msgid "Sought Matches Graph" +msgstr "" + +#: knights.cpp:70 main.cpp:34 +msgid "Knights" +msgstr "Knights" + +#: knights.cpp:250 +msgid "&Draw" +msgstr "&Remis" + +#: knights.cpp:254 +msgid "&Retract Move" +msgstr "Zug &zurücknehmen" + +#: knights.cpp:256 +msgid "Select this to retract your last move." +msgstr "Zurücknehmen Ihres letzten Zuges." + +#: knights.cpp:258 +msgid "Resign" +msgstr "Aufgeben" + +#: knights.cpp:260 +msgid "Use this to concede the match to your opponent." +msgstr "Dem Gegner das Spiel schenken." + +#: knights.cpp:262 +msgid "&Call Flag" +msgstr "Für &beendet erklären" + +#: knights.cpp:264 +#, fuzzy +msgid "" +"Use this to declare the match over, due to your opponent being out of time." +msgstr "" +"Das Spiel für beendet erklären. Dies funktioniert nur, wenn die Zeit des " +"Gegners abgelaufen ist." + +#: knights.cpp:266 +msgid "&Hint" +msgstr "&Vorschlag" + +#: knights.cpp:268 +msgid "This will ask your opponent for a hint." +msgstr "Ihren Gegner um einen Vorschlag bitten." + +#: knights.cpp:270 +msgid "Move &Now" +msgstr "&Jetzt ziehen" + +#: knights.cpp:272 +msgid "Clicking this option will force your opponent to move immediately." +msgstr "Ihren Gegner zwingen, sofort einen Zug zu machen." + +#: knights.cpp:274 +msgid "&Flip View" +msgstr "Ansicht &umdrehen" + +#: knights.cpp:276 +msgid "This will reverse the chessboard's orientation by 180 degrees." +msgstr "Dreht das Schachbrett um 180 Grad." + +#: knights.cpp:278 +msgid "&Ponder" +msgstr "Nach&denken" + +#: knights.cpp:281 +msgid "This toggles your opponent's ability to think while it's your turn." +msgstr "Die Fähigkeit des Gegners, während Ihres Zugs zu denken." + +#: knights.cpp:285 knights.cpp:949 +msgid "Pause" +msgstr "Pause" + +#: knights.cpp:287 +msgid "Select this to pause the clock for this match." +msgstr "Die Uhr für diese Partie anhalten." + +#: knights.cpp:292 +msgid "&Offer Draw" +msgstr "Remis &anbieten" + +#: knights.cpp:293 +#, fuzzy +msgid "" +"Clicking this will inform your opponent that you are willing draw the match." +msgstr "" +"Ihren Gegner darüber informieren, dass Sie bereit sind, dieses Spiel mit " +"einem Remis zu beenden." + +#: knights.cpp:295 +msgid "&Accept Draw" +msgstr "Remis a&nnehmen" + +#: knights.cpp:296 +msgid "Clicking this will accept a draw offered by your opponent." +msgstr "Ein Remis-Angebot Ihres Gegners annehmen." + +#: knights.cpp:298 +msgid "&Reject Draw" +msgstr "Remis a&blehnen" + +#: knights.cpp:299 +msgid "Clicking this will reject a draw offered by your opponent." +msgstr "Ein Remis-Angebot Ihres Gegners ablehnen." + +#: knights.cpp:301 +msgid "&Ignore Draw" +msgstr "Remis &ignorieren" + +#: knights.cpp:302 +msgid "Clicking this will ignore future draw offers from your opponent." +msgstr "Alle weiteren Remis-Angebote Ihres Gegners ignorieren." + +#: knights.cpp:308 +#, fuzzy +msgid "&New Match..." +msgstr "&Partie" + +#: knights.cpp:309 +msgid "This allows you to begin a new match." +msgstr "Ein neues Spiel beginnen." + +#: knights.cpp:312 +#, fuzzy +msgid "&Load Match..." +msgstr "Spiel &laden..." + +#: knights.cpp:313 +#, fuzzy +msgid "" +"The Load command will allow you to select a previously saved match and play " +"it again." +msgstr "Ein vorher gespeichertes Spiel laden und weiterspielen." + +#: knights.cpp:316 thinbuttons.cpp:40 +#, fuzzy +msgid "&Close Match" +msgstr "Spiel s&chliessen" + +#: knights.cpp:318 +msgid "This command removes the current match." +msgstr "Die aktuelle Partie entfernen." + +#: knights.cpp:320 +msgid "Close All" +msgstr "Alle schließen" + +#: knights.cpp:322 +msgid "This command will remove all matches that are currently loaded." +msgstr "Alle Partien, die zur Zeit geladen sind, entfernen." + +#: knights.cpp:326 thinbuttons.cpp:32 +#, fuzzy +msgid "&Save Match" +msgstr "&Partie" + +#: knights.cpp:328 knights.cpp:333 +#, fuzzy +msgid "" +"The Save command will allow you to store a copy of your current match for " +"later use." +msgstr "Das aktuelle Spiel speichern." + +#: knights.cpp:331 thinbuttons.cpp:34 +#, fuzzy +msgid "Save Match &As..." +msgstr "Spiel speichern &als..." + +#: knights.cpp:337 knights.cpp:859 +msgid "Connect to Server" +msgstr "Mit Server verbinden" + +#: knights.cpp:338 +msgid "Clicking this will connect Knights with an internet chess server." +msgstr "Knights mit einem Internet-Schach-Server verbinden." + +#: knights.cpp:342 thinbuttons.cpp:37 +msgid "&Print Notation..." +msgstr "Aus&drucken..." + +#: knights.cpp:344 +#, fuzzy +msgid "" +"The Print command will allow you to print this game's notation on your " +"printer." +msgstr "" +"Dieses Kommando ermöglicht es Ihnen, ein Protokoll dieser Partie " +"auszudrucken." + +#: knights.cpp:349 +#, fuzzy +msgid "The Quit command will stop all matches and exit Knights." +msgstr "Das aktuelle Spiel anhalten und Knights beenden." + +#: knights.cpp:355 +msgid "Play &White" +msgstr "&Weiß spielen" + +#: knights.cpp:358 +msgid "" +"If checked, this option tells Knights that you will play as the White army " +"when you play vs. the computer." +msgstr "" +"Wenn diese Option ausgewählt ist, werden Sie bei einem Spiel gegen den " +"Computer weiß spielen." + +#: knights.cpp:360 +msgid "Play &Black" +msgstr "&Schwarz spielen" + +#: knights.cpp:363 +msgid "" +"If checked, this option tells Knights that you will play as the Black army " +"when you play vs. the computer." +msgstr "" +"Wenn diese Option ausgewählt ist, werden Sie bei einem Spiel gegen den " +"Computer schwarz spielen." + +#: knights.cpp:366 +#, fuzzy +msgid "&Install Themes" +msgstr "Neue Themes installieren" + +#: knights.cpp:367 +msgid "This lets you install downloaded themes into Knights." +msgstr "" + +#: knights.cpp:371 +msgid "" +"Click this if you want to change the keyboard shortcuts that Knights uses." +msgstr "Hier können Sie die Tastaturkürzel, die Knights verwendet, verändern." + +#: knights.cpp:374 +msgid "&Configure Knights..." +msgstr "Knights &konfigurieren..." + +#: knights.cpp:375 +msgid "" +"This opens a new window which allows you to customize Knights to your " +"particular tastes." +msgstr "" +"Ein neues Fenster öffnen, in dem Einstellungen zu Knights vorgenommen werden " +"können." + +#: knights.cpp:381 +msgid "Begin a Tutorial" +msgstr "Einführung beginnen" + +#: knights.cpp:387 +msgid "&Match" +msgstr "&Partie" + +#: knights.cpp:576 +#, fuzzy +msgid "Error with white engine" +msgstr "Fehler bei weißer Engine" + +#: knights.cpp:578 +msgid "" +"You selected %1 to play white,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play white." +msgstr "" +"Sie haben ausgewählt, dass %1\n" +"weiß spielen soll. Es handelt sich jedoch\n" +"um eine Book-Engine. Bitte wählen Sie eine\n" +"andere Engine aus." + +#: knights.cpp:579 +msgid "White Engine Problem" +msgstr "Problem mit weißer Engine" + +#: knights.cpp:582 +#, fuzzy +msgid "Error with white book engine" +msgstr " Fehler in Book Engine" + +#: knights.cpp:584 +msgid "" +"You selected %1 to play white's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play white's book." +msgstr "" +"Sie haben %1 als Book Engine für weiß\n" +"ausgewählt. Es handelt sich jedoch um eine\n" +"normale Engine. Bitte wählen Sie eine andere\n" +"Engine aus." + +#: knights.cpp:585 +msgid "White Book Engine Problem" +msgstr "Problem mit weißer Book-Engine" + +#: knights.cpp:588 +#, fuzzy +msgid "Error with black engine" +msgstr " Problem mit schwarzer Engine" + +#: knights.cpp:590 +msgid "" +"You selected %1 to play black,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play black." +msgstr "" +"Sie haben ausgewählt, dass %1\n" +"schwarz spielen soll. Es handelt sich jedoch\n" +"um eine Book-Engine. Bitte wählen Sie eine\n" +"andere Engine aus." + +#: knights.cpp:591 +msgid "Black Engine Problem" +msgstr "Problem mit schwarzer Engine" + +#: knights.cpp:594 +#, fuzzy +msgid "Error with black book engine" +msgstr " Problem mit schwarzer Book-Engine" + +#: knights.cpp:596 +msgid "" +"You selected %1 to play black's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play black's book." +msgstr "" +"Sie haben %1 als Book Engine für schwarz\n" +"ausgewählt. Es handelt sich jedoch um eine\n" +"normale Engine. Bitte wählen Sie eine andere\n" +"Engine aus." + +#: knights.cpp:597 +msgid "Black Book Engine Problem" +msgstr "Problem mit schwarzer Book-Engine" + +#: knights.cpp:600 +#, fuzzy +msgid "The computer opponent assigned to play %1 has crashed" +msgstr " Der Computergegner, der %1 spielen sollte, ist abgestürzt" + +#: knights.cpp:603 +#, fuzzy +msgid "There was an error while loading the file" +msgstr " Beim Laden der Datei ist ein Fehler aufgetreten" + +#: knights.cpp:606 +#, fuzzy +msgid "There was an error while saving the file" +msgstr " Beim Speichern der Datei ist ein Fehler aufgetreten" + +#: knights.cpp:610 +#, fuzzy +msgid "Loading complete" +msgstr " Laden erfolgreich" + +#: knights.cpp:613 +#, fuzzy +msgid "Saving complete" +msgstr " Speichern erfolgreich" + +#: knights.cpp:616 +#, fuzzy +msgid "Reading File" +msgstr " Lese Datei" + +#: knights.cpp:619 +#, fuzzy +msgid "Can not move a chessman while reviewing the match" +msgstr "" +" Während der Wiederholung des Spiels können keine Figuren bewegt werden" + +#: knights.cpp:622 +#, fuzzy +msgid "Illegal Move" +msgstr " Ungültiger Zug" + +#: knights.cpp:625 +#, fuzzy +msgid "White's turn" +msgstr " Weiß am Zug" + +#: knights.cpp:628 +#, fuzzy +msgid "Black's turn" +msgstr " Schwarz am Zug" + +#: knights.cpp:631 +#, fuzzy +msgid "White wins" +msgstr " Weiß gewinnt" + +#: knights.cpp:634 +#, fuzzy +msgid "Black wins" +msgstr " Schwarz gewinnt" + +#: knights.cpp:637 +#, fuzzy +msgid "Checkmate, White wins" +msgstr " Schachmatt, Weiß gewinnt" + +#: knights.cpp:640 +#, fuzzy +msgid "Checkmate, Black wins" +msgstr " Schachmatt, schwarz gewinnt" + +#: knights.cpp:643 +#, fuzzy +msgid "White resigns" +msgstr " Weiß gibt auf" + +#: knights.cpp:646 +#, fuzzy +msgid "Black resigns" +msgstr " Schwarz gibt auf" + +#: knights.cpp:649 +#, fuzzy +msgid "White's flag fell" +msgstr " Zeit von Weiß abgelaufen" + +#: knights.cpp:652 +#, fuzzy +msgid "Black's flag fell" +msgstr " Zeit von Schwarz abgelaufen" + +#: knights.cpp:655 +#, fuzzy +msgid "Black's flag was called, White wins" +msgstr "Weiß gewinnt wegen Zeitüberschreitung" + +#: knights.cpp:658 +#, fuzzy +msgid "White's flag was called, Black wins" +msgstr "Schwarz gewinnt wegen Zeitüberschreitung" + +#: knights.cpp:661 +#, fuzzy +msgid "Draw match" +msgstr " Remis" + +#: knights.cpp:664 +#, fuzzy +msgid "50 moves rule, draw match" +msgstr " 50-Zug-Regel, Remis" + +#: knights.cpp:667 +#, fuzzy +msgid "Starting computer players, please wait" +msgstr " Starte Computerspieler, bitte warten" + +#: knights.cpp:670 +#, fuzzy +msgid "Match paused" +msgstr "Art der Partie" + +#: knights.cpp:673 +#, fuzzy +msgid "White has offered a draw" +msgstr " Weiß hat ein Remis angeboten" + +#: knights.cpp:676 +#, fuzzy +msgid "Black has offered a draw" +msgstr " Schwarz hat ein Remis angeboten" + +#: knights.cpp:679 +#, fuzzy +msgid "Lost contact with opponent" +msgstr " Verbindung mit Gegner abgebrochen" + +#: knights.cpp:682 +#, fuzzy +msgid "Ready" +msgstr " Bereit" + +#: knights.cpp:866 +msgid "Disconnect from Server" +msgstr "Verbindung mit Server trennen" + +#: knights.cpp:955 +msgid "Resume" +msgstr "Fortsetzen" + +#: knights.cpp:1014 +#, fuzzy +msgid "Knights Themes" +msgstr "Knights" + +#: knights.cpp:1015 +#, fuzzy +msgid "Install Theme..." +msgstr "Neue Themes installieren" + +#: knights.cpp:1045 +msgid "" +"You do not have permission to install this theme systemwide, so Knights " +"installed it locally." +msgstr "" +"Sie haben keine ausreichenden Rechte, um das Theme systemweit zu " +"installieren. Daher wurde es von Knights lokal installiert." + +#: knights.cpp:1046 +msgid "Installed theme locally" +msgstr "Theme lokal installiert" + +#: knights.cpp:1051 +#, c-format +msgid "" +"The theme could not be installed:\n" +"%1" +msgstr "" +"Das Theme konnte nicht im folgenden Verzeichnis installiert werden:\n" +"%1" + +#: knights.cpp:1052 +msgid "Can not install theme" +msgstr "Kann Theme nicht installieren" + +#: knightstextview.cpp:35 +msgid "Select &All" +msgstr "&Alles auswählen" + +#: knightstextview.cpp:44 +msgid "Zoom &In" +msgstr "" + +#: knightstextview.cpp:46 +msgid "Zoom &Out" +msgstr "" + +#: list_pgn.cpp:29 list_pgn.cpp:48 +msgid "Result" +msgstr "Ergebnis" + +#: list_pgn.cpp:30 list_pgn.cpp:49 +msgid "Title" +msgstr "Titel" + +#: list_pgn.cpp:31 list_pgn.cpp:50 +msgid "Round" +msgstr "Runde" + +#: list_pgn.cpp:32 list_pgn.cpp:51 +#, fuzzy +msgid "Site" +msgstr "Seite" + +#: list_pgn.cpp:33 list_pgn.cpp:52 +msgid "Date" +msgstr "Datum" + +#: list_pgn.cpp:81 +#, c-format +msgid "Can not open %1" +msgstr "%1 konnte nicht geöffnet werden" + +#: list_pgn.cpp:140 +msgid "%1 matches found." +msgstr "%1 Partien gefunden" + +#: main.cpp:26 +msgid "Specify the location of your Knights data directory." +msgstr "Wählen Sie Ihr Knights Datenverzeichnis aus" + +#: main.cpp:27 +msgid "A .pgn file to be loaded." +msgstr "Zu ladende .pgn-Datei." + +#: main.cpp:36 +#, fuzzy +msgid "" +"The Knights Chess Interface\n" +"\n" +"Knights is a chess interface\n" +"for the K Desktop Environment." +msgstr "" +"Knight - Die grafische Schach-Oberfläche\n" +"\n" +"Knights ist eine Schach-Oberfläche\n" +"für das K Desktop Environment (KDE)." + +#: main.cpp:44 +#, fuzzy +msgid "Project Manager and Programmer" +msgstr "Projektleider and Programmierer" + +#: main.cpp:48 +msgid "Communications Programmer" +msgstr "" + +#: main.cpp:52 +msgid "Qtopia port and patches" +msgstr "" + +#: main.cpp:56 +msgid "Patches and suggestions" +msgstr "Patches und Verbesserungsvorschläge" + +#: main.cpp:60 +msgid "KDE3 Compatability Patch" +msgstr "KDE3 Kompatibilitäts-Patch" + +#: main.cpp:64 +msgid "XBoard protocol" +msgstr "XBoard-Protokoll" + +#: _translatorinfo.cpp:1 main.cpp:67 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Sascha Müller" + +#: _translatorinfo.cpp:3 main.cpp:68 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "dev@saschamueller.com" + +#: match_param.cpp:107 +msgid "Unknown" +msgstr "" + +#: pgn.cpp:145 +msgid "%1 vs. %2" +msgstr "%1 vs. %2" + +#: pgn.cpp:943 +#, c-format +msgid "Page %1" +msgstr "Seite %1" + +# German NAG values taken from: +# http://scid.sourceforge.net/dhelp/NAGs.html +#: pgn.cpp:975 +msgid " Good move" +msgstr " Guter Zug" + +#: pgn.cpp:978 +msgid " Poor move" +msgstr " Schwacher Zug" + +#: pgn.cpp:981 +msgid " Very good move" +msgstr " Ausgezeichneter Zug" + +#: pgn.cpp:984 +msgid " Very poor move" +msgstr " Patzer / Grober Fehler" + +#: pgn.cpp:987 +msgid " Speculative move" +msgstr " Interessanter Zug" + +#: pgn.cpp:990 +msgid " Questionable move" +msgstr " Zweifelhafter Zug" + +#: pgn.cpp:993 +msgid " Forced move" +msgstr " Erzwungener Zug" + +#: pgn.cpp:996 +msgid " Singular move" +msgstr " Der einzige Zug; keine vernünftige Alternative" + +#: pgn.cpp:999 +msgid " Worst move" +msgstr " Schlechtester Zug" + +#: pgn.cpp:1002 +msgid " Drawish position" +msgstr " Ausgeglichene Position" + +#: pgn.cpp:1005 +msgid " Equal chances, quiet position" +msgstr " Gleiche Chancen, ruhige Stellung " + +#: pgn.cpp:1008 +msgid " Equal chances, active position" +msgstr " Gleiche Chancen, aktive Stellung" + +#: pgn.cpp:1011 +msgid " Unclear position" +msgstr " Unklare Position" + +#: pgn.cpp:1014 +msgid " White has a slight advantage" +msgstr " Weiß hat leichten Vorteil, steht etwas besser" + +#: pgn.cpp:1017 +msgid " Black has a slight advantage" +msgstr " Schwarz hat leichten Vorteil, steht etwas besser" + +#: pgn.cpp:1020 +msgid " White has a moderate advantage" +msgstr " Weiß hat Vorteil, steht besser" + +#: pgn.cpp:1023 +msgid " Black has a moderate advantage" +msgstr " Schwarz hat Vorteil, steht besser" + +#: pgn.cpp:1026 +msgid " White has a decisive advantage" +msgstr " Weiß hat entscheidenden Vorteil" + +#: pgn.cpp:1029 +msgid " Black has a decisive advantage" +msgstr " Schwarz hat entscheidenden Vorteil" + +#: pgn.cpp:1032 +msgid " White has a crushing advantage ( Black should resign )" +msgstr " Weiß hat überwältigenden Vorteil" + +#: pgn.cpp:1035 +msgid " Black has a crushing advantage ( White should resign )" +msgstr " Schwarz hat überwältigenden Vorteil" + +#: pgn.cpp:1038 +msgid " White is in zugzwang" +msgstr " Weiß ist in Zugzwang" + +#: pgn.cpp:1041 +msgid " Black is in zugzwang" +msgstr " Schwarz ist in Zugzwang" + +#: pgn.cpp:1044 +msgid " White has a slight space advantage" +msgstr " Weiß hat leichten Raumvorteil" + +#: pgn.cpp:1047 +msgid " Black has a slight space advantage" +msgstr " Schwarz hat leichten Raumvorteil" + +#: pgn.cpp:1050 +msgid " White has a moderate space advantage" +msgstr " Weiß hat Raumvorteil" + +#: pgn.cpp:1053 +msgid " Black has a moderate space advantage" +msgstr " Schwarz hat Raumvorteil" + +#: pgn.cpp:1056 +msgid " White has a decisive space advantage" +msgstr " Weiß hat entscheidenden Raumvorteil" + +#: pgn.cpp:1059 +msgid " Black has a decisive space advantage" +msgstr " Schwarz hat entscheidenden Raumvorteil" + +#: pgn.cpp:1062 +msgid " White has a slight time ( development ) advantage" +msgstr " Weiß hat leichten Zeit-(Entwickllungs)vorsprung" + +#: pgn.cpp:1065 +msgid " Black has a slight time ( development ) advantage" +msgstr " Schwarz hat leichten Zeit-(Entwickllungs)vorsprung" + +#: pgn.cpp:1068 +msgid " White has a moderate time ( development ) advantage" +msgstr " Weiß hat Zeit-(Entwickllungs)vorsprung" + +#: pgn.cpp:1071 +msgid " Black has a moderate time ( development ) advantage" +msgstr " Schwarz hat Zeit-(Entwickllungs)vorsprung" + +#: pgn.cpp:1074 +msgid " White has a decisive time ( development ) advantage" +msgstr " Weiß hat entscheidenden Zeit-(Entwickllungs)vorsprung" + +#: pgn.cpp:1077 +msgid " Black has a decisive time ( development ) advantage" +msgstr " Schwarz hat entscheidenden Zeit-(Entwickllungs)vorsprung" + +#: pgn.cpp:1080 +msgid " White has the initiative" +msgstr " Weiß hat die Initiative" + +#: pgn.cpp:1083 +msgid " Black has the initiative" +msgstr " Schwarz hat die Initiative" + +#: pgn.cpp:1086 +msgid " White has a lasting initiative" +msgstr " Weiß hat andauernde Initiative" + +#: pgn.cpp:1089 +msgid " Black has a lasting initiative" +msgstr " Schwarz hat andauernde Initiative" + +#: pgn.cpp:1092 +msgid " White has the attack" +msgstr " Weiß hat Angriff" + +#: pgn.cpp:1095 +msgid " Black has the attack" +msgstr " Schwarz hat Angriff" + +#: pgn.cpp:1098 +msgid " White has insufficient compensation for material deficit" +msgstr " Weiß hat keine ausreichende Kompensation für das Material" + +#: pgn.cpp:1101 +msgid " Black has insufficient compensation for material deficit" +msgstr " Schwarz hat keine ausreichende Kompensation für das Material" + +#: pgn.cpp:1104 +msgid " White has sufficient compensation for material deficit" +msgstr " Weiß hat ausreichende Kompensation für das Material" + +#: pgn.cpp:1107 +msgid " Black has sufficient compensation for material deficit" +msgstr " Schwarz hat ausreichende Kompensation für das Material" + +#: pgn.cpp:1110 +msgid " White has more than adequate compensation for material deficit" +msgstr " Weiß hat mehr als ausreichende Kompensation für das Material" + +#: pgn.cpp:1113 +msgid " Black has more than adequate compensation for material deficit" +msgstr " Schwarz hat mehr als ausreichende Kompensation für das Material" + +#: pgn.cpp:1116 +msgid " White has a slight center control advantage" +msgstr " Weiß hat leichtes Übergewicht im Zentrum" + +#: pgn.cpp:1119 +msgid " Black has a slight center control advantage" +msgstr " Schwarz hat leichtes Übergewicht im Zentrum" + +#: pgn.cpp:1122 +msgid " White has a moderate center control advantage" +msgstr " Weiß hat Übergewicht im Zentrum" + +#: pgn.cpp:1125 +msgid " Black has a moderate center control advantage" +msgstr " Schwarz hat Übergewicht im Zentrum" + +#: pgn.cpp:1128 +msgid " White has a decisive center control advantage" +msgstr " Weiß hat entscheidendes Übergewicht im Zentrum" + +#: pgn.cpp:1131 +msgid " Black has a decisive center control advantage" +msgstr " Schwarz hat entscheidendes Übergewicht im Zentrum" + +#: pgn.cpp:1134 +msgid " White has a slight kingside control advantage" +msgstr " Weiß hat leichtes Übergewicht am Königsflügel" + +#: pgn.cpp:1137 +msgid " Black has a slight kingside control advantage" +msgstr " Schwarz hat leichtes Übergewicht am Königsflügel" + +#: pgn.cpp:1140 +msgid " White has a moderate kingside control advantage" +msgstr " Weiß hat Übergewicht am Königsflügel" + +#: pgn.cpp:1143 +msgid " Black has a moderate kingside control advantage" +msgstr " Schwarz hat Übergewicht am Königsflügel" + +#: pgn.cpp:1146 +msgid " White has a decisive kingside control advantage" +msgstr " Weiß hat entscheidendes Übergewicht am Königsflügel" + +#: pgn.cpp:1149 +msgid " Black has a decisive kingside control advantage" +msgstr " Schwarz hat entscheidendes Übergewicht am Königsflügel" + +#: pgn.cpp:1152 +msgid " White has a slight queenside control advantage" +msgstr " Weiß hat leichtes Übergewicht am Damenflügel" + +#: pgn.cpp:1155 +msgid " Black has a slight queenside control advantage" +msgstr " Schwarz hat leichtes Übergewicht am Damenflügel" + +#: pgn.cpp:1158 +msgid " White has a moderate queenside control advantage" +msgstr " Weiß hat Übergewicht am Damenflügel" + +#: pgn.cpp:1161 +msgid " Black has a moderate queenside control advantage" +msgstr " Schwarz hat Übergewicht am Damenflügel" + +#: pgn.cpp:1164 +msgid " White has a decisive queenside control advantage" +msgstr " Weiß hat entscheidendes Übergewicht am Damenflügel" + +#: pgn.cpp:1167 +msgid " Black has a decisive queenside control advantage" +msgstr " Schwarz hat entscheidendes Übergewicht am Damenflügel" + +#: pgn.cpp:1170 +msgid " White has a vulnerable first rank" +msgstr " Weiß hat eine schwache Grundreihe" + +#: pgn.cpp:1173 +msgid " Black has a vulnerable first rank" +msgstr " Schwarz hat eine schwache Grundreihe" + +#: pgn.cpp:1176 +msgid " White has a well protected first rank" +msgstr " Weiß hat eine gut gesicherte Grundreihe" + +#: pgn.cpp:1179 +msgid " Black has a well protected first rank" +msgstr " Schwarz hat eine gut gesicherte Grundreihe" + +#: pgn.cpp:1182 +msgid " White has a poorly protected king" +msgstr " Weiß hat einen schlecht gesicherten König" + +#: pgn.cpp:1185 +msgid " Black has a poorly protected king" +msgstr " Schwarz hat einen schlecht gesicherten König" + +#: pgn.cpp:1188 +msgid " White has a well protected king" +msgstr " Weiß hat einen gut gesicherten König" + +#: pgn.cpp:1191 +msgid " Black has a well protected king" +msgstr " Schwarz hat einen gut gesicherten König" + +#: pgn.cpp:1194 +msgid " White has a poorly placed king" +msgstr " Der weiße König steht schlecht" + +#: pgn.cpp:1197 +msgid " Black has a poorly placed king" +msgstr " Der schwarze König steht schlecht" + +#: pgn.cpp:1200 +msgid " White has a well placed king" +msgstr " Der weiße König steht gut" + +#: pgn.cpp:1203 +msgid " Black has a well placed king" +msgstr " Der weiße König steht schlecht" + +#: pgn.cpp:1206 +msgid " White has a very weak pawn structure" +msgstr " Weiß hat eine sehr schwache Bauernstruktur" + +#: pgn.cpp:1209 +msgid " Black has a very weak pawn structure" +msgstr " Schwarz hat eine sehr schwache Bauernstruktur" + +#: pgn.cpp:1212 +msgid " White has a moderately weak pawn structure" +msgstr " Weiß hat eine schwache Bauernstruktur" + +#: pgn.cpp:1215 +msgid " Black has a moderately weak pawn structure" +msgstr " Schwarz hat eine schwache Bauernstruktur" + +#: pgn.cpp:1218 +msgid " White has a moderately strong pawn structure" +msgstr " Weiß hat eine starke Bauernstruktur" + +#: pgn.cpp:1221 +msgid " Black has a moderately strong pawn structure" +msgstr " Schwarz hat eine starke Bauernstruktur" + +#: pgn.cpp:1224 +msgid " White has a very strong pawn structure" +msgstr " Weiß hat eine sehr starke Bauernstruktur" + +#: pgn.cpp:1227 +msgid " Black has a very strong pawn structure" +msgstr " Schwarz hat eine sehr starke Bauernstruktur" + +#: pgn.cpp:1230 +msgid " White has poor knight placement" +msgstr " Der weiße Springer steht schlecht" + +#: pgn.cpp:1233 +msgid " Black has poor knight placement" +msgstr " Der schwarze Springer steht schlecht" + +#: pgn.cpp:1236 +msgid " White has good knight placement" +msgstr " Der weiße König steht gut" + +#: pgn.cpp:1239 +msgid " Black has good knight placement" +msgstr " Der schwarze König steht gut" + +#: pgn.cpp:1242 +msgid " White has poor bishop placement" +msgstr " Der weiße Läufer steht schlecht" + +#: pgn.cpp:1245 +msgid " Black has poor bishop placement" +msgstr " Der schwarze Läufer steht schlecht" + +#: pgn.cpp:1248 +msgid " White has good bishop placement" +msgstr " Der weiße Läufer steht gut" + +#: pgn.cpp:1251 +msgid " Black has good bishop placement" +msgstr " Der schwarze Läufer steht gut" + +#: pgn.cpp:1254 +msgid " White has poor rook placement" +msgstr " Der weiße Turm steht schlecht" + +#: pgn.cpp:1257 +msgid " Black has poor rook placement" +msgstr " Der schwarze Turm steht schlecht" + +#: pgn.cpp:1260 +msgid " White has good rook placement" +msgstr " Der weiße Turm steht gut" + +#: pgn.cpp:1263 +msgid " Black has good rook placement" +msgstr " Der schwarze Turm steht gut" + +#: pgn.cpp:1266 +msgid " White has poor queen placement" +msgstr " Die weiße Dame steht schlecht" + +#: pgn.cpp:1269 +msgid " Black has poor queen placement" +msgstr " Die schwarze Dame steht schlecht" + +#: pgn.cpp:1272 +msgid " White has good queen placement" +msgstr " Die weiße Dame steht gut" + +#: pgn.cpp:1275 +msgid " Black has good queen placement" +msgstr " Die schwarze Dame steht gut" + +#: pgn.cpp:1278 +msgid " White has poor piece coordination" +msgstr " Die weißen Figuren sind schlecht koordiniert" + +#: pgn.cpp:1281 +msgid " Black has poor piece coordination" +msgstr " Die schwarzen Figuren sind schlecht koordiniert" + +#: pgn.cpp:1284 +msgid " White has good piece coordination" +msgstr " Die weißen Figuren sind gut koordiniert" + +#: pgn.cpp:1287 +msgid " Black has good piece coordination" +msgstr " Die schwarzen Figuren sind gut koordiniert" + +#: pgn.cpp:1290 +msgid " White has played the opening very poorly" +msgstr " Weiß hat die Eröffnung sehr schwach behandelt" + +#: pgn.cpp:1293 +msgid " Black has played the opening very poorly" +msgstr " Schwarz hat die Eröffnung sehr schwach behandelt" + +#: pgn.cpp:1296 +msgid " White has played the opening poorly" +msgstr " Weiß hat die Eröffnung schwach behandelt" + +#: pgn.cpp:1299 +msgid " Black has played the opening poorly" +msgstr " Schwarz hat die Eröffnung schwach behandelt" + +#: pgn.cpp:1302 +msgid " White has played the opening well" +msgstr " Weiß hat die Eröffnung gut behandelt" + +#: pgn.cpp:1305 +msgid " Black has played the opening well" +msgstr " Schwarz hat die Eröffnung gut behandelt" + +#: pgn.cpp:1308 +msgid " White has played the opening very well" +msgstr " Weiß hat die Eröffnung sehr gut behandelt" + +#: pgn.cpp:1311 +msgid " Black has played the opening very well" +msgstr " Schwarz hat die Eröffnung sehr gut behandelt" + +#: pgn.cpp:1314 +msgid " White has played the middlegame very poorly" +msgstr " Weiß hat das Mittelspiel sehr schwach behandelt" + +#: pgn.cpp:1317 +msgid " Black has played the middlegame very poorly" +msgstr " Schwarz hat das Mittelspiel sehr schwach behandelt" + +#: pgn.cpp:1320 +msgid " White has played the middlegame poorly" +msgstr " Weiß hat das Mittelspiel schwach behandelt" + +#: pgn.cpp:1323 +msgid " Black has played the middlegame poorly" +msgstr " Schwarz hat das Mittelspiel schwach behandelt" + +#: pgn.cpp:1326 +msgid " White has played the middlegame well" +msgstr " Weiß hat das Mittelspiel gut behandelt" + +#: pgn.cpp:1329 +msgid " Black has played the middlegame well" +msgstr " Schwarz hat das Mittelspiel gut behandelt" + +#: pgn.cpp:1332 +msgid " White has played the middlegame very well" +msgstr " Weiß hat das Mittelspiel sehr gut behandelt" + +#: pgn.cpp:1335 +msgid " Black has played the middlegame very well" +msgstr " Schwarz hat das Mittelspiel sehr gut behandelt" + +#: pgn.cpp:1338 +msgid " White has played the ending very poorly" +msgstr " Weiß hat das Endspiel sehr schwach behandelt" + +#: pgn.cpp:1341 +msgid " Black has played the ending very poorly" +msgstr " Schwarz hat das Endspiel sehr schwach behandelt" + +#: pgn.cpp:1344 +msgid " White has played the ending poorly" +msgstr " Weiß hat das Endspiel schwach behandelt" + +#: pgn.cpp:1347 +msgid " Black has played the ending poorly" +msgstr " Schwarz hat das Endspiel schwach behandelt" + +#: pgn.cpp:1350 +msgid " White has played the ending well" +msgstr " Weiß hat das Endspiel gut behandelt" + +#: pgn.cpp:1353 +msgid " Black has played the ending well" +msgstr " Schwarz hat das Endspiel gut behandelt" + +#: pgn.cpp:1356 +msgid " White has played the ending very well" +msgstr " Weiß hat das Endspiel sehr gut behandelt" + +#: pgn.cpp:1359 +msgid " Black has played the ending very well" +msgstr " Schwarz hat das Endspiel sehr gut behandelt" + +#: pgn.cpp:1362 +msgid " White has slight counterplay" +msgstr " Weiß hat etwas Gegenspiel" + +#: pgn.cpp:1365 +msgid " Black has slight counterplay" +msgstr " Schwarz hat etwas Gegenspiel" + +#: pgn.cpp:1368 +msgid " White has moderate counterplay" +msgstr " Weiß hat Gegenspiel" + +#: pgn.cpp:1371 +msgid " Black has moderate counterplay" +msgstr " Schwarz hat Gegenspiel" + +#: pgn.cpp:1374 +msgid " White has decisive counterplay" +msgstr " Weiß hat entscheidendes Gegenspiel" + +#: pgn.cpp:1377 +msgid " Black has decisive counterplay" +msgstr " Schwarz hat entscheidendes Gegenspiel" + +#: pgn.cpp:1380 +msgid " White has moderate time control pressure" +msgstr " Weiß ist in leichter Zeitnot" + +#: pgn.cpp:1383 +msgid " Black has moderate time control pressure" +msgstr " Schwarz ist in leichter Zeitnot" + +#: pgn.cpp:1386 +msgid " White has severe time control pressure" +msgstr " Weiß ist in erheblicher Zeitnot" + +#: pgn.cpp:1389 +msgid " Black has severe time control pressure" +msgstr " Schwarz ist in erheblicher Zeitnot" + +#: pgn.cpp:1391 +msgid " With the idea..." +msgstr " Mit der Idee..." + +#: pgn.cpp:1394 +msgid " Aimed against..." +msgstr " Gerichtet gegen..." + +#: pgn.cpp:1397 +msgid " Better Move" +msgstr " Besser ist" + +#: pgn.cpp:1400 +msgid " Worse Move" +msgstr " Schlechter ist" + +#: pgn.cpp:1403 +msgid " Equivalent move" +msgstr " Gleichwertig ist" + +#: pgn.cpp:1406 +msgid " Editor's Remark" +msgstr " Anmerkung des Herausgebers" + +#: pgn.cpp:1409 +msgid " Novelty" +msgstr " Neuerung" + +#: pgn.cpp:1412 +msgid " Weak point" +msgstr " Schwacher Punkt" + +#: pgn.cpp:1415 +msgid " Endgame" +msgstr " Endspiel" + +#: pgn.cpp:1418 +msgid " Line" +msgstr " Linie" + +#: pgn.cpp:1421 +msgid " Diagonal" +msgstr " Diagonale" + +#: pgn.cpp:1424 +msgid " White has a pair of Bishops" +msgstr " Weiß hat das Läuferpaar" + +#: pgn.cpp:1427 +msgid " Black has a pair of Bishops" +msgstr " Schwarz hat das Läuferpaar" + +#: pgn.cpp:1430 +msgid " Bishops of opposite color" +msgstr " Verschiedenfarbige Läufer" + +#: pgn.cpp:1433 +msgid " Bishops of same color" +msgstr " Gleichfarbige Läufer" + +#: pgn.cpp:1436 +msgid " Etc." +msgstr " Etc." + +#: pgn.cpp:1439 +msgid " Doubled pawns" +msgstr " Doppelbauern" + +#: pgn.cpp:1442 +msgid " Isolated pawn" +msgstr " Isolierte Bauern" + +#: pgn.cpp:1445 +msgid " Connected pawns" +msgstr " Verbundene Bauern" + +#: pgn.cpp:1448 +msgid " Hanging pawns" +msgstr " Hängende Bauern" + +#: pgn.cpp:1451 +msgid " Backwards pawn" +msgstr " Rückständiger Bauer" + +#: setpageaudio.cpp:28 +msgid "enable Audio" +msgstr "Klänge aktivieren" + +#: setpageaudio.cpp:36 +msgid "Audio Themes" +msgstr "Klang Themes" + +#: setpageaudio.cpp:47 +msgid "Volume" +msgstr "Lautstärke" + +#: setpageaudio.cpp:48 +msgid "Maximum" +msgstr "Maximum" + +#: setpageaudio.cpp:52 +msgid "Minimum" +msgstr "Minimum" + +#: setpageaudio.cpp:55 +msgid "For Current Match Only" +msgstr "Nur für aktuelle Partie" + +#: setpagedisplay.cpp:74 +msgid "Board Themes" +msgstr "Brett-Themes" + +#: setpagedisplay.cpp:79 +msgid "Chessman Themes" +msgstr "Figuren-Themes" + +#: setpagedisplay.cpp:85 +msgid "Theme Size" +msgstr "Theme-Größe" + +#: setpagedisplay.cpp:88 +msgid "Small" +msgstr "Klein" + +#: setpagedisplay.cpp:95 +msgid "Large" +msgstr "Groß" + +#: setpagedisplay.cpp:99 +msgid "Other Display Options" +msgstr "Andere Anzeige-Optionen" + +#: setpagedisplay.cpp:102 +msgid "Reverse Board Orientation" +msgstr "Board umdrehen" + +#: setpagedisplay.cpp:107 +msgid "Display Startup Logo" +msgstr "Beim Start Logo anzeigen" + +#: setpagedisplay.cpp:112 +msgid "Automatic Preview" +msgstr "Automatische Vorschau" + +#: setpagedisplay.cpp:117 +msgid "Show Last Move" +msgstr "Letzten Zug anzeigen" + +#: setpagedisplay.cpp:122 +msgid "Animate Moves" +msgstr "" + +#: setpagedisplay.cpp:127 +msgid "Show Coordinates" +msgstr "Koordinaten anzeigen" + +#: setpagedisplay.cpp:161 +msgid "Restore Defaults" +msgstr "Zurücksetzen" + +#: setpagedisplay.cpp:165 +msgid "Standard Font..." +msgstr "Standard..." + +#: setpagedisplay.cpp:174 +msgid "Private Font..." +msgstr "Privat..." + +#: setpagedisplay.cpp:183 +msgid "Channel Font..." +msgstr "Kanal..." + +#: setpagedisplay.cpp:192 +msgid "Shout Font..." +msgstr "Schreien..." + +#: setpagedisplay.cpp:201 +msgid "Whisper Font..." +msgstr "Flüstern..." + +#: setpagedisplay.cpp:210 +msgid "Notification Font..." +msgstr "Mitteilung..." + +#: setpagedisplay.cpp:225 +msgid "Console" +msgstr "Konsole" + +#: setpagedisplay.cpp:519 +msgid "Standard" +msgstr "Standard" + +#: setpagedisplay.cpp:520 +msgid "Private Tell" +msgstr "Private Nachricht" + +#: setpagedisplay.cpp:521 +msgid "Channel Tell" +msgstr "Nachricht an den Raum" + +#: setpagedisplay.cpp:522 +msgid "Shout" +msgstr "Schreien" + +#: setpagedisplay.cpp:524 +msgid "Notification" +msgstr "Mitteilung" + +#: setpageengines.cpp:33 +msgid "Engines to Play White" +msgstr "Engines für weiß" + +#: setpageengines.cpp:36 setpageengines.cpp:48 +msgid "enable Book Engine" +msgstr "Book-Engine aktivieren" + +#: setpageengines.cpp:45 +msgid "Engines to Play Black" +msgstr "Engines für Schwarz" + +#: setpageengines.cpp:57 +msgid "Chess Engines" +msgstr "Schach-Engines" + +#: setpageengines.cpp:62 setpageservers.cpp:69 tab_seeklist.cpp:27 +msgid "Name" +msgstr "Name " + +#: setpageengines.cpp:64 +msgid "Wins" +msgstr "Gewonnen" + +#: setpageengines.cpp:65 +msgid "Losses" +msgstr "Verloren" + +#: setpageengines.cpp:66 +msgid "Draws" +msgstr "Remis" + +#: setpageengines.cpp:73 setpageservers.cpp:77 +msgid "&Add..." +msgstr "&Hinzufügen..." + +#: setpageengines.cpp:74 setpageservers.cpp:78 +msgid "&Modify..." +msgstr "&Bearbeiten..." + +#: setpageengines.cpp:75 setpageservers.cpp:79 +msgid "&Delete..." +msgstr "&Löschen..." + +#: setpagegeneral.cpp:29 +msgid "Your Name:" +msgstr "Ihr Name:" + +#: setpagegeneral.cpp:36 +msgid "When Knights Begins It Should:" +msgstr "Wenn Knights gestartet wird:" + +#: setpagegeneral.cpp:38 +msgid "Do Nothing" +msgstr "Nichts tun" + +#: setpagegeneral.cpp:39 +msgid "Start a Match vs. PC" +msgstr "Eine Partie gegen den PC beginnen" + +#: setpagegeneral.cpp:40 +msgid "Connect to ICS" +msgstr "Mit ICS verbinden" + +#: setpagegeneral.cpp:48 +msgid "Save Match on Close?" +msgstr "Partie beim Beenden speichern?" + +#: setpagegeneral.cpp:52 +msgid "Ask" +msgstr "Nachfragen" + +#: setpagegeneral.cpp:62 +msgid "Append to Save File:" +msgstr "An Abspeicherung anhängen:" + +#: setpagegeneral.cpp:65 +msgid "Append to Save File" +msgstr "An Abspeicherung anhängen:" + +#: setpagegeneral.cpp:79 +msgid "Pause on Minimize" +msgstr "Pause, wenn minimiert" + +#: setpagegeneral.cpp:85 +msgid "Always Promote to Queen" +msgstr "Bauer immer in Dame umwandeln" + +#: setpagegeneral.cpp:91 +msgid "Call Flag Automatically" +msgstr "Partie bei Zeitüberschreitung automatisch beenden" + +#: setpageservers.cpp:56 +msgid "Current Server" +msgstr "Aktueller Server" + +#: setpageservers.cpp:70 +msgid "URL" +msgstr "URL" + +#: setpageservers.cpp:90 +msgid "Servers" +msgstr "Server" + +# Profanity: Weltlichkeit, Fluch, Ruchlosigkeit ... ? +# Hm, what is the usual translation for this +#: setpageservers.cpp:106 +#, fuzzy +msgid "Profanity Filter" +msgstr "Profanitätsfilter" + +#: setpageservers.cpp:110 +msgid "Filter Everything" +msgstr "Alles ausfiltern" + +#: setpageservers.cpp:110 +msgid "No Filtering" +msgstr "Kein Filtern" + +#: setpageservers.cpp:115 +msgid "Automatically Close Previous ICS Match" +msgstr "Automatisch letzte ICS-Partie schließen" + +#: setpageservers.cpp:120 +msgid "Private Matches" +msgstr "Privat-Partien" + +#: setpageservers.cpp:124 +msgid "enable Premove" +msgstr "Im Hintergrund ziehen erlauben" + +#: setpageservers.cpp:128 +msgid "enable Kibitzes" +msgstr "Kibitzen erlauben" + +#: setpageservers.cpp:132 +msgid "enable Unregistered Tells" +msgstr "Nachrichten ohne Registrierung erlauben" + +#: setpageservers.cpp:136 +msgid "enable Shouts" +msgstr "Schreien erlauben" + +#: setpageservers.cpp:140 +msgid "enable Seeks" +msgstr "Suchen erlauben" + +#: setpageservers.cpp:150 +msgid "Seconds Between Seek Updates" +msgstr "Sekunden zwischen Such-Updates" + +#: tab_seeklist.cpp:29 +msgid "Match Type" +msgstr "Art der Partie" + +#: tab_seeklist.cpp:30 +msgid "Is Rated?" +msgstr "Bewertet?" + +#: tabbox.cpp:163 +#, fuzzy +msgid "%1 - Knights" +msgstr "Knights" + +#: wiz_setup.cpp:51 +msgid "Knights Setup Wizard" +msgstr "Knights Installations-Wizard" + +#: wiz_setup.cpp:74 +#, fuzzy +msgid "" +"Thank you for installing Knights, the graphical chess interface for KDE. To " +"help you get started quickly, there are a few things Knights will need to " +"setup. You should click 'Next' to see what they are." +msgstr "" +"Vielen Dank, dass Sie Knights installiert haben. Um den Einstieg besonders " +"leicht zu gestalten, kann Knights einige Einstellungen selbst vornehmen. " +"Klicken Sie auf 'Weiter', um fortzufahren, oder auf 'Abbrechen', wenn Sie " +"alles selbst einstellen möchten." + +#: wiz_setup.cpp:77 +msgid "Welcome to Knights v%1!" +msgstr "Willkommen bei Knights v%1!" + +#: wiz_setup.cpp:97 +#, fuzzy +msgid "" +"When Knights saves a match to disk, it uses Portable Game Notation (PGN) to " +"store the match. Several other computer chess games use PGN too. If you " +"like, Knights can be the default PGN viewer on this system." +msgstr "" +"Knights speichert Partien im weit verbreiteten PGN-Format (Portable Game " +"Notation). Wenn Sie möchten, kann Knights als das standardmäßige " +"Anzeigeprogramm für PGN-Dateien konfiguriert werden." + +#: wiz_setup.cpp:100 +msgid "Let Knights handle PGN files?" +msgstr "PGN-Dateien standardmäßig mit Knights öffnen?" + +#: wiz_setup.cpp:106 +msgid "Let Knights handle your .pgn files?" +msgstr "PGN-Dateien standardmäßig mit Knights öffnen?" + +#: wiz_setup.cpp:125 +#, fuzzy +msgid "" +"Knights can not play a chess match against you without help. Known as Chess " +"Engines, these helpers can be found on the Internet and are often included " +"with your distribution. Knights can look for Chess Engines that you may " +"already have. If found, Knights will configure itself to use them." +msgstr "" +"Um gegen Sie Schach spielen zu können, benötigt Knights die Hilfe von " +"sogenannten Schach-Engines. Diese machen die eigentliche Spielstärke aus, " +"und sind in großer Zahl frei verfügbar. Knights kann selbständig nach " +"bereits installierten Schach-Engines suchen, und diese für Sie konfigurieren." + +#: wiz_setup.cpp:128 wiz_setup.cpp:134 +msgid "Let Knights search for chess engines?" +msgstr "Schach-Engines suchen?" + +#: wiz_setup.cpp:153 +msgid "" +"In order for you to play chess online, Knights will have to connect to a " +"chess server. Knights has a list of several of these servers. If you like, " +"this list can be used to automatically configure Knights." +msgstr "" +"Um online Schach spielen zu können, muss sich Knights mit einem Schach-" +"Server verbinden. Eine Liste mit vielen solchen Servern ist bereits in " +"Knights enthalten. Wenn Sie möchten, kann diese Liste benutzt werden, um " +"Knights zu konfigurieren." + +#: wiz_setup.cpp:156 wiz_setup.cpp:162 +msgid "Let Knights configure chess servers?" +msgstr "Schach-Server konfigurieren?" + +#: wiz_setup.cpp:181 +#, fuzzy +msgid "" +"Knights has now configured itself according to your choices. We strongly " +"recommend that you read the documentation to make full use of all that " +"Knights has to offer. You can access it by pressing F1." +msgstr "" +"Knights hat sich nun gemäß Ihrer Auswahl konfiguriert. Sie sollten nun " +"einen Blick in die Dokumentation werfen, um die Möglichkeiten von Knights " +"voll ausschöpfen zu können. Auf diese können Sie mit F1 zugreifen." + +#: wiz_setup.cpp:184 +msgid "Setup Complete" +msgstr "Konfiguration komplett" + +#: wiz_setup.cpp:213 +msgid "Do you accept the terms of our license?" +msgstr "" + +#: wiz_setup.cpp:218 +msgid "Please read and accept our license:" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Free Internet Chess Server" +msgstr "Free Internet Chess Server" + +#: wiz_setup.cpp:269 +msgid "Internet Chess Club" +msgstr "Internet Chess Club" + +#: wiz_setup.cpp:269 +msgid "Global Chess Server" +msgstr "Global Chess Server" + +#: wiz_setup.cpp:269 +msgid "Chess.Net" +msgstr "Chess.Net" + +#: wiz_setup.cpp:270 +msgid "Chess-Square.Com" +msgstr "Chess-Square.Com" + +#: wiz_setup.cpp:270 +msgid "Australian FICS" +msgstr "Australian FICS" + +#: wiz_setup.cpp:270 +msgid "Brazilian FICS" +msgstr "Brazilian FICS" + +#: wiz_setup.cpp:270 +msgid "Chilean FICS" +msgstr "Chilean FICS" + +#: wiz_setup.cpp:271 +msgid "Croatian FICS" +msgstr "Croatian FICS" + +#: wiz_setup.cpp:271 +msgid "Dutch FICS" +msgstr "Dutch FICS" + +#: wiz_setup.cpp:271 +msgid "French FICS" +msgstr "French FICS" + +#: wiz_setup.cpp:271 +msgid "German FICS" +msgstr "German FICS" + +#: wiz_setup.cpp:271 +msgid "Swedish FICS" +msgstr "Swedish FICS" + +#: proto_xboard.cpp:443 +msgid "" +"%1 suggests this move:\n" +"%2" +msgstr "" +"%1 schlägt folgenden Zug vor: \n" +"%2" + +#: proto_xboard.cpp:465 proto_xboard.cpp:472 proto_xboard.cpp:479 +msgid "" +"%1 tells you:\n" +"%2" +msgstr "" +"Mitteilung von %1:\n" +"%2" + +#~ msgid "Save Game?" +#~ msgstr "Spiel speichern?" + +#~ msgid "Save Game..." +#~ msgstr "Spiel speichern..." + +#~ msgid " Game paused" +#~ msgstr " Pause" + +#, fuzzy +#~ msgid "Chat" +#~ msgstr "Crafty" + +#, fuzzy +#~ msgid "&Find" +#~ msgstr "&Vorschlag" + +#~ msgid "Red Hat Binary RPMs" +#~ msgstr "Red Hat Binary RPMs" + +#~ msgid "Early Beta Testing" +#~ msgstr "Frühe Beta-Tester" + +#~ msgid "Would you like to email this move?" +#~ msgstr "Möchten Sie diesen Zug mailen?" + +#~ msgid "Send Email?" +#~ msgstr "Mailen?" + +#~ msgid "Console Orientation" +#~ msgstr "Anordnung der Konsole" + +#, fuzzy +#~ msgid "engineio" +#~ msgstr "engineio" + +#, fuzzy +#~ msgid "Knightsio" +#~ msgstr "Knights" + +#~ msgid "pgn" +#~ msgstr "pgn" + +#~ msgid "Server Login Failed" +#~ msgstr "Verbindung nicht erfolgreich" + +#~ msgid "White's Time Controls" +#~ msgstr "Zeiteinstellungen für Weiß" + +#~ msgid "Black's Time Controls" +#~ msgstr "Zeiteinstellungen für Schwarz" + +#~ msgid "" +#~ "Knights can not find %1.\n" +#~ "Please make sure the address was entered correctly and that you are " +#~ "connected to the internet." +#~ msgstr "" +#~ "%1 konnte nicht gefunden werden.\n" +#~ "Bitte stellen Sie sicher, dass die Adresse korrekt eingegeben wurde und " +#~ "eine Verbindung mit dem Internet besteht." + +#~ msgid "&Solitaire Chess" +#~ msgstr "&Solitaire-Schach" + +#~ msgid "&Computer vs. Computer" +#~ msgstr "&Computer vs. Computer" + +#~ msgid "&Save Game" +#~ msgstr "Spiel &speichern" + +#~ msgid "Console - Knights" +#~ msgstr "Knights Konsole" + +#~ msgid "High Quality" +#~ msgstr "Hohe Qualität" + +#~ msgid "GNUChess" +#~ msgstr "GNUChess" + +#~ msgid "Sjeng" +#~ msgstr "Sjeng" + +#~ msgid "KnightCap" +#~ msgstr "KnightCap" + +#~ msgid "BabyChess" +#~ msgstr "BabyChess" + +#~ msgid "Phalanx-XXII" +#~ msgstr "Phalanx-XXII" + +#~ msgid "Bowron Abernethy Chess Engine" +#~ msgstr "Bowron Abernethy Schach-Engine" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..69b9160 --- /dev/null +++ b/po/es.po @@ -0,0 +1,2043 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-01-21 04:30-0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: accel.cpp:23 +msgid "Previous Move" +msgstr "" + +#: accel.cpp:24 +msgid "Next Move" +msgstr "" + +#: accel.cpp:25 +msgid "Enter Text" +msgstr "" + +#: accel.cpp:26 +msgid "Page Up" +msgstr "" + +#: accel.cpp:27 +msgid "Page Down" +msgstr "" + +#: accel.cpp:28 +msgid "Increase Board Size" +msgstr "" + +#: accel.cpp:29 +msgid "Decrease Board Size" +msgstr "" + +#: accel.cpp:30 +msgid "Last History Item" +msgstr "" + +#: accel.cpp:31 +msgid "Next History Item" +msgstr "" + +#: accel.cpp:32 +msgid "Reply to the Last Tell" +msgstr "" + +#: accel.cpp:33 +msgid "Reply to the Channel" +msgstr "" + +#: accel.cpp:34 +msgid "Kibitz" +msgstr "" + +#: accel.cpp:35 setpagedisplay.cpp:523 +msgid "Whisper" +msgstr "" + +#: challenge_graph.cpp:75 tab_seeklist.cpp:40 +msgid "Seek Matches" +msgstr "" + +#: challenge_graph.cpp:77 tab_seeklist.cpp:42 +msgid "Accept This Match" +msgstr "" + +#: challenge_graph.cpp:78 tab_seeklist.cpp:43 +msgid "Tell..." +msgstr "" + +#: challenge_graph.cpp:79 tab_seeklist.cpp:44 +msgid "Assess..." +msgstr "" + +#: challenge_graph.cpp:80 tab_seeklist.cpp:45 +msgid "Player Info" +msgstr "" + +#: challenge_graph.cpp:82 tab_seeklist.cpp:47 +msgid "Player History" +msgstr "" + +#: challenge_graph.cpp:84 tab_seeklist.cpp:49 +msgid "Add to Friends" +msgstr "" + +#: challenge_graph.cpp:85 tab_seeklist.cpp:50 +msgid "Ignore This Player" +msgstr "" + +#: challenge_graph.cpp:304 tab_seeklist.cpp:28 +msgid "Rating" +msgstr "" + +#: challenge_graph.cpp:311 +msgid "Time" +msgstr "" + +#: challenge_graph_view.cpp:105 +msgid " Name: %1 Rating: %2 Match Type: %3 %4 Base Time: %5 Increment: %6" +msgstr "" + +#: core.cpp:385 +msgid "Hint" +msgstr "" + +#: core.cpp:388 +msgid "Tell User" +msgstr "" + +#: core.cpp:391 +msgid "Tell User Error" +msgstr "" + +#: core.cpp:397 +msgid "Tell Opponent" +msgstr "" + +#: core.cpp:411 +msgid "Tell All" +msgstr "" + +#: core.cpp:646 +msgid "Load PGN..." +msgstr "" + +#: core.cpp:690 +msgid "Would you like to save this match?" +msgstr "" + +#: core.cpp:691 +msgid "Save Match?" +msgstr "" + +#: core.cpp:710 +msgid "Save Match..." +msgstr "" + +#: dlg_challenge.cpp:25 +msgid "You've Been Challenged:" +msgstr "" + +#: dlg_challenge.cpp:29 +msgid "Accept" +msgstr "" + +#: dlg_challenge.cpp:30 +msgid "Decline" +msgstr "" + +#: dlg_challenge.cpp:49 +msgid "Time Odds Match" +msgstr "" + +#: dlg_challenge.cpp:53 +msgid "Unrated" +msgstr "" + +#: dlg_challenge.cpp:54 +msgid "Rated" +msgstr "" + +#: dlg_challenge.cpp:60 dlg_challenge.cpp:69 dlg_newmatch.cpp:87 +#: dlg_newmatch.cpp:104 tab_seeklist.cpp:101 +msgid " min." +msgstr "" + +#: dlg_challenge.cpp:61 dlg_challenge.cpp:70 dlg_newmatch.cpp:97 +#: dlg_newmatch.cpp:114 setpageservers.cpp:146 tab_seeklist.cpp:102 +msgid " sec." +msgstr "" + +#: dlg_challenge.cpp:62 dlg_challenge.cpp:71 tab_seeklist.cpp:31 +msgid "Base Time" +msgstr "" + +#: dlg_challenge.cpp:63 dlg_challenge.cpp:72 tab_seeklist.cpp:32 +msgid "Increment" +msgstr "" + +#: dlg_challenge.cpp:109 +msgid "" +"%1 %2 vs. %3 %4\n" +"in a %5 match." +msgstr "" + +#: dlg_challenge.cpp:124 dlg_challenge.cpp:125 +msgid "Time Controls" +msgstr "" + +#: dlg_challenge.cpp:154 +msgid "Counter Offer" +msgstr "" + +#: dlg_engine.cpp:26 +msgid "Configure Engine" +msgstr "" + +#: dlg_engine.cpp:38 +msgid "Engine Name" +msgstr "" + +#: dlg_engine.cpp:43 setpageengines.cpp:63 +msgid "Protocol" +msgstr "" + +#: dlg_engine.cpp:48 +msgid "Engine Filename" +msgstr "" + +#: dlg_engine.cpp:54 +msgid "Command Line Arguments" +msgstr "" + +#: dlg_engine.cpp:59 dlg_server.cpp:88 +msgid "Log File" +msgstr "" + +#: dlg_login.cpp:21 +msgid "Login Prompt" +msgstr "" + +#: dlg_login.cpp:31 +msgid "Login:" +msgstr "" + +#: dlg_login.cpp:32 +msgid "Password:" +msgstr "" + +#: dlg_login.cpp:38 +msgid "Log in as guest" +msgstr "" + +#: dlg_login.cpp:54 +msgid "Login" +msgstr "" + +#: dlg_login.cpp:54 +msgid "Log in to the chess server using this name and password." +msgstr "" + +#: dlg_newmatch.cpp:38 +msgid "Start a New Match" +msgstr "" + +#: dlg_newmatch.cpp:45 +msgid "White" +msgstr "" + +#: dlg_newmatch.cpp:46 +msgid "Black" +msgstr "" + +#: dlg_newmatch.cpp:59 dlg_newmatch.cpp:66 +msgid "Human" +msgstr "" + +#: dlg_newmatch.cpp:60 dlg_newmatch.cpp:67 +msgid "Computer" +msgstr "" + +#: dlg_newmatch.cpp:61 dlg_newmatch.cpp:68 +msgid "Email" +msgstr "" + +#: dlg_newmatch.cpp:85 dlg_newmatch.cpp:102 +msgid "Base Time:" +msgstr "" + +#: dlg_newmatch.cpp:90 dlg_newmatch.cpp:107 +msgid "Moves Per Base Time" +msgstr "" + +#: dlg_newmatch.cpp:92 dlg_newmatch.cpp:109 +msgid " moves" +msgstr "" + +#: dlg_newmatch.cpp:95 dlg_newmatch.cpp:112 +msgid "Increment Per Move" +msgstr "" + +#: dlg_promote.cpp:94 +msgid "Promote your pawn to..." +msgstr "" + +#: dlg_promote.cpp:101 +msgid "Pawn Promotion" +msgstr "" + +#: dlg_selectemail.cpp:27 +msgid "Select Email Address" +msgstr "" + +#: dlg_selectengine.cpp:30 +msgid "Select Computer Player" +msgstr "" + +#: dlg_selectengine.cpp:41 +msgid "Computer Players" +msgstr "" + +#: dlg_selectengine.cpp:61 +msgid "Player Strength" +msgstr "" + +#: dlg_selectengine.cpp:63 +msgid "Weak" +msgstr "" + +#: dlg_selectengine.cpp:70 +msgid "Strong" +msgstr "" + +#: dlg_server.cpp:25 +msgid "Configure Server" +msgstr "" + +#: dlg_server.cpp:37 +msgid "Server Name" +msgstr "" + +#: dlg_server.cpp:44 +msgid "Server URL" +msgstr "" + +#: dlg_server.cpp:49 +msgid "Server Port" +msgstr "" + +#: dlg_server.cpp:56 +msgid "Username" +msgstr "" + +#: dlg_server.cpp:59 +msgid "Remember My Password" +msgstr "" + +#: dlg_server.cpp:64 +msgid "Password" +msgstr "" + +#: dlg_server.cpp:71 +msgid "Confirm Password" +msgstr "" + +#: dlg_server.cpp:79 +msgid "Timeseal" +msgstr "" + +#: dlg_settings.cpp:48 setpagedisplay.cpp:142 +msgid "General" +msgstr "" + +#: dlg_settings.cpp:49 +msgid "Various aspects of Knights get configured here." +msgstr "" + +#: dlg_settings.cpp:55 +msgid "Display" +msgstr "" + +#: dlg_settings.cpp:56 +msgid "These settings determine how Knights displays itself to you." +msgstr "" + +#: dlg_settings.cpp:62 +msgid "Audio" +msgstr "" + +#: dlg_settings.cpp:63 +msgid "These settings determine what Knights sounds like." +msgstr "" + +#: dlg_settings.cpp:69 +msgid "Computer Opponents" +msgstr "" + +#: dlg_settings.cpp:70 +msgid "Configure your chess engines here." +msgstr "" + +#: dlg_settings.cpp:76 setpageservers.cpp:65 +msgid "Chess Servers" +msgstr "" + +#: dlg_settings.cpp:77 +msgid "Configure your internet chess servers here." +msgstr "" + +#: io_internet.cpp:80 +msgid "" +"There are no servers configured.\n" +"Please make sure you have at least one server configured." +msgstr "" + +#: io_internet.cpp:80 +msgid "Cannot find a server." +msgstr "" + +#: io_internet.cpp:99 +msgid "" +"Knights can not start Timeseal.\n" +"Please make sure you have the correct path and filename configured." +msgstr "" + +#: io_internet.cpp:99 +msgid "Cannot find Timeseal." +msgstr "" + +#: io_internet.cpp:109 io_internet.cpp:121 +msgid "" +"Knights is unable to connect to the server.\n" +" Please make sure your internet connection is working and try again." +msgstr "" + +#: io_internet.cpp:109 io_internet.cpp:121 +msgid "Cannot connect to server." +msgstr "" + +#: io_internet.cpp:144 +msgid "%1 Console" +msgstr "" + +#: io_internet.cpp:149 +msgid "Sought Matches List" +msgstr "" + +#: io_internet.cpp:154 +msgid "Sought Matches Graph" +msgstr "" + +#: knights.cpp:70 main.cpp:34 +msgid "Knights" +msgstr "" + +#: knights.cpp:250 +msgid "&Draw" +msgstr "" + +#: knights.cpp:254 +msgid "&Retract Move" +msgstr "" + +#: knights.cpp:256 +msgid "Select this to retract your last move." +msgstr "" + +#: knights.cpp:258 +msgid "Resign" +msgstr "" + +#: knights.cpp:260 +msgid "Use this to concede the match to your opponent." +msgstr "" + +#: knights.cpp:262 +msgid "&Call Flag" +msgstr "" + +#: knights.cpp:264 +msgid "" +"Use this to declare the match over, due to your opponent being out of time." +msgstr "" + +#: knights.cpp:266 +msgid "&Hint" +msgstr "" + +#: knights.cpp:268 +msgid "This will ask your opponent for a hint." +msgstr "" + +#: knights.cpp:270 +msgid "Move &Now" +msgstr "" + +#: knights.cpp:272 +msgid "Clicking this option will force your opponent to move immediately." +msgstr "" + +#: knights.cpp:274 +msgid "&Flip View" +msgstr "" + +#: knights.cpp:276 +msgid "This will reverse the chessboard's orientation by 180 degrees." +msgstr "" + +#: knights.cpp:278 +msgid "&Ponder" +msgstr "" + +#: knights.cpp:281 +msgid "This toggles your opponent's ability to think while it's your turn." +msgstr "" + +#: knights.cpp:285 knights.cpp:949 +msgid "Pause" +msgstr "" + +#: knights.cpp:287 +msgid "Select this to pause the clock for this match." +msgstr "" + +#: knights.cpp:292 +msgid "&Offer Draw" +msgstr "" + +#: knights.cpp:293 +msgid "" +"Clicking this will inform your opponent that you are willing draw the match." +msgstr "" + +#: knights.cpp:295 +msgid "&Accept Draw" +msgstr "" + +#: knights.cpp:296 +msgid "Clicking this will accept a draw offered by your opponent." +msgstr "" + +#: knights.cpp:298 +msgid "&Reject Draw" +msgstr "" + +#: knights.cpp:299 +msgid "Clicking this will reject a draw offered by your opponent." +msgstr "" + +#: knights.cpp:301 +msgid "&Ignore Draw" +msgstr "" + +#: knights.cpp:302 +msgid "Clicking this will ignore future draw offers from your opponent." +msgstr "" + +#: knights.cpp:308 +msgid "&New Match..." +msgstr "" + +#: knights.cpp:309 +msgid "This allows you to begin a new match." +msgstr "" + +#: knights.cpp:312 +msgid "&Load Match..." +msgstr "" + +#: knights.cpp:313 +msgid "" +"The Load command will allow you to select a previously saved match and play " +"it again." +msgstr "" + +#: knights.cpp:316 thinbuttons.cpp:40 +msgid "&Close Match" +msgstr "" + +#: knights.cpp:318 +msgid "This command removes the current match." +msgstr "" + +#: knights.cpp:320 +msgid "Close All" +msgstr "" + +#: knights.cpp:322 +msgid "This command will remove all matches that are currently loaded." +msgstr "" + +#: knights.cpp:326 thinbuttons.cpp:32 +msgid "&Save Match" +msgstr "" + +#: knights.cpp:328 knights.cpp:333 +msgid "" +"The Save command will allow you to store a copy of your current match for " +"later use." +msgstr "" + +#: knights.cpp:331 thinbuttons.cpp:34 +msgid "Save Match &As..." +msgstr "" + +#: knights.cpp:337 knights.cpp:859 +msgid "Connect to Server" +msgstr "" + +#: knights.cpp:338 +msgid "Clicking this will connect Knights with an internet chess server." +msgstr "" + +#: knights.cpp:342 thinbuttons.cpp:37 +msgid "&Print Notation..." +msgstr "" + +#: knights.cpp:344 +msgid "" +"The Print command will allow you to print this game's notation on your " +"printer." +msgstr "" + +#: knights.cpp:349 +msgid "The Quit command will stop all matches and exit Knights." +msgstr "" + +#: knights.cpp:355 +msgid "Play &White" +msgstr "" + +#: knights.cpp:358 +msgid "" +"If checked, this option tells Knights that you will play as the White army " +"when you play vs. the computer." +msgstr "" + +#: knights.cpp:360 +msgid "Play &Black" +msgstr "" + +#: knights.cpp:363 +msgid "" +"If checked, this option tells Knights that you will play as the Black army " +"when you play vs. the computer." +msgstr "" + +#: knights.cpp:366 +msgid "&Install Themes" +msgstr "" + +#: knights.cpp:367 +msgid "This lets you install downloaded themes into Knights." +msgstr "" + +#: knights.cpp:371 +msgid "" +"Click this if you want to change the keyboard shortcuts that Knights uses." +msgstr "" + +#: knights.cpp:374 +msgid "&Configure Knights..." +msgstr "" + +#: knights.cpp:375 +msgid "" +"This opens a new window which allows you to customize Knights to your " +"particular tastes." +msgstr "" + +#: knights.cpp:381 +msgid "Begin a Tutorial" +msgstr "" + +#: knights.cpp:387 +msgid "&Match" +msgstr "" + +#: knights.cpp:576 +msgid "Error with white engine" +msgstr "" + +#: knights.cpp:578 +msgid "" +"You selected %1 to play white,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play white." +msgstr "" + +#: knights.cpp:579 +msgid "White Engine Problem" +msgstr "" + +#: knights.cpp:582 +msgid "Error with white book engine" +msgstr "" + +#: knights.cpp:584 +msgid "" +"You selected %1 to play white's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play white's book." +msgstr "" + +#: knights.cpp:585 +msgid "White Book Engine Problem" +msgstr "" + +#: knights.cpp:588 +msgid "Error with black engine" +msgstr "" + +#: knights.cpp:590 +msgid "" +"You selected %1 to play black,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play black." +msgstr "" + +#: knights.cpp:591 +msgid "Black Engine Problem" +msgstr "" + +#: knights.cpp:594 +msgid "Error with black book engine" +msgstr "" + +#: knights.cpp:596 +msgid "" +"You selected %1 to play black's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play black's book." +msgstr "" + +#: knights.cpp:597 +msgid "Black Book Engine Problem" +msgstr "" + +#: knights.cpp:600 +msgid "The computer opponent assigned to play %1 has crashed" +msgstr "" + +#: knights.cpp:603 +msgid "There was an error while loading the file" +msgstr "" + +#: knights.cpp:606 +msgid "There was an error while saving the file" +msgstr "" + +#: knights.cpp:610 +msgid "Loading complete" +msgstr "" + +#: knights.cpp:613 +msgid "Saving complete" +msgstr "" + +#: knights.cpp:616 +msgid "Reading File" +msgstr "" + +#: knights.cpp:619 +msgid "Can not move a chessman while reviewing the match" +msgstr "" + +#: knights.cpp:622 +msgid "Illegal Move" +msgstr "" + +#: knights.cpp:625 +msgid "White's turn" +msgstr "" + +#: knights.cpp:628 +msgid "Black's turn" +msgstr "" + +#: knights.cpp:631 +msgid "White wins" +msgstr "" + +#: knights.cpp:634 +msgid "Black wins" +msgstr "" + +#: knights.cpp:637 +msgid "Checkmate, White wins" +msgstr "" + +#: knights.cpp:640 +msgid "Checkmate, Black wins" +msgstr "" + +#: knights.cpp:643 +msgid "White resigns" +msgstr "" + +#: knights.cpp:646 +msgid "Black resigns" +msgstr "" + +#: knights.cpp:649 +msgid "White's flag fell" +msgstr "" + +#: knights.cpp:652 +msgid "Black's flag fell" +msgstr "" + +#: knights.cpp:655 +msgid "Black's flag was called, White wins" +msgstr "" + +#: knights.cpp:658 +msgid "White's flag was called, Black wins" +msgstr "" + +#: knights.cpp:661 +msgid "Draw match" +msgstr "" + +#: knights.cpp:664 +msgid "50 moves rule, draw match" +msgstr "" + +#: knights.cpp:667 +msgid "Starting computer players, please wait" +msgstr "" + +#: knights.cpp:670 +msgid "Match paused" +msgstr "" + +#: knights.cpp:673 +msgid "White has offered a draw" +msgstr "" + +#: knights.cpp:676 +msgid "Black has offered a draw" +msgstr "" + +#: knights.cpp:679 +msgid "Lost contact with opponent" +msgstr "" + +#: knights.cpp:682 +msgid "Ready" +msgstr "" + +#: knights.cpp:866 +msgid "Disconnect from Server" +msgstr "" + +#: knights.cpp:955 +msgid "Resume" +msgstr "" + +#: knights.cpp:1014 +msgid "Knights Themes" +msgstr "" + +#: knights.cpp:1015 +msgid "Install Theme..." +msgstr "" + +#: knights.cpp:1045 +msgid "" +"You do not have permission to install this theme systemwide, so Knights " +"installed it locally." +msgstr "" + +#: knights.cpp:1046 +msgid "Installed theme locally" +msgstr "" + +#: knights.cpp:1051 +#, c-format +msgid "" +"The theme could not be installed:\n" +"%1" +msgstr "" + +#: knights.cpp:1052 +msgid "Can not install theme" +msgstr "" + +#: knightstextview.cpp:35 +msgid "Select &All" +msgstr "" + +#: knightstextview.cpp:44 +msgid "Zoom &In" +msgstr "" + +#: knightstextview.cpp:46 +msgid "Zoom &Out" +msgstr "" + +#: list_pgn.cpp:29 list_pgn.cpp:48 +msgid "Result" +msgstr "" + +#: list_pgn.cpp:30 list_pgn.cpp:49 +msgid "Title" +msgstr "" + +#: list_pgn.cpp:31 list_pgn.cpp:50 +msgid "Round" +msgstr "" + +#: list_pgn.cpp:32 list_pgn.cpp:51 +msgid "Site" +msgstr "" + +#: list_pgn.cpp:33 list_pgn.cpp:52 +msgid "Date" +msgstr "" + +#: list_pgn.cpp:81 +#, c-format +msgid "Can not open %1" +msgstr "" + +#: list_pgn.cpp:140 +msgid "%1 matches found." +msgstr "" + +#: main.cpp:26 +msgid "Specify the location of your Knights data directory." +msgstr "" + +#: main.cpp:27 +msgid "A .pgn file to be loaded." +msgstr "" + +#: main.cpp:36 +msgid "" +"The Knights Chess Interface\n" +"\n" +"Knights is a chess interface\n" +"for the K Desktop Environment." +msgstr "" + +#: main.cpp:44 +msgid "Project Manager and Programmer" +msgstr "" + +#: main.cpp:48 +msgid "Communications Programmer" +msgstr "" + +#: main.cpp:52 +msgid "Qtopia port and patches" +msgstr "" + +#: main.cpp:56 +msgid "Patches and suggestions" +msgstr "" + +#: main.cpp:60 +msgid "KDE3 Compatability Patch" +msgstr "" + +#: main.cpp:64 +msgid "XBoard protocol" +msgstr "" + +#: _translatorinfo.cpp:1 main.cpp:67 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "" + +#: _translatorinfo.cpp:3 main.cpp:68 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "" + +#: match_param.cpp:107 +msgid "Unknown" +msgstr "" + +#: pgn.cpp:145 +msgid "%1 vs. %2" +msgstr "" + +#: pgn.cpp:943 +#, c-format +msgid "Page %1" +msgstr "" + +#: pgn.cpp:975 +msgid " Good move" +msgstr "" + +#: pgn.cpp:978 +msgid " Poor move" +msgstr "" + +#: pgn.cpp:981 +msgid " Very good move" +msgstr "" + +#: pgn.cpp:984 +msgid " Very poor move" +msgstr "" + +#: pgn.cpp:987 +msgid " Speculative move" +msgstr "" + +#: pgn.cpp:990 +msgid " Questionable move" +msgstr "" + +#: pgn.cpp:993 +msgid " Forced move" +msgstr "" + +#: pgn.cpp:996 +msgid " Singular move" +msgstr "" + +#: pgn.cpp:999 +msgid " Worst move" +msgstr "" + +#: pgn.cpp:1002 +msgid " Drawish position" +msgstr "" + +#: pgn.cpp:1005 +msgid " Equal chances, quiet position" +msgstr "" + +#: pgn.cpp:1008 +msgid " Equal chances, active position" +msgstr "" + +#: pgn.cpp:1011 +msgid " Unclear position" +msgstr "" + +#: pgn.cpp:1014 +msgid " White has a slight advantage" +msgstr "" + +#: pgn.cpp:1017 +msgid " Black has a slight advantage" +msgstr "" + +#: pgn.cpp:1020 +msgid " White has a moderate advantage" +msgstr "" + +#: pgn.cpp:1023 +msgid " Black has a moderate advantage" +msgstr "" + +#: pgn.cpp:1026 +msgid " White has a decisive advantage" +msgstr "" + +#: pgn.cpp:1029 +msgid " Black has a decisive advantage" +msgstr "" + +#: pgn.cpp:1032 +msgid " White has a crushing advantage ( Black should resign )" +msgstr "" + +#: pgn.cpp:1035 +msgid " Black has a crushing advantage ( White should resign )" +msgstr "" + +#: pgn.cpp:1038 +msgid " White is in zugzwang" +msgstr "" + +#: pgn.cpp:1041 +msgid " Black is in zugzwang" +msgstr "" + +#: pgn.cpp:1044 +msgid " White has a slight space advantage" +msgstr "" + +#: pgn.cpp:1047 +msgid " Black has a slight space advantage" +msgstr "" + +#: pgn.cpp:1050 +msgid " White has a moderate space advantage" +msgstr "" + +#: pgn.cpp:1053 +msgid " Black has a moderate space advantage" +msgstr "" + +#: pgn.cpp:1056 +msgid " White has a decisive space advantage" +msgstr "" + +#: pgn.cpp:1059 +msgid " Black has a decisive space advantage" +msgstr "" + +#: pgn.cpp:1062 +msgid " White has a slight time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1065 +msgid " Black has a slight time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1068 +msgid " White has a moderate time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1071 +msgid " Black has a moderate time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1074 +msgid " White has a decisive time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1077 +msgid " Black has a decisive time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1080 +msgid " White has the initiative" +msgstr "" + +#: pgn.cpp:1083 +msgid " Black has the initiative" +msgstr "" + +#: pgn.cpp:1086 +msgid " White has a lasting initiative" +msgstr "" + +#: pgn.cpp:1089 +msgid " Black has a lasting initiative" +msgstr "" + +#: pgn.cpp:1092 +msgid " White has the attack" +msgstr "" + +#: pgn.cpp:1095 +msgid " Black has the attack" +msgstr "" + +#: pgn.cpp:1098 +msgid " White has insufficient compensation for material deficit" +msgstr "" + +#: pgn.cpp:1101 +msgid " Black has insufficient compensation for material deficit" +msgstr "" + +#: pgn.cpp:1104 +msgid " White has sufficient compensation for material deficit" +msgstr "" + +#: pgn.cpp:1107 +msgid " Black has sufficient compensation for material deficit" +msgstr "" + +#: pgn.cpp:1110 +msgid " White has more than adequate compensation for material deficit" +msgstr "" + +#: pgn.cpp:1113 +msgid " Black has more than adequate compensation for material deficit" +msgstr "" + +#: pgn.cpp:1116 +msgid " White has a slight center control advantage" +msgstr "" + +#: pgn.cpp:1119 +msgid " Black has a slight center control advantage" +msgstr "" + +#: pgn.cpp:1122 +msgid " White has a moderate center control advantage" +msgstr "" + +#: pgn.cpp:1125 +msgid " Black has a moderate center control advantage" +msgstr "" + +#: pgn.cpp:1128 +msgid " White has a decisive center control advantage" +msgstr "" + +#: pgn.cpp:1131 +msgid " Black has a decisive center control advantage" +msgstr "" + +#: pgn.cpp:1134 +msgid " White has a slight kingside control advantage" +msgstr "" + +#: pgn.cpp:1137 +msgid " Black has a slight kingside control advantage" +msgstr "" + +#: pgn.cpp:1140 +msgid " White has a moderate kingside control advantage" +msgstr "" + +#: pgn.cpp:1143 +msgid " Black has a moderate kingside control advantage" +msgstr "" + +#: pgn.cpp:1146 +msgid " White has a decisive kingside control advantage" +msgstr "" + +#: pgn.cpp:1149 +msgid " Black has a decisive kingside control advantage" +msgstr "" + +#: pgn.cpp:1152 +msgid " White has a slight queenside control advantage" +msgstr "" + +#: pgn.cpp:1155 +msgid " Black has a slight queenside control advantage" +msgstr "" + +#: pgn.cpp:1158 +msgid " White has a moderate queenside control advantage" +msgstr "" + +#: pgn.cpp:1161 +msgid " Black has a moderate queenside control advantage" +msgstr "" + +#: pgn.cpp:1164 +msgid " White has a decisive queenside control advantage" +msgstr "" + +#: pgn.cpp:1167 +msgid " Black has a decisive queenside control advantage" +msgstr "" + +#: pgn.cpp:1170 +msgid " White has a vulnerable first rank" +msgstr "" + +#: pgn.cpp:1173 +msgid " Black has a vulnerable first rank" +msgstr "" + +#: pgn.cpp:1176 +msgid " White has a well protected first rank" +msgstr "" + +#: pgn.cpp:1179 +msgid " Black has a well protected first rank" +msgstr "" + +#: pgn.cpp:1182 +msgid " White has a poorly protected king" +msgstr "" + +#: pgn.cpp:1185 +msgid " Black has a poorly protected king" +msgstr "" + +#: pgn.cpp:1188 +msgid " White has a well protected king" +msgstr "" + +#: pgn.cpp:1191 +msgid " Black has a well protected king" +msgstr "" + +#: pgn.cpp:1194 +msgid " White has a poorly placed king" +msgstr "" + +#: pgn.cpp:1197 +msgid " Black has a poorly placed king" +msgstr "" + +#: pgn.cpp:1200 +msgid " White has a well placed king" +msgstr "" + +#: pgn.cpp:1203 +msgid " Black has a well placed king" +msgstr "" + +#: pgn.cpp:1206 +msgid " White has a very weak pawn structure" +msgstr "" + +#: pgn.cpp:1209 +msgid " Black has a very weak pawn structure" +msgstr "" + +#: pgn.cpp:1212 +msgid " White has a moderately weak pawn structure" +msgstr "" + +#: pgn.cpp:1215 +msgid " Black has a moderately weak pawn structure" +msgstr "" + +#: pgn.cpp:1218 +msgid " White has a moderately strong pawn structure" +msgstr "" + +#: pgn.cpp:1221 +msgid " Black has a moderately strong pawn structure" +msgstr "" + +#: pgn.cpp:1224 +msgid " White has a very strong pawn structure" +msgstr "" + +#: pgn.cpp:1227 +msgid " Black has a very strong pawn structure" +msgstr "" + +#: pgn.cpp:1230 +msgid " White has poor knight placement" +msgstr "" + +#: pgn.cpp:1233 +msgid " Black has poor knight placement" +msgstr "" + +#: pgn.cpp:1236 +msgid " White has good knight placement" +msgstr "" + +#: pgn.cpp:1239 +msgid " Black has good knight placement" +msgstr "" + +#: pgn.cpp:1242 +msgid " White has poor bishop placement" +msgstr "" + +#: pgn.cpp:1245 +msgid " Black has poor bishop placement" +msgstr "" + +#: pgn.cpp:1248 +msgid " White has good bishop placement" +msgstr "" + +#: pgn.cpp:1251 +msgid " Black has good bishop placement" +msgstr "" + +#: pgn.cpp:1254 +msgid " White has poor rook placement" +msgstr "" + +#: pgn.cpp:1257 +msgid " Black has poor rook placement" +msgstr "" + +#: pgn.cpp:1260 +msgid " White has good rook placement" +msgstr "" + +#: pgn.cpp:1263 +msgid " Black has good rook placement" +msgstr "" + +#: pgn.cpp:1266 +msgid " White has poor queen placement" +msgstr "" + +#: pgn.cpp:1269 +msgid " Black has poor queen placement" +msgstr "" + +#: pgn.cpp:1272 +msgid " White has good queen placement" +msgstr "" + +#: pgn.cpp:1275 +msgid " Black has good queen placement" +msgstr "" + +#: pgn.cpp:1278 +msgid " White has poor piece coordination" +msgstr "" + +#: pgn.cpp:1281 +msgid " Black has poor piece coordination" +msgstr "" + +#: pgn.cpp:1284 +msgid " White has good piece coordination" +msgstr "" + +#: pgn.cpp:1287 +msgid " Black has good piece coordination" +msgstr "" + +#: pgn.cpp:1290 +msgid " White has played the opening very poorly" +msgstr "" + +#: pgn.cpp:1293 +msgid " Black has played the opening very poorly" +msgstr "" + +#: pgn.cpp:1296 +msgid " White has played the opening poorly" +msgstr "" + +#: pgn.cpp:1299 +msgid " Black has played the opening poorly" +msgstr "" + +#: pgn.cpp:1302 +msgid " White has played the opening well" +msgstr "" + +#: pgn.cpp:1305 +msgid " Black has played the opening well" +msgstr "" + +#: pgn.cpp:1308 +msgid " White has played the opening very well" +msgstr "" + +#: pgn.cpp:1311 +msgid " Black has played the opening very well" +msgstr "" + +#: pgn.cpp:1314 +msgid " White has played the middlegame very poorly" +msgstr "" + +#: pgn.cpp:1317 +msgid " Black has played the middlegame very poorly" +msgstr "" + +#: pgn.cpp:1320 +msgid " White has played the middlegame poorly" +msgstr "" + +#: pgn.cpp:1323 +msgid " Black has played the middlegame poorly" +msgstr "" + +#: pgn.cpp:1326 +msgid " White has played the middlegame well" +msgstr "" + +#: pgn.cpp:1329 +msgid " Black has played the middlegame well" +msgstr "" + +#: pgn.cpp:1332 +msgid " White has played the middlegame very well" +msgstr "" + +#: pgn.cpp:1335 +msgid " Black has played the middlegame very well" +msgstr "" + +#: pgn.cpp:1338 +msgid " White has played the ending very poorly" +msgstr "" + +#: pgn.cpp:1341 +msgid " Black has played the ending very poorly" +msgstr "" + +#: pgn.cpp:1344 +msgid " White has played the ending poorly" +msgstr "" + +#: pgn.cpp:1347 +msgid " Black has played the ending poorly" +msgstr "" + +#: pgn.cpp:1350 +msgid " White has played the ending well" +msgstr "" + +#: pgn.cpp:1353 +msgid " Black has played the ending well" +msgstr "" + +#: pgn.cpp:1356 +msgid " White has played the ending very well" +msgstr "" + +#: pgn.cpp:1359 +msgid " Black has played the ending very well" +msgstr "" + +#: pgn.cpp:1362 +msgid " White has slight counterplay" +msgstr "" + +#: pgn.cpp:1365 +msgid " Black has slight counterplay" +msgstr "" + +#: pgn.cpp:1368 +msgid " White has moderate counterplay" +msgstr "" + +#: pgn.cpp:1371 +msgid " Black has moderate counterplay" +msgstr "" + +#: pgn.cpp:1374 +msgid " White has decisive counterplay" +msgstr "" + +#: pgn.cpp:1377 +msgid " Black has decisive counterplay" +msgstr "" + +#: pgn.cpp:1380 +msgid " White has moderate time control pressure" +msgstr "" + +#: pgn.cpp:1383 +msgid " Black has moderate time control pressure" +msgstr "" + +#: pgn.cpp:1386 +msgid " White has severe time control pressure" +msgstr "" + +#: pgn.cpp:1389 +msgid " Black has severe time control pressure" +msgstr "" + +#: pgn.cpp:1391 +msgid " With the idea..." +msgstr "" + +#: pgn.cpp:1394 +msgid " Aimed against..." +msgstr "" + +#: pgn.cpp:1397 +msgid " Better Move" +msgstr "" + +#: pgn.cpp:1400 +msgid " Worse Move" +msgstr "" + +#: pgn.cpp:1403 +msgid " Equivalent move" +msgstr "" + +#: pgn.cpp:1406 +msgid " Editor's Remark" +msgstr "" + +#: pgn.cpp:1409 +msgid " Novelty" +msgstr "" + +#: pgn.cpp:1412 +msgid " Weak point" +msgstr "" + +#: pgn.cpp:1415 +msgid " Endgame" +msgstr "" + +#: pgn.cpp:1418 +msgid " Line" +msgstr "" + +#: pgn.cpp:1421 +msgid " Diagonal" +msgstr "" + +#: pgn.cpp:1424 +msgid " White has a pair of Bishops" +msgstr "" + +#: pgn.cpp:1427 +msgid " Black has a pair of Bishops" +msgstr "" + +#: pgn.cpp:1430 +msgid " Bishops of opposite color" +msgstr "" + +#: pgn.cpp:1433 +msgid " Bishops of same color" +msgstr "" + +#: pgn.cpp:1436 +msgid " Etc." +msgstr "" + +#: pgn.cpp:1439 +msgid " Doubled pawns" +msgstr "" + +#: pgn.cpp:1442 +msgid " Isolated pawn" +msgstr "" + +#: pgn.cpp:1445 +msgid " Connected pawns" +msgstr "" + +#: pgn.cpp:1448 +msgid " Hanging pawns" +msgstr "" + +#: pgn.cpp:1451 +msgid " Backwards pawn" +msgstr "" + +#: setpageaudio.cpp:28 +msgid "enable Audio" +msgstr "" + +#: setpageaudio.cpp:36 +msgid "Audio Themes" +msgstr "" + +#: setpageaudio.cpp:47 +msgid "Volume" +msgstr "" + +#: setpageaudio.cpp:48 +msgid "Maximum" +msgstr "" + +#: setpageaudio.cpp:52 +msgid "Minimum" +msgstr "" + +#: setpageaudio.cpp:55 +msgid "For Current Match Only" +msgstr "" + +#: setpagedisplay.cpp:74 +msgid "Board Themes" +msgstr "" + +#: setpagedisplay.cpp:79 +msgid "Chessman Themes" +msgstr "" + +#: setpagedisplay.cpp:85 +msgid "Theme Size" +msgstr "" + +#: setpagedisplay.cpp:88 +msgid "Small" +msgstr "" + +#: setpagedisplay.cpp:95 +msgid "Large" +msgstr "" + +#: setpagedisplay.cpp:99 +msgid "Other Display Options" +msgstr "" + +#: setpagedisplay.cpp:102 +msgid "Reverse Board Orientation" +msgstr "" + +#: setpagedisplay.cpp:107 +msgid "Display Startup Logo" +msgstr "" + +#: setpagedisplay.cpp:112 +msgid "Automatic Preview" +msgstr "" + +#: setpagedisplay.cpp:117 +msgid "Show Last Move" +msgstr "" + +#: setpagedisplay.cpp:122 +msgid "Animate Moves" +msgstr "" + +#: setpagedisplay.cpp:127 +msgid "Show Coordinates" +msgstr "" + +#: setpagedisplay.cpp:161 +msgid "Restore Defaults" +msgstr "" + +#: setpagedisplay.cpp:165 +msgid "Standard Font..." +msgstr "" + +#: setpagedisplay.cpp:174 +msgid "Private Font..." +msgstr "" + +#: setpagedisplay.cpp:183 +msgid "Channel Font..." +msgstr "" + +#: setpagedisplay.cpp:192 +msgid "Shout Font..." +msgstr "" + +#: setpagedisplay.cpp:201 +msgid "Whisper Font..." +msgstr "" + +#: setpagedisplay.cpp:210 +msgid "Notification Font..." +msgstr "" + +#: setpagedisplay.cpp:225 +msgid "Console" +msgstr "" + +#: setpagedisplay.cpp:519 +msgid "Standard" +msgstr "" + +#: setpagedisplay.cpp:520 +msgid "Private Tell" +msgstr "" + +#: setpagedisplay.cpp:521 +msgid "Channel Tell" +msgstr "" + +#: setpagedisplay.cpp:522 +msgid "Shout" +msgstr "" + +#: setpagedisplay.cpp:524 +msgid "Notification" +msgstr "" + +#: setpageengines.cpp:33 +msgid "Engines to Play White" +msgstr "" + +#: setpageengines.cpp:36 setpageengines.cpp:48 +msgid "enable Book Engine" +msgstr "" + +#: setpageengines.cpp:45 +msgid "Engines to Play Black" +msgstr "" + +#: setpageengines.cpp:57 +msgid "Chess Engines" +msgstr "" + +#: setpageengines.cpp:62 setpageservers.cpp:69 tab_seeklist.cpp:27 +msgid "Name" +msgstr "" + +#: setpageengines.cpp:64 +msgid "Wins" +msgstr "" + +#: setpageengines.cpp:65 +msgid "Losses" +msgstr "" + +#: setpageengines.cpp:66 +msgid "Draws" +msgstr "" + +#: setpageengines.cpp:73 setpageservers.cpp:77 +msgid "&Add..." +msgstr "" + +#: setpageengines.cpp:74 setpageservers.cpp:78 +msgid "&Modify..." +msgstr "" + +#: setpageengines.cpp:75 setpageservers.cpp:79 +msgid "&Delete..." +msgstr "" + +#: setpagegeneral.cpp:29 +msgid "Your Name:" +msgstr "" + +#: setpagegeneral.cpp:36 +msgid "When Knights Begins It Should:" +msgstr "" + +#: setpagegeneral.cpp:38 +msgid "Do Nothing" +msgstr "" + +#: setpagegeneral.cpp:39 +msgid "Start a Match vs. PC" +msgstr "" + +#: setpagegeneral.cpp:40 +msgid "Connect to ICS" +msgstr "" + +#: setpagegeneral.cpp:48 +msgid "Save Match on Close?" +msgstr "" + +#: setpagegeneral.cpp:52 +msgid "Ask" +msgstr "" + +#: setpagegeneral.cpp:62 +msgid "Append to Save File:" +msgstr "" + +#: setpagegeneral.cpp:65 +msgid "Append to Save File" +msgstr "" + +#: setpagegeneral.cpp:79 +msgid "Pause on Minimize" +msgstr "" + +#: setpagegeneral.cpp:85 +msgid "Always Promote to Queen" +msgstr "" + +#: setpagegeneral.cpp:91 +msgid "Call Flag Automatically" +msgstr "" + +#: setpageservers.cpp:56 +msgid "Current Server" +msgstr "" + +#: setpageservers.cpp:70 +msgid "URL" +msgstr "" + +#: setpageservers.cpp:90 +msgid "Servers" +msgstr "" + +#: setpageservers.cpp:106 +msgid "Profanity Filter" +msgstr "" + +#: setpageservers.cpp:110 +msgid "Filter Everything" +msgstr "" + +#: setpageservers.cpp:110 +msgid "No Filtering" +msgstr "" + +#: setpageservers.cpp:115 +msgid "Automatically Close Previous ICS Match" +msgstr "" + +#: setpageservers.cpp:120 +msgid "Private Matches" +msgstr "" + +#: setpageservers.cpp:124 +msgid "enable Premove" +msgstr "" + +#: setpageservers.cpp:128 +msgid "enable Kibitzes" +msgstr "" + +#: setpageservers.cpp:132 +msgid "enable Unregistered Tells" +msgstr "" + +#: setpageservers.cpp:136 +msgid "enable Shouts" +msgstr "" + +#: setpageservers.cpp:140 +msgid "enable Seeks" +msgstr "" + +#: setpageservers.cpp:150 +msgid "Seconds Between Seek Updates" +msgstr "" + +#: tab_seeklist.cpp:29 +msgid "Match Type" +msgstr "" + +#: tab_seeklist.cpp:30 +msgid "Is Rated?" +msgstr "" + +#: tabbox.cpp:163 +msgid "%1 - Knights" +msgstr "" + +#: wiz_setup.cpp:51 +msgid "Knights Setup Wizard" +msgstr "" + +#: wiz_setup.cpp:74 +msgid "" +"Thank you for installing Knights, the graphical chess interface for KDE. To " +"help you get started quickly, there are a few things Knights will need to " +"setup. You should click 'Next' to see what they are." +msgstr "" + +#: wiz_setup.cpp:77 +msgid "Welcome to Knights v%1!" +msgstr "" + +#: wiz_setup.cpp:97 +msgid "" +"When Knights saves a match to disk, it uses Portable Game Notation (PGN) to " +"store the match. Several other computer chess games use PGN too. If you " +"like, Knights can be the default PGN viewer on this system." +msgstr "" + +#: wiz_setup.cpp:100 +msgid "Let Knights handle PGN files?" +msgstr "" + +#: wiz_setup.cpp:106 +msgid "Let Knights handle your .pgn files?" +msgstr "" + +#: wiz_setup.cpp:125 +msgid "" +"Knights can not play a chess match against you without help. Known as Chess " +"Engines, these helpers can be found on the Internet and are often included " +"with your distribution. Knights can look for Chess Engines that you may " +"already have. If found, Knights will configure itself to use them." +msgstr "" + +#: wiz_setup.cpp:128 wiz_setup.cpp:134 +msgid "Let Knights search for chess engines?" +msgstr "" + +#: wiz_setup.cpp:153 +msgid "" +"In order for you to play chess online, Knights will have to connect to a " +"chess server. Knights has a list of several of these servers. If you like, " +"this list can be used to automatically configure Knights." +msgstr "" + +#: wiz_setup.cpp:156 wiz_setup.cpp:162 +msgid "Let Knights configure chess servers?" +msgstr "" + +#: wiz_setup.cpp:181 +msgid "" +"Knights has now configured itself according to your choices. We strongly " +"recommend that you read the documentation to make full use of all that " +"Knights has to offer. You can access it by pressing F1." +msgstr "" + +#: wiz_setup.cpp:184 +msgid "Setup Complete" +msgstr "" + +#: wiz_setup.cpp:213 +msgid "Do you accept the terms of our license?" +msgstr "" + +#: wiz_setup.cpp:218 +msgid "Please read and accept our license:" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Free Internet Chess Server" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Internet Chess Club" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Global Chess Server" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Chess.Net" +msgstr "" + +#: wiz_setup.cpp:270 +msgid "Chess-Square.Com" +msgstr "" + +#: wiz_setup.cpp:270 +msgid "Australian FICS" +msgstr "" + +#: wiz_setup.cpp:270 +msgid "Brazilian FICS" +msgstr "" + +#: wiz_setup.cpp:270 +msgid "Chilean FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "Croatian FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "Dutch FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "French FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "German FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "Swedish FICS" +msgstr "" + +#: proto_xboard.cpp:443 +msgid "" +"%1 suggests this move:\n" +"%2" +msgstr "" + +#: proto_xboard.cpp:465 proto_xboard.cpp:472 proto_xboard.cpp:479 +msgid "" +"%1 tells you:\n" +"%2" +msgstr "" diff --git a/po/et.po b/po/et.po new file mode 100644 index 0000000..526fe56 --- /dev/null +++ b/po/et.po @@ -0,0 +1,2243 @@ +# Estonian translation of Knights. +# Copyright (C) YEAR Free Software Foundation, Inc. +# Kunnar Klauks, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: Knights 0.5.4\n" +"POT-Creation-Date: 2003-01-21 04:30-0600\n" +"PO-Revision-Date: 2002-11-27 21:25GMT\n" +"Last-Translator: Kunnar Klauks \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 0.9.6\n" + +#: accel.cpp:23 +msgid "Previous Move" +msgstr "Eelmine käik" + +#: accel.cpp:24 +msgid "Next Move" +msgstr "Järgmine käik" + +#: accel.cpp:25 +msgid "Enter Text" +msgstr "Sisesta tekst" + +#: accel.cpp:26 +msgid "Page Up" +msgstr "Page Up" + +#: accel.cpp:27 +msgid "Page Down" +msgstr "Page Down" + +#: accel.cpp:28 +msgid "Increase Board Size" +msgstr "Suurenda laua suurust" + +#: accel.cpp:29 +msgid "Decrease Board Size" +msgstr "Vähenda laua suurust" + +#: accel.cpp:30 +msgid "Last History Item" +msgstr "Viimane ajaloo element" + +#: accel.cpp:31 +msgid "Next History Item" +msgstr "Järgmine ajaloo element" + +#: accel.cpp:32 +msgid "Reply to the Last Tell" +msgstr "Vasta viimasele teatele" + +#: accel.cpp:33 +msgid "Reply to the Channel" +msgstr "Vasta kanalisse" + +#: accel.cpp:34 +msgid "Kibitz" +msgstr "Kiibitse" + +#: accel.cpp:35 setpagedisplay.cpp:523 +msgid "Whisper" +msgstr "Sosista" + +#: challenge_graph.cpp:75 tab_seeklist.cpp:40 +msgid "Seek Matches" +msgstr "Otsi partiid" + +#: challenge_graph.cpp:77 tab_seeklist.cpp:42 +msgid "Accept This Match" +msgstr "Aktsepteeri see partii" + +#: challenge_graph.cpp:78 tab_seeklist.cpp:43 +msgid "Tell..." +msgstr "Räägi..." + +#: challenge_graph.cpp:79 tab_seeklist.cpp:44 +msgid "Assess..." +msgstr "Hinda..." + +#: challenge_graph.cpp:80 tab_seeklist.cpp:45 +msgid "Player Info" +msgstr "Mängija info" + +#: challenge_graph.cpp:82 tab_seeklist.cpp:47 +msgid "Player History" +msgstr "Mängija ajalugu" + +#: challenge_graph.cpp:84 tab_seeklist.cpp:49 +msgid "Add to Friends" +msgstr "Lisa sõprade hulka" + +#: challenge_graph.cpp:85 tab_seeklist.cpp:50 +msgid "Ignore This Player" +msgstr "Ignoreeri seda mängijat" + +#: challenge_graph.cpp:304 tab_seeklist.cpp:28 +msgid "Rating" +msgstr "Reiting" + +#: challenge_graph.cpp:311 +msgid "Time" +msgstr "Aeg" + +#: challenge_graph_view.cpp:105 +msgid " Name: %1 Rating: %2 Match Type: %3 %4 Base Time: %5 Increment: %6" +msgstr "Nimi: %1 Reiting: %2 Partii tüüp: %3 %4 Mõtlemisaeg: %5 Inkrement: %6" + +#: core.cpp:385 +msgid "Hint" +msgstr "Nõuanne" + +#: core.cpp:388 +msgid "Tell User" +msgstr "Räägi kasutajale" + +#: core.cpp:391 +msgid "Tell User Error" +msgstr "Tell User Error" + +#: core.cpp:397 +msgid "Tell Opponent" +msgstr "Räägi vastasele" + +#: core.cpp:411 +msgid "Tell All" +msgstr "Räägi kõigile" + +#: core.cpp:646 +#, fuzzy +msgid "Load PGN..." +msgstr "Ava partii" + +#: core.cpp:690 +#, fuzzy +msgid "Would you like to save this match?" +msgstr "Kas sa tahaksid salvestada seda partiid?" + +#: core.cpp:691 +#, fuzzy +msgid "Save Match?" +msgstr "Sa&lvesta partii " + +#: core.cpp:710 +#, fuzzy +msgid "Save Match..." +msgstr "Salvesta partii &kui..." + +#: dlg_challenge.cpp:25 +msgid "You've Been Challenged:" +msgstr "Sulle esitati väljakutse" + +#: dlg_challenge.cpp:29 +msgid "Accept" +msgstr "Aktsepteeri" + +#: dlg_challenge.cpp:30 +msgid "Decline" +msgstr "Keeldu" + +#: dlg_challenge.cpp:49 +msgid "Time Odds Match" +msgstr "Partii ajakontrollid" + +#: dlg_challenge.cpp:53 +msgid "Unrated" +msgstr "Mittehinnatud" + +#: dlg_challenge.cpp:54 +msgid "Rated" +msgstr "Hinnatud" + +#: dlg_challenge.cpp:60 dlg_challenge.cpp:69 dlg_newmatch.cpp:87 +#: dlg_newmatch.cpp:104 tab_seeklist.cpp:101 +msgid " min." +msgstr " min." + +#: dlg_challenge.cpp:61 dlg_challenge.cpp:70 dlg_newmatch.cpp:97 +#: dlg_newmatch.cpp:114 setpageservers.cpp:146 tab_seeklist.cpp:102 +msgid " sec." +msgstr " sek." + +#: dlg_challenge.cpp:62 dlg_challenge.cpp:71 tab_seeklist.cpp:31 +msgid "Base Time" +msgstr "Mõtlemisaeg" + +#: dlg_challenge.cpp:63 dlg_challenge.cpp:72 tab_seeklist.cpp:32 +msgid "Increment" +msgstr "Inkrement" + +#: dlg_challenge.cpp:109 +msgid "" +"%1 %2 vs. %3 %4\n" +"in a %5 match." +msgstr "" +"%1 %2 vs. %3 %4\n" +"%5 partiis." + +#: dlg_challenge.cpp:124 dlg_challenge.cpp:125 +msgid "Time Controls" +msgstr "Ajakontrollid" + +#: dlg_challenge.cpp:154 +msgid "Counter Offer" +msgstr "Vastupakkumine" + +#: dlg_engine.cpp:26 +msgid "Configure Engine" +msgstr "Seadista mootorit" + +#: dlg_engine.cpp:38 +msgid "Engine Name" +msgstr "Mootori nimi" + +#: dlg_engine.cpp:43 setpageengines.cpp:63 +msgid "Protocol" +msgstr "Protokoll" + +#: dlg_engine.cpp:48 +msgid "Engine Filename" +msgstr "Mootori faili nimi" + +#: dlg_engine.cpp:54 +msgid "Command Line Arguments" +msgstr "Käsurea argumendid" + +#: dlg_engine.cpp:59 dlg_server.cpp:88 +msgid "Log File" +msgstr "Logi fail" + +#: dlg_login.cpp:21 +msgid "Login Prompt" +msgstr "Sisselogimise viip" + +#: dlg_login.cpp:31 +msgid "Login:" +msgstr "Logi sisse:" + +#: dlg_login.cpp:32 +msgid "Password:" +msgstr "Parool:" + +#: dlg_login.cpp:38 +msgid "Log in as guest" +msgstr "Logi sisse külalisena" + +#: dlg_login.cpp:54 +msgid "Login" +msgstr "Login" + +#: dlg_login.cpp:54 +msgid "Log in to the chess server using this name and password." +msgstr "Logi serverisse kasutades seda nime ja parooli" + +#: dlg_newmatch.cpp:38 +msgid "Start a New Match" +msgstr "Alusta uut partiid" + +#: dlg_newmatch.cpp:45 +msgid "White" +msgstr "Valge" + +#: dlg_newmatch.cpp:46 +msgid "Black" +msgstr "Must" + +#: dlg_newmatch.cpp:59 dlg_newmatch.cpp:66 +msgid "Human" +msgstr "Inimene" + +#: dlg_newmatch.cpp:60 dlg_newmatch.cpp:67 +msgid "Computer" +msgstr "Arvuti" + +#: dlg_newmatch.cpp:61 dlg_newmatch.cpp:68 +msgid "Email" +msgstr "E-post" + +#: dlg_newmatch.cpp:85 dlg_newmatch.cpp:102 +msgid "Base Time:" +msgstr "Mõtlemisaeg" + +#: dlg_newmatch.cpp:90 dlg_newmatch.cpp:107 +msgid "Moves Per Base Time" +msgstr "Käike mõtlemisaja jooksul" + +#: dlg_newmatch.cpp:92 dlg_newmatch.cpp:109 +msgid " moves" +msgstr "käike" + +#: dlg_newmatch.cpp:95 dlg_newmatch.cpp:112 +msgid "Increment Per Move" +msgstr "Inkrement käigule" + +#: dlg_promote.cpp:94 +msgid "Promote your pawn to..." +msgstr "Muunda oma ettur..." + +#: dlg_promote.cpp:101 +msgid "Pawn Promotion" +msgstr "Etturi muundamine" + +#: dlg_selectemail.cpp:27 +msgid "Select Email Address" +msgstr "Vali e-posti aadress" + +#: dlg_selectengine.cpp:30 +msgid "Select Computer Player" +msgstr "Valiti arvuti vastane" + +#: dlg_selectengine.cpp:41 +msgid "Computer Players" +msgstr "Arvuti vastased" + +#: dlg_selectengine.cpp:61 +msgid "Player Strength" +msgstr "Mängija tugevus" + +#: dlg_selectengine.cpp:63 +msgid "Weak" +msgstr "Nõrk" + +#: dlg_selectengine.cpp:70 +msgid "Strong" +msgstr "Tugev" + +#: dlg_server.cpp:25 +msgid "Configure Server" +msgstr "Seadista serverit" + +#: dlg_server.cpp:37 +msgid "Server Name" +msgstr "Serveri nimi" + +#: dlg_server.cpp:44 +msgid "Server URL" +msgstr "Serveri URL" + +#: dlg_server.cpp:49 +msgid "Server Port" +msgstr "Serveri port" + +#: dlg_server.cpp:56 +msgid "Username" +msgstr "Kasutajanimi" + +#: dlg_server.cpp:59 +msgid "Remember My Password" +msgstr "Pea minu parool meeles" + +#: dlg_server.cpp:64 +msgid "Password" +msgstr "Parool" + +#: dlg_server.cpp:71 +msgid "Confirm Password" +msgstr "Kinnita parool" + +#: dlg_server.cpp:79 +msgid "Timeseal" +msgstr "Timeseal" + +#: dlg_settings.cpp:48 setpagedisplay.cpp:142 +msgid "General" +msgstr "Üldine" + +#: dlg_settings.cpp:49 +msgid "Various aspects of Knights get configured here." +msgstr "Siin muudetakse mitmesuguseid Knights'i seadeid." + +#: dlg_settings.cpp:55 +msgid "Display" +msgstr "Välimus" + +#: dlg_settings.cpp:56 +msgid "These settings determine how Knights displays itself to you." +msgstr "Knights'i välimuse seadistused." + +#: dlg_settings.cpp:62 +msgid "Audio" +msgstr "Heli" + +#: dlg_settings.cpp:63 +msgid "These settings determine what Knights sounds like." +msgstr "Siin seadistatakse Knights'i heli" + +#: dlg_settings.cpp:69 +msgid "Computer Opponents" +msgstr "Arvuti vastased" + +#: dlg_settings.cpp:70 +msgid "Configure your chess engines here." +msgstr "Seadista oma male mootoreid siin" + +#: dlg_settings.cpp:76 setpageservers.cpp:65 +msgid "Chess Servers" +msgstr "Maleserverid" + +#: dlg_settings.cpp:77 +msgid "Configure your internet chess servers here." +msgstr "Seadista interneti serverid siin" + +#: io_internet.cpp:80 +msgid "" +"There are no servers configured.\n" +"Please make sure you have at least one server configured." +msgstr "" +"Ükski server pole seadistatud.\n" +"Palun seadista vähemalt üks server" + +#: io_internet.cpp:80 +msgid "Cannot find a server." +msgstr "Serverit ei leitud" + +#: io_internet.cpp:99 +msgid "" +"Knights can not start Timeseal.\n" +"Please make sure you have the correct path and filename configured." +msgstr "" +"Knights ei suuda käivitada Timeseal'i.\n" +"Palun kontrolli et tee failini on sisestatud korrektselt ja failinimi on " +"seatud" + +#: io_internet.cpp:99 +msgid "Cannot find Timeseal." +msgstr "Timeseali ei leitud" + +#: io_internet.cpp:109 io_internet.cpp:121 +msgid "" +"Knights is unable to connect to the server.\n" +" Please make sure your internet connection is working and try again." +msgstr "" +"Knights ei saanud serveriga ühendust.\n" +"Palun kontrolli kas internetiühendus toimib ja proovi uuesti." + +#: io_internet.cpp:109 io_internet.cpp:121 +msgid "Cannot connect to server." +msgstr "Ei saa serveriga ühendust" + +#: io_internet.cpp:144 +msgid "%1 Console" +msgstr "%1 Konsool" + +#: io_internet.cpp:149 +#, fuzzy +msgid "Sought Matches List" +msgstr "Otsitavate partiide nimekiri" + +#: io_internet.cpp:154 +#, fuzzy +msgid "Sought Matches Graph" +msgstr "Otsitavate partiide graafik" + +#: knights.cpp:70 main.cpp:34 +msgid "Knights" +msgstr "Knights" + +#: knights.cpp:250 +msgid "&Draw" +msgstr "&Viik" + +#: knights.cpp:254 +msgid "&Retract Move" +msgstr "Võta käik &tagasi" + +#: knights.cpp:256 +msgid "Select this to retract your last move." +msgstr "Vali see viimase käigu käigu tagasivõtmiseks" + +#: knights.cpp:258 +msgid "Resign" +msgstr "Alistu" + +#: knights.cpp:260 +msgid "Use this to concede the match to your opponent." +msgstr "Kasuta seda vastasele alla andmiseks" + +#: knights.cpp:262 +msgid "&Call Flag" +msgstr "&Aja ületamine" + +#: knights.cpp:264 +#, fuzzy +msgid "" +"Use this to declare the match over, due to your opponent being out of time." +msgstr "" +"Kasuta seda mängu lõpu deklareerimiseks, kuna su vastane on ületanud aja" + +#: knights.cpp:266 +msgid "&Hint" +msgstr "&Nõuanne" + +#: knights.cpp:268 +msgid "This will ask your opponent for a hint." +msgstr "Küsi selle abil vastaselt nõu" + +#: knights.cpp:270 +msgid "Move &Now" +msgstr "&Käi nüüd" + +#: knights.cpp:272 +msgid "Clicking this option will force your opponent to move immediately." +msgstr "Klikkides sellele valikule sunnid oma vastast koheselt käima" + +#: knights.cpp:274 +msgid "&Flip View" +msgstr "&Vaheta vaadet" + +#: knights.cpp:276 +msgid "This will reverse the chessboard's orientation by 180 degrees." +msgstr "See pöörab malelaua asendit 180 kraadi võrra." + +#: knights.cpp:278 +msgid "&Ponder" +msgstr "&Mõtle vastase käigu ajal" + +#: knights.cpp:281 +msgid "This toggles your opponent's ability to think while it's your turn." +msgstr "See vahetab vastase võimet mõelda või mitte mõelda sinu käigu ajal, " + +#: knights.cpp:285 knights.cpp:949 +msgid "Pause" +msgstr "Peata" + +#: knights.cpp:287 +msgid "Select this to pause the clock for this match." +msgstr "Vali see et peatada kell selles partiis" + +#: knights.cpp:292 +msgid "&Offer Draw" +msgstr "&Paku viiki" + +#: knights.cpp:293 +#, fuzzy +msgid "" +"Clicking this will inform your opponent that you are willing draw the match." +msgstr "Kliki siia kui tahad vastasele viiki pakkuda" + +#: knights.cpp:295 +msgid "&Accept Draw" +msgstr "&Võta viik vastu" + +#: knights.cpp:296 +msgid "Clicking this will accept a draw offered by your opponent." +msgstr "Kliki siia et võtta vastase viigipakkumine vastu" + +#: knights.cpp:298 +msgid "&Reject Draw" +msgstr "&Lükka viigipakkumine tagasi" + +#: knights.cpp:299 +msgid "Clicking this will reject a draw offered by your opponent." +msgstr "Kliki siia et vastase viigipakkumine tagasi lükata" + +#: knights.cpp:301 +msgid "&Ignore Draw" +msgstr "&Ignoreeri viigipakkumist" + +#: knights.cpp:302 +msgid "Clicking this will ignore future draw offers from your opponent." +msgstr "Kliki siia kui tahad edaspidi vastase viigipakkumisi ignoreerida" + +#: knights.cpp:308 +msgid "&New Match..." +msgstr "&Uus partii" + +#: knights.cpp:309 +msgid "This allows you to begin a new match." +msgstr "Siit on võimalik alustada uut partiid" + +#: knights.cpp:312 +msgid "&Load Match..." +msgstr "&Ava partii " + +#: knights.cpp:313 +#, fuzzy +msgid "" +"The Load command will allow you to select a previously saved match and play " +"it again." +msgstr "" +"Ava käsk võimaldab sul valida eelnevalt salvestatud partii ja mängida seda " +"uuesti" + +#: knights.cpp:316 thinbuttons.cpp:40 +msgid "&Close Match" +msgstr "&Sulge partii" + +#: knights.cpp:318 +msgid "This command removes the current match." +msgstr "See käsk sulgeb käesoleva partii" + +#: knights.cpp:320 +msgid "Close All" +msgstr "Sulge kõik" + +#: knights.cpp:322 +msgid "This command will remove all matches that are currently loaded." +msgstr "See käsk sulgeb kõik partiid mis on sel hetkel laetud" + +#: knights.cpp:326 thinbuttons.cpp:32 +msgid "&Save Match" +msgstr "Sa&lvesta partii " + +#: knights.cpp:328 knights.cpp:333 +#, fuzzy +msgid "" +"The Save command will allow you to store a copy of your current match for " +"later use." +msgstr "" +"Salvesta käsk võimldab salvestatada koopia käesolevast partiidt hilisemaks " +"kasutamiseks" + +#: knights.cpp:331 thinbuttons.cpp:34 +msgid "Save Match &As..." +msgstr "Salvesta partii &kui..." + +#: knights.cpp:337 knights.cpp:859 +msgid "Connect to Server" +msgstr "Ühenda serveriga" + +#: knights.cpp:338 +msgid "Clicking this will connect Knights with an internet chess server." +msgstr "Sellele klikkides ühendab Knights ennast interneti maleserveriga" + +#: knights.cpp:342 thinbuttons.cpp:37 +msgid "&Print Notation..." +msgstr "&Trüki notatsioon" + +#: knights.cpp:344 +msgid "" +"The Print command will allow you to print this game's notation on your " +"printer." +msgstr "Trüki käsk võimaldab trükkida partii notatsiooni " + +#: knights.cpp:349 +#, fuzzy +msgid "The Quit command will stop all matches and exit Knights." +msgstr "Välju käsk peatab käesoleva partii ja sulgen Knights'i" + +#: knights.cpp:355 +msgid "Play &White" +msgstr "Mängi &valgetega" + +#: knights.cpp:358 +msgid "" +"If checked, this option tells Knights that you will play as the White army " +"when you play vs. the computer." +msgstr "" +"Kui märgitud, teatab see valik Knights'ile et sa mängid valgete malenditega " +"arvuti vastu. " + +#: knights.cpp:360 +msgid "Play &Black" +msgstr "Mängi &mustadega" + +#: knights.cpp:363 +msgid "" +"If checked, this option tells Knights that you will play as the Black army " +"when you play vs. the computer." +msgstr "" +"Kui märgitud, teatab see valik Knights'ile et sa mängid mustade malenditega " +"arvuti vastu. " + +#: knights.cpp:366 +msgid "&Install Themes" +msgstr "&Paigalda uus teema " + +#: knights.cpp:367 +msgid "This lets you install downloaded themes into Knights." +msgstr "Siit saad paigaldada uusi teemasid Knights'le" + +#: knights.cpp:371 +msgid "" +"Click this if you want to change the keyboard shortcuts that Knights uses." +msgstr "Kliki siia kui soovid muuta Knights'i klahvide seoseid" + +#: knights.cpp:374 +msgid "&Configure Knights..." +msgstr "Knights &seadistamine..." + +#: knights.cpp:375 +msgid "" +"This opens a new window which allows you to customize Knights to your " +"particular tastes." +msgstr "See avab uue akna mis võimaldab seadistada Knights'i oma maitse järgi" + +#: knights.cpp:381 +msgid "Begin a Tutorial" +msgstr "Alusta õppetundi" + +#: knights.cpp:387 +msgid "&Match" +msgstr "&Partii" + +#: knights.cpp:576 +#, fuzzy +msgid "Error with white engine" +msgstr "Valgete mootori viga" + +#: knights.cpp:578 +msgid "" +"You selected %1 to play white,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play white." +msgstr "" +"Valgetega mängimiseks on valitud %1 ,\n" +"kuid seda saab kasutada ainult avangumootorina. \n" +"Palun vali teine mootor valgetega mängimiseks" + +#: knights.cpp:579 +msgid "White Engine Problem" +msgstr "Valge mootori probleem" + +#: knights.cpp:582 +#, fuzzy +msgid "Error with white book engine" +msgstr "Valgete avangumootori viga" + +#: knights.cpp:584 +msgid "" +"You selected %1 to play white's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play white's book." +msgstr "" +"%1 valitud valge avanguraamatu jaoks,\n" +"kuid seda saab kasutada ainult hariliku mootorina.\n" +"Palun vali teine mootor valge avanguraamatu jaoks." + +#: knights.cpp:585 +msgid "White Book Engine Problem" +msgstr "Valge avangumootori probleem" + +#: knights.cpp:588 +#, fuzzy +msgid "Error with black engine" +msgstr "Mustade mootori viga" + +#: knights.cpp:590 +msgid "" +"You selected %1 to play black,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play black." +msgstr "" +"%1 valitud mustadega mängimiseks,\n" +"kuid seda saab kasutada ainult avangumootorina.\n" +"Palun vali teine mootor mustadega mängimiseks." + +#: knights.cpp:591 +msgid "Black Engine Problem" +msgstr "Musta mootori probleem" + +#: knights.cpp:594 +#, fuzzy +msgid "Error with black book engine" +msgstr "Musta avangumootori viga" + +#: knights.cpp:596 +msgid "" +"You selected %1 to play black's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play black's book." +msgstr "" +"%1 valitud mustade avanguraamatu jaoks,\n" +"kuid seda saab kasutada ainult hariliku mootorina.\n" +"Palun vali teine mootor mustade avanguraamatu jaoks." + +#: knights.cpp:597 +msgid "Black Book Engine Problem" +msgstr "Musta avangumootori viga" + +#: knights.cpp:600 +#, fuzzy +msgid "The computer opponent assigned to play %1 has crashed" +msgstr "Arvuti vastan %1 -ga mämgimiseks jooksis kokku." + +#: knights.cpp:603 +#, fuzzy +msgid "There was an error while loading the file" +msgstr "Viga faili avamisel" + +#: knights.cpp:606 +#, fuzzy +msgid "There was an error while saving the file" +msgstr "Viga faili salvestamisel" + +#: knights.cpp:610 +#, fuzzy +msgid "Loading complete" +msgstr "Laadimine lõpetatud" + +#: knights.cpp:613 +#, fuzzy +msgid "Saving complete" +msgstr "Salvestamine lõpetatud" + +#: knights.cpp:616 +#, fuzzy +msgid "Reading File" +msgstr "Faili lugemine" + +#: knights.cpp:619 +#, fuzzy +msgid "Can not move a chessman while reviewing the match" +msgstr "Malendit ei saa liigutada partii ülevaatamise ajal" + +#: knights.cpp:622 +#, fuzzy +msgid "Illegal Move" +msgstr "Illegaalne käik" + +#: knights.cpp:625 +#, fuzzy +msgid "White's turn" +msgstr "Valge käik" + +#: knights.cpp:628 +#, fuzzy +msgid "Black's turn" +msgstr "Musta käik" + +#: knights.cpp:631 +#, fuzzy +msgid "White wins" +msgstr "Valge võitis" + +#: knights.cpp:634 +#, fuzzy +msgid "Black wins" +msgstr "Must võitis" + +#: knights.cpp:637 +#, fuzzy +msgid "Checkmate, White wins" +msgstr "Matt, valge võitis" + +#: knights.cpp:640 +#, fuzzy +msgid "Checkmate, Black wins" +msgstr "Matt, must võitis" + +#: knights.cpp:643 +#, fuzzy +msgid "White resigns" +msgstr "Valge alistus" + +#: knights.cpp:646 +#, fuzzy +msgid "Black resigns" +msgstr "Must alistus" + +#: knights.cpp:649 +#, fuzzy +msgid "White's flag fell" +msgstr "Valge ületas aja" + +#: knights.cpp:652 +#, fuzzy +msgid "Black's flag fell" +msgstr "Must ületas aja" + +#: knights.cpp:655 +#, fuzzy +msgid "Black's flag was called, White wins" +msgstr "Must ületas aja, valge võitis" + +#: knights.cpp:658 +#, fuzzy +msgid "White's flag was called, Black wins" +msgstr "Valge ületas aja, must võitis" + +#: knights.cpp:661 +#, fuzzy +msgid "Draw match" +msgstr "Partii lõppes viigiga" + +#: knights.cpp:664 +#, fuzzy +msgid "50 moves rule, draw match" +msgstr "50 käigu reegel, viik" + +#: knights.cpp:667 +#, fuzzy +msgid "Starting computer players, please wait" +msgstr "Arvuti mängijate käivitamine, palun oota" + +#: knights.cpp:670 +#, fuzzy +msgid "Match paused" +msgstr "Partii tüüp" + +#: knights.cpp:673 +#, fuzzy +msgid "White has offered a draw" +msgstr "Valge pakkus viiki" + +#: knights.cpp:676 +#, fuzzy +msgid "Black has offered a draw" +msgstr "Must pakkus viiki" + +#: knights.cpp:679 +#, fuzzy +msgid "Lost contact with opponent" +msgstr "Kontakt vastasega kadunud" + +#: knights.cpp:682 +#, fuzzy +msgid "Ready" +msgstr "Valmis" + +#: knights.cpp:866 +msgid "Disconnect from Server" +msgstr "Lahuta serverist" + +#: knights.cpp:955 +msgid "Resume" +msgstr "Jätka" + +#: knights.cpp:1014 +msgid "Knights Themes" +msgstr "Knightsi teemad" + +#: knights.cpp:1015 +msgid "Install Theme..." +msgstr "Paigalda teema" + +#: knights.cpp:1045 +msgid "" +"You do not have permission to install this theme systemwide, so Knights " +"installed it locally." +msgstr "" +"Puuduvad õigused, et paigaldada seda teemat tervele süsteemile, Knights " +"paigaldas selle lokaalselt." + +#: knights.cpp:1046 +msgid "Installed theme locally" +msgstr "Lokaalselt paigaldatud teema" + +#: knights.cpp:1051 +#, c-format +msgid "" +"The theme could not be installed:\n" +"%1" +msgstr "" +"Teemat ei õnnestunud paigaldada:\n" +"%1" + +#: knights.cpp:1052 +msgid "Can not install theme" +msgstr "Ei suuda paigaldada teemat" + +#: knightstextview.cpp:35 +msgid "Select &All" +msgstr "Vali &kõik" + +#: knightstextview.cpp:44 +msgid "Zoom &In" +msgstr "&Suurendus sisse" + +#: knightstextview.cpp:46 +msgid "Zoom &Out" +msgstr "Suurendus &välja" + +#: list_pgn.cpp:29 list_pgn.cpp:48 +msgid "Result" +msgstr "Tulemus" + +#: list_pgn.cpp:30 list_pgn.cpp:49 +msgid "Title" +msgstr "Tiitel" + +#: list_pgn.cpp:31 list_pgn.cpp:50 +msgid "Round" +msgstr "Voor" + +#: list_pgn.cpp:32 list_pgn.cpp:51 +msgid "Site" +msgstr "Asukoht" + +#: list_pgn.cpp:33 list_pgn.cpp:52 +msgid "Date" +msgstr "Kuupäev" + +#: list_pgn.cpp:81 +#, c-format +msgid "Can not open %1" +msgstr "Ei suuda avada %1" + +#: list_pgn.cpp:140 +msgid "%1 matches found." +msgstr "leiti %1 partiid" + +#: main.cpp:26 +msgid "Specify the location of your Knights data directory." +msgstr "Määra oma Knights'i andmete kataloogi asukoht" + +#: main.cpp:27 +msgid "A .pgn file to be loaded." +msgstr "Avatav pgn fail" + +#: main.cpp:36 +msgid "" +"The Knights Chess Interface\n" +"\n" +"Knights is a chess interface\n" +"for the K Desktop Environment." +msgstr "" +"Graafiline maleliides Knights\n" +"\n" +"Knights on graafiline\n" +"maleliides KDE jaoks" + +#: main.cpp:44 +msgid "Project Manager and Programmer" +msgstr "Projekti juht ja programmeerija" + +#: main.cpp:48 +msgid "Communications Programmer" +msgstr "Kommunikatsioonide programmeerija" + +#: main.cpp:52 +msgid "Qtopia port and patches" +msgstr "Qtopia port ja parandused" + +#: main.cpp:56 +msgid "Patches and suggestions" +msgstr "Parandused ja soovitused" + +#: main.cpp:60 +msgid "KDE3 Compatability Patch" +msgstr "KDE3 kompatiibluse parandus" + +#: main.cpp:64 +msgid "XBoard protocol" +msgstr "XBoard protokoll" + +#: _translatorinfo.cpp:1 main.cpp:67 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Kunnar Klauks" + +#: _translatorinfo.cpp:3 main.cpp:68 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "kk001a@hot.ee" + +#: match_param.cpp:107 +msgid "Unknown" +msgstr "Tundmatu" + +#: pgn.cpp:145 +msgid "%1 vs. %2" +msgstr "%1 vs. %2" + +#: pgn.cpp:943 +#, c-format +msgid "Page %1" +msgstr "Lehekülg %1" + +#: pgn.cpp:975 +msgid " Good move" +msgstr "Hea käik" + +#: pgn.cpp:978 +msgid " Poor move" +msgstr "Halb käik" + +#: pgn.cpp:981 +msgid " Very good move" +msgstr "Väga hea käik" + +#: pgn.cpp:984 +msgid " Very poor move" +msgstr "Väga halb käik" + +#: pgn.cpp:987 +msgid " Speculative move" +msgstr "Spekulatiivne käik" + +#: pgn.cpp:990 +msgid " Questionable move" +msgstr "Küsitav käik" + +#: pgn.cpp:993 +msgid " Forced move" +msgstr "Sunnitud käik" + +#: pgn.cpp:996 +msgid " Singular move" +msgstr "Ainuke käik" + +#: pgn.cpp:999 +msgid " Worst move" +msgstr "Halvim käik" + +#: pgn.cpp:1002 +msgid " Drawish position" +msgstr "Viigiline seis" + +#: pgn.cpp:1005 +msgid " Equal chances, quiet position" +msgstr "Võrdsed võimalused, vaikne seis" + +#: pgn.cpp:1008 +msgid " Equal chances, active position" +msgstr "Võrdsed võimalused, aktiivne seis" + +#: pgn.cpp:1011 +msgid " Unclear position" +msgstr "Segane seis" + +#: pgn.cpp:1014 +msgid " White has a slight advantage" +msgstr "Valgel on kerge paremus" + +#: pgn.cpp:1017 +msgid " Black has a slight advantage" +msgstr "Mustal on kerge paremus" + +#: pgn.cpp:1020 +msgid " White has a moderate advantage" +msgstr "Valgetel on keskmine paremus" + +#: pgn.cpp:1023 +msgid " Black has a moderate advantage" +msgstr "Mustadel on keskmine paremus" + +#: pgn.cpp:1026 +msgid " White has a decisive advantage" +msgstr "Valgel on otsustav paremus" + +#: pgn.cpp:1029 +msgid " Black has a decisive advantage" +msgstr "Mustal on otsustav paremus" + +#: pgn.cpp:1032 +msgid " White has a crushing advantage ( Black should resign )" +msgstr "Valgetel on hävitav paremus ( must peaks alistuma )" + +#: pgn.cpp:1035 +msgid " Black has a crushing advantage ( White should resign )" +msgstr "Mustal on hävitav paremus ( valge peaks alistuma )" + +#: pgn.cpp:1038 +msgid " White is in zugzwang" +msgstr "Valge on käigupuuduses" + +#: pgn.cpp:1041 +msgid " Black is in zugzwang" +msgstr "Must on käigupuuduses" + +#: pgn.cpp:1044 +msgid " White has a slight space advantage" +msgstr "Valgel on kerge ruumiline ülekaal" + +#: pgn.cpp:1047 +msgid " Black has a slight space advantage" +msgstr "Mustal on kerge ruumiline ülekaal" + +#: pgn.cpp:1050 +msgid " White has a moderate space advantage" +msgstr "Valgel on keskmine ruumiline paremus" + +#: pgn.cpp:1053 +msgid " Black has a moderate space advantage" +msgstr "Mustal on keskmine ruumiline paremus" + +#: pgn.cpp:1056 +msgid " White has a decisive space advantage" +msgstr "Valgel on otsustav ruumiline paremus" + +#: pgn.cpp:1059 +msgid " Black has a decisive space advantage" +msgstr "Mustal on otsustav ruumiline paremus" + +#: pgn.cpp:1062 +msgid " White has a slight time ( development ) advantage" +msgstr "Valgel on kerge paremus arenduses" + +#: pgn.cpp:1065 +msgid " Black has a slight time ( development ) advantage" +msgstr "Mustal on kerge paremus arenduses" + +#: pgn.cpp:1068 +msgid " White has a moderate time ( development ) advantage" +msgstr "Valgetel on keskmine paremus arenduses" + +#: pgn.cpp:1071 +msgid " Black has a moderate time ( development ) advantage" +msgstr "Mustadel on keskmine paremus arenduses" + +#: pgn.cpp:1074 +msgid " White has a decisive time ( development ) advantage" +msgstr "Valgel on otsustav paremus arenduses" + +#: pgn.cpp:1077 +msgid " Black has a decisive time ( development ) advantage" +msgstr "Mustal on otsustav paremus arenduses" + +#: pgn.cpp:1080 +msgid " White has the initiative" +msgstr "Valgel on initsiatiiv" + +#: pgn.cpp:1083 +msgid " Black has the initiative" +msgstr "Mustal on initsiatiiv" + +#: pgn.cpp:1086 +msgid " White has a lasting initiative" +msgstr "Valgel on kestev initsiatiiv" + +#: pgn.cpp:1089 +msgid " Black has a lasting initiative" +msgstr "Mustal on kestev initsiatiiv" + +#: pgn.cpp:1092 +msgid " White has the attack" +msgstr "Valge ründab" + +#: pgn.cpp:1095 +msgid " Black has the attack" +msgstr "Must ründab" + +#: pgn.cpp:1098 +msgid " White has insufficient compensation for material deficit" +msgstr "Valgel pole küllaldast kompensatsiooni materjalipuuduse eest" + +#: pgn.cpp:1101 +msgid " Black has insufficient compensation for material deficit" +msgstr "Mustal pole küllaldast kompensatsiooni materjalipuuduse eest" + +#: pgn.cpp:1104 +msgid " White has sufficient compensation for material deficit" +msgstr "Valgel on küllaldane kompensatsioon materjali eest" + +#: pgn.cpp:1107 +msgid " Black has sufficient compensation for material deficit" +msgstr "Mustal on küllaldane kompensatsioon materjali eest" + +#: pgn.cpp:1110 +msgid " White has more than adequate compensation for material deficit" +msgstr "Valgel on rohkem kui küllaldane kompensatsioon materjalipuuduse eest" + +#: pgn.cpp:1113 +msgid " Black has more than adequate compensation for material deficit" +msgstr "Mustal on rohkem kui küllaldane kompensatsioon materjalipuuduse eest" + +#: pgn.cpp:1116 +msgid " White has a slight center control advantage" +msgstr "Valgel on kerge paremus tsentris" + +#: pgn.cpp:1119 +msgid " Black has a slight center control advantage" +msgstr "Mustal on kerge paremus tsentris" + +#: pgn.cpp:1122 +msgid " White has a moderate center control advantage" +msgstr "Valgel on keskmine paremus tsentris" + +#: pgn.cpp:1125 +msgid " Black has a moderate center control advantage" +msgstr "Mustal on keskmine paremus tsentris" + +#: pgn.cpp:1128 +msgid " White has a decisive center control advantage" +msgstr "Valgel on otsustav paremus tsentris" + +#: pgn.cpp:1131 +msgid " Black has a decisive center control advantage" +msgstr "Mustal on otsustav paremus tsentris" + +#: pgn.cpp:1134 +msgid " White has a slight kingside control advantage" +msgstr "Valgel on kerge paremus kuningatiival" + +#: pgn.cpp:1137 +msgid " Black has a slight kingside control advantage" +msgstr "Mustal on kerge paremus kuningatiival" + +#: pgn.cpp:1140 +msgid " White has a moderate kingside control advantage" +msgstr "Valgel on keskmine paremus kuningatiival" + +#: pgn.cpp:1143 +msgid " Black has a moderate kingside control advantage" +msgstr "Mustal on keskmine paremus kuningatiival" + +#: pgn.cpp:1146 +msgid " White has a decisive kingside control advantage" +msgstr "Valgel on otsustav paremus kuningatiival" + +#: pgn.cpp:1149 +msgid " Black has a decisive kingside control advantage" +msgstr "Mustal on otsustav paremus kuningatiival" + +#: pgn.cpp:1152 +msgid " White has a slight queenside control advantage" +msgstr "Valgel on kerge paremus liputiival" + +#: pgn.cpp:1155 +msgid " Black has a slight queenside control advantage" +msgstr "Mustal on kerge paremus liputiival" + +#: pgn.cpp:1158 +msgid " White has a moderate queenside control advantage" +msgstr "Valgel on keskmine paremus liputiival" + +#: pgn.cpp:1161 +msgid " Black has a moderate queenside control advantage" +msgstr "Mustal on keskmine paremus liputiival" + +#: pgn.cpp:1164 +msgid " White has a decisive queenside control advantage" +msgstr "Valgel on otsustav paremus liputiival" + +#: pgn.cpp:1167 +msgid " Black has a decisive queenside control advantage" +msgstr "Mustal on otsustav paremus liputiival" + +#: pgn.cpp:1170 +msgid " White has a vulnerable first rank" +msgstr "Valgel esimene rida on kaitsetu." + +#: pgn.cpp:1173 +msgid " Black has a vulnerable first rank" +msgstr "Musta esimene rida on kaitsetu." + +#: pgn.cpp:1176 +msgid " White has a well protected first rank" +msgstr "Valgel on hästi kaitstud esimene rida" + +#: pgn.cpp:1179 +msgid " Black has a well protected first rank" +msgstr "Mustal on hästi kaitstud esimene rida" + +#: pgn.cpp:1182 +msgid " White has a poorly protected king" +msgstr "Valge kuningas on halvasti kaitstud" + +#: pgn.cpp:1185 +msgid " Black has a poorly protected king" +msgstr "Musta kuningas on halvasti kaitstud" + +#: pgn.cpp:1188 +msgid " White has a well protected king" +msgstr "Valgel on hästi kaitstud kuningas" + +#: pgn.cpp:1191 +msgid " Black has a well protected king" +msgstr "Mustal on hästi kaitstud kuningas" + +#: pgn.cpp:1194 +msgid " White has a poorly placed king" +msgstr "Valgel on halvasti seisev kuningas" + +#: pgn.cpp:1197 +msgid " Black has a poorly placed king" +msgstr "Mustal on halvasti seisev kuningas" + +#: pgn.cpp:1200 +msgid " White has a well placed king" +msgstr "Valgel on hästi seisev kuningas" + +#: pgn.cpp:1203 +msgid " Black has a well placed king" +msgstr "Mustal on hästi seisev kuningas" + +#: pgn.cpp:1206 +msgid " White has a very weak pawn structure" +msgstr "Valgel on väga nõrk etturistruktuur" + +#: pgn.cpp:1209 +msgid " Black has a very weak pawn structure" +msgstr "Mustal on väga nõrk etturistruktuur" + +#: pgn.cpp:1212 +msgid " White has a moderately weak pawn structure" +msgstr "Valgel on veidi nõrk etturistruktuur" + +#: pgn.cpp:1215 +msgid " Black has a moderately weak pawn structure" +msgstr "Mustal on veidi nõrk etturistruktuur" + +#: pgn.cpp:1218 +msgid " White has a moderately strong pawn structure" +msgstr "Valgel on keskmiselt tugev etturistruktuur" + +#: pgn.cpp:1221 +msgid " Black has a moderately strong pawn structure" +msgstr "Mustal on keskmiselt tugev etturistruktuur" + +#: pgn.cpp:1224 +msgid " White has a very strong pawn structure" +msgstr "Valgel on väga tugev etturistruktuur" + +#: pgn.cpp:1227 +msgid " Black has a very strong pawn structure" +msgstr "Mustal on väga tugev etturistruktuur" + +#: pgn.cpp:1230 +msgid " White has poor knight placement" +msgstr "Valge ratsu seisab halvasti" + +#: pgn.cpp:1233 +msgid " Black has poor knight placement" +msgstr "Musta ratsu seisab halvasti" + +#: pgn.cpp:1236 +msgid " White has good knight placement" +msgstr "Valge ratsu seisab hästi" + +#: pgn.cpp:1239 +msgid " Black has good knight placement" +msgstr "Musta ratsu seisab hästi" + +#: pgn.cpp:1242 +msgid " White has poor bishop placement" +msgstr "Valge oda seisab halvasti" + +#: pgn.cpp:1245 +msgid " Black has poor bishop placement" +msgstr "Musta oda seisab halvasti" + +#: pgn.cpp:1248 +msgid " White has good bishop placement" +msgstr "Valge oda seisab hästi" + +#: pgn.cpp:1251 +msgid " Black has good bishop placement" +msgstr "Musta oda seisab hästi" + +#: pgn.cpp:1254 +msgid " White has poor rook placement" +msgstr "Valge vanker seisab halvasti" + +#: pgn.cpp:1257 +msgid " Black has poor rook placement" +msgstr "Musta vanker seisab halvasti" + +#: pgn.cpp:1260 +msgid " White has good rook placement" +msgstr "Valge vanker seisab hästi" + +#: pgn.cpp:1263 +msgid " Black has good rook placement" +msgstr "Musta vanker seisab hästi" + +#: pgn.cpp:1266 +msgid " White has poor queen placement" +msgstr "Valge lipp seisab halvasti" + +#: pgn.cpp:1269 +msgid " Black has poor queen placement" +msgstr "Musta lipp seisab halvasti" + +#: pgn.cpp:1272 +msgid " White has good queen placement" +msgstr "Valge lipp seisab hästi" + +#: pgn.cpp:1275 +msgid " Black has good queen placement" +msgstr "Musta lipp seisab hästi" + +#: pgn.cpp:1278 +msgid " White has poor piece coordination" +msgstr "Valge vigurite koordinatsioon on halb" + +#: pgn.cpp:1281 +msgid " Black has poor piece coordination" +msgstr "Musta vigurite koordinatsioon on halb" + +#: pgn.cpp:1284 +msgid " White has good piece coordination" +msgstr "Valge vigurite koordinatsioon on hea" + +#: pgn.cpp:1287 +msgid " Black has good piece coordination" +msgstr "Musta vigurite koordinatsioon on hea" + +#: pgn.cpp:1290 +msgid " White has played the opening very poorly" +msgstr "Valge mängis avangut väga halvasti" + +#: pgn.cpp:1293 +msgid " Black has played the opening very poorly" +msgstr "Must mängis avangut väga halvasti" + +#: pgn.cpp:1296 +msgid " White has played the opening poorly" +msgstr "Valge mängis avangut halvasti" + +#: pgn.cpp:1299 +msgid " Black has played the opening poorly" +msgstr "Must mängis avangut halvasti" + +#: pgn.cpp:1302 +msgid " White has played the opening well" +msgstr "Valge mängis avangut hästi" + +#: pgn.cpp:1305 +msgid " Black has played the opening well" +msgstr "Must mängis avangut hästi" + +#: pgn.cpp:1308 +msgid " White has played the opening very well" +msgstr "Valge mängis avangut väga hästi" + +#: pgn.cpp:1311 +msgid " Black has played the opening very well" +msgstr "Must mängis avangut väga hästi" + +#: pgn.cpp:1314 +msgid " White has played the middlegame very poorly" +msgstr "Valge mängis keskmängu väga halvasti" + +#: pgn.cpp:1317 +msgid " Black has played the middlegame very poorly" +msgstr "Must mängis keskmängu väga halvasti" + +#: pgn.cpp:1320 +msgid " White has played the middlegame poorly" +msgstr "Valge mängis keskmängu halvasti" + +#: pgn.cpp:1323 +msgid " Black has played the middlegame poorly" +msgstr "Must mängis keskmängu halvasti" + +#: pgn.cpp:1326 +msgid " White has played the middlegame well" +msgstr "Valge mängis keskmängu hästi" + +#: pgn.cpp:1329 +msgid " Black has played the middlegame well" +msgstr "Must mängis keskmängu hästi" + +#: pgn.cpp:1332 +msgid " White has played the middlegame very well" +msgstr "Valge mängis keskmängu väga hästi" + +#: pgn.cpp:1335 +msgid " Black has played the middlegame very well" +msgstr "Must mängis keskmängu väga hästi" + +#: pgn.cpp:1338 +msgid " White has played the ending very poorly" +msgstr "Valge mängis lõppmängu väga halvasti" + +#: pgn.cpp:1341 +msgid " Black has played the ending very poorly" +msgstr "Must mängis lõppmängu väga halvasti" + +#: pgn.cpp:1344 +msgid " White has played the ending poorly" +msgstr "Valge mängis lõppmängu halvasti" + +#: pgn.cpp:1347 +msgid " Black has played the ending poorly" +msgstr "Must mängis lõppmängu halvasti" + +#: pgn.cpp:1350 +msgid " White has played the ending well" +msgstr "Valge mängis lõppmängu hästi" + +#: pgn.cpp:1353 +msgid " Black has played the ending well" +msgstr "Must mängis lõppmängu hästi" + +#: pgn.cpp:1356 +msgid " White has played the ending very well" +msgstr "Valge mängis lõppmängu väga hästi" + +#: pgn.cpp:1359 +msgid " Black has played the ending very well" +msgstr "Must mängis lõppmängu väga hästi" + +#: pgn.cpp:1362 +msgid " White has slight counterplay" +msgstr "Valgel on kerge vastumäng" + +#: pgn.cpp:1365 +msgid " Black has slight counterplay" +msgstr "Mustal on kerge vastumäng" + +#: pgn.cpp:1368 +msgid " White has moderate counterplay" +msgstr "Valgel on keskmine vastumäng" + +#: pgn.cpp:1371 +msgid " Black has moderate counterplay" +msgstr "Mustal on keskmine vastumäng" + +#: pgn.cpp:1374 +msgid " White has decisive counterplay" +msgstr "Valgel on otsustav vastumäng" + +#: pgn.cpp:1377 +msgid " Black has decisive counterplay" +msgstr "Mustal on otsustav vastumäng" + +#: pgn.cpp:1380 +msgid " White has moderate time control pressure" +msgstr "Valgel on keskmine ajapuudus" + +#: pgn.cpp:1383 +msgid " Black has moderate time control pressure" +msgstr "Mustal on keskmine ajapuudus" + +#: pgn.cpp:1386 +msgid " White has severe time control pressure" +msgstr "Valgel on teatud ajapuudus" + +#: pgn.cpp:1389 +msgid " Black has severe time control pressure" +msgstr "Mustal on teatud ajapuudus" + +#: pgn.cpp:1391 +msgid " With the idea..." +msgstr "Ideega..." + +#: pgn.cpp:1394 +msgid " Aimed against..." +msgstr "Sihitud vastu..." + +#: pgn.cpp:1397 +msgid " Better Move" +msgstr "Parem käik" + +#: pgn.cpp:1400 +msgid " Worse Move" +msgstr "Halvem käik" + +#: pgn.cpp:1403 +msgid " Equivalent move" +msgstr "Ekvivalentne käik" + +#: pgn.cpp:1406 +msgid " Editor's Remark" +msgstr "Toimetaja märkus" + +#: pgn.cpp:1409 +msgid " Novelty" +msgstr "Uuendus" + +#: pgn.cpp:1412 +msgid " Weak point" +msgstr "Nõrk punkt" + +#: pgn.cpp:1415 +msgid " Endgame" +msgstr "Lõppmäng" + +#: pgn.cpp:1418 +msgid " Line" +msgstr " Liin" + +#: pgn.cpp:1421 +msgid " Diagonal" +msgstr "Diagonaal" + +#: pgn.cpp:1424 +msgid " White has a pair of Bishops" +msgstr "Valgel on kaksikodad" + +#: pgn.cpp:1427 +msgid " Black has a pair of Bishops" +msgstr "Mustal on kaksikodad" + +#: pgn.cpp:1430 +msgid " Bishops of opposite color" +msgstr "Lahkvärvi odad" + +#: pgn.cpp:1433 +msgid " Bishops of same color" +msgstr "Samavärvi odad" + +#: pgn.cpp:1436 +msgid " Etc." +msgstr "jne." + +#: pgn.cpp:1439 +msgid " Doubled pawns" +msgstr "Topeltetturid" + +#: pgn.cpp:1442 +msgid " Isolated pawn" +msgstr "Isoleeritud ettur" + +#: pgn.cpp:1445 +msgid " Connected pawns" +msgstr "Ühendatud etturid" + +#: pgn.cpp:1448 +msgid " Hanging pawns" +msgstr "Rippuvad etturid" + +#: pgn.cpp:1451 +msgid " Backwards pawn" +msgstr "Mahajäänud ettur" + +#: setpageaudio.cpp:28 +msgid "enable Audio" +msgstr "luba heli" + +#: setpageaudio.cpp:36 +msgid "Audio Themes" +msgstr "Heli teemad" + +#: setpageaudio.cpp:47 +msgid "Volume" +msgstr "Helitugevus" + +#: setpageaudio.cpp:48 +msgid "Maximum" +msgstr "Maksimaalne" + +#: setpageaudio.cpp:52 +msgid "Minimum" +msgstr "Minimaalne" + +#: setpageaudio.cpp:55 +msgid "For Current Match Only" +msgstr "Ainult käesoleva partii jaoks" + +#: setpagedisplay.cpp:74 +msgid "Board Themes" +msgstr "Laua teemad" + +#: setpagedisplay.cpp:79 +msgid "Chessman Themes" +msgstr "Malendite teemad" + +#: setpagedisplay.cpp:85 +msgid "Theme Size" +msgstr "Teema suurus" + +#: setpagedisplay.cpp:88 +msgid "Small" +msgstr "Väike" + +#: setpagedisplay.cpp:95 +msgid "Large" +msgstr "Suur" + +#: setpagedisplay.cpp:99 +msgid "Other Display Options" +msgstr "Muud välimuse valikud" + +#: setpagedisplay.cpp:102 +msgid "Reverse Board Orientation" +msgstr "Pööra laua asendit" + +#: setpagedisplay.cpp:107 +msgid "Display Startup Logo" +msgstr "Näita logo käivitamisel" + +#: setpagedisplay.cpp:112 +msgid "Automatic Preview" +msgstr "Automaatne eelvaade" + +#: setpagedisplay.cpp:117 +msgid "Show Last Move" +msgstr "Näita viimast käiku" + +#: setpagedisplay.cpp:122 +msgid "Animate Moves" +msgstr "Animeeri käike" + +#: setpagedisplay.cpp:127 +msgid "Show Coordinates" +msgstr "Näita koordinaate" + +#: setpagedisplay.cpp:161 +msgid "Restore Defaults" +msgstr "Taasta vaikimisi seaded" + +#: setpagedisplay.cpp:165 +msgid "Standard Font..." +msgstr "Standard font..." + +#: setpagedisplay.cpp:174 +msgid "Private Font..." +msgstr "Privaat font" + +#: setpagedisplay.cpp:183 +msgid "Channel Font..." +msgstr "Kanali font" + +#: setpagedisplay.cpp:192 +msgid "Shout Font..." +msgstr "Hüüdmise font" + +#: setpagedisplay.cpp:201 +msgid "Whisper Font..." +msgstr "Sosistamise font" + +#: setpagedisplay.cpp:210 +msgid "Notification Font..." +msgstr "Teadaande font" + +#: setpagedisplay.cpp:225 +msgid "Console" +msgstr "Konsool" + +#: setpagedisplay.cpp:519 +msgid "Standard" +msgstr "Standard" + +#: setpagedisplay.cpp:520 +msgid "Private Tell" +msgstr "Privaatne teade" + +#: setpagedisplay.cpp:521 +msgid "Channel Tell" +msgstr "Kanali teade" + +#: setpagedisplay.cpp:522 +msgid "Shout" +msgstr "Hüüa" + +#: setpagedisplay.cpp:524 +msgid "Notification" +msgstr "Teadaanne" + +#: setpageengines.cpp:33 +msgid "Engines to Play White" +msgstr "Mootorid valgetega mängimiseks" + +#: setpageengines.cpp:36 setpageengines.cpp:48 +msgid "enable Book Engine" +msgstr "luba avangumootor" + +#: setpageengines.cpp:45 +msgid "Engines to Play Black" +msgstr "Mootorid mustadega mängimiseks" + +#: setpageengines.cpp:57 +msgid "Chess Engines" +msgstr "Male mootorid" + +#: setpageengines.cpp:62 setpageservers.cpp:69 tab_seeklist.cpp:27 +msgid "Name" +msgstr "Nimi" + +#: setpageengines.cpp:64 +msgid "Wins" +msgstr "Võite" + +#: setpageengines.cpp:65 +msgid "Losses" +msgstr "Kaotusi" + +#: setpageengines.cpp:66 +msgid "Draws" +msgstr "Viike" + +#: setpageengines.cpp:73 setpageservers.cpp:77 +msgid "&Add..." +msgstr "&Lisa..." + +#: setpageengines.cpp:74 setpageservers.cpp:78 +msgid "&Modify..." +msgstr "&Muuda..." + +#: setpageengines.cpp:75 setpageservers.cpp:79 +msgid "&Delete..." +msgstr "&Kustuta" + +#: setpagegeneral.cpp:29 +msgid "Your Name:" +msgstr "Sinu nimi" + +#: setpagegeneral.cpp:36 +msgid "When Knights Begins It Should:" +msgstr "Knights peaks käivitamisel" + +#: setpagegeneral.cpp:38 +msgid "Do Nothing" +msgstr "mitte midagi tegema" + +#: setpagegeneral.cpp:39 +msgid "Start a Match vs. PC" +msgstr "alustama partiid PC vastu" + +#: setpagegeneral.cpp:40 +msgid "Connect to ICS" +msgstr "ühendama serveriga" + +#: setpagegeneral.cpp:48 +msgid "Save Match on Close?" +msgstr "Salvesta partii sulgemisel" + +#: setpagegeneral.cpp:52 +msgid "Ask" +msgstr "Küsi" + +#: setpagegeneral.cpp:62 +msgid "Append to Save File:" +msgstr "Salvesta faili:" + +#: setpagegeneral.cpp:65 +msgid "Append to Save File" +msgstr "Salvesta faili lõppu" + +#: setpagegeneral.cpp:79 +msgid "Pause on Minimize" +msgstr "Peata partii akna minimiseerimisel" + +#: setpagegeneral.cpp:85 +msgid "Always Promote to Queen" +msgstr "Muunda alati lipuks" + +#: setpagegeneral.cpp:91 +msgid "Call Flag Automatically" +msgstr "Kutsu ajaületus automaatselt" + +#: setpageservers.cpp:56 +msgid "Current Server" +msgstr "Käesolev server" + +#: setpageservers.cpp:70 +msgid "URL" +msgstr "URL" + +#: setpageservers.cpp:90 +msgid "Servers" +msgstr "Serverid" + +#: setpageservers.cpp:106 +msgid "Profanity Filter" +msgstr "Profaansuse filter" + +#: setpageservers.cpp:110 +msgid "Filter Everything" +msgstr "Filtreeri kõik" + +#: setpageservers.cpp:110 +msgid "No Filtering" +msgstr "Ilma filtreerimiseta" + +#: setpageservers.cpp:115 +msgid "Automatically Close Previous ICS Match" +msgstr "automaatselt sulge eelmine ICS partii" + +#: setpageservers.cpp:120 +msgid "Private Matches" +msgstr "privaatsed partiid" + +#: setpageservers.cpp:124 +msgid "enable Premove" +msgstr "luba eelkäik" + +#: setpageservers.cpp:128 +msgid "enable Kibitzes" +msgstr "luba kiibitsemine" + +#: setpageservers.cpp:132 +msgid "enable Unregistered Tells" +msgstr "luba registreerimata teated" + +#: setpageservers.cpp:136 +msgid "enable Shouts" +msgstr "luba hüüdmised" + +#: setpageservers.cpp:140 +msgid "enable Seeks" +msgstr "luba partiiotsimised" + +#: setpageservers.cpp:150 +msgid "Seconds Between Seek Updates" +msgstr "sekundit partiiotsingute uuendamise vahel" + +#: tab_seeklist.cpp:29 +msgid "Match Type" +msgstr "Partii tüüp" + +#: tab_seeklist.cpp:30 +msgid "Is Rated?" +msgstr "On hinnatud?" + +#: tabbox.cpp:163 +msgid "%1 - Knights" +msgstr "%1 - Knights" + +#: wiz_setup.cpp:51 +msgid "Knights Setup Wizard" +msgstr "Knights'i paigaldamise viisard" + +#: wiz_setup.cpp:74 +msgid "" +"Thank you for installing Knights, the graphical chess interface for KDE. To " +"help you get started quickly, there are a few things Knights will need to " +"setup. You should click 'Next' to see what they are." +msgstr "" +"Aitäh KDE maleliidese Knights'i paigaldamise eest. On mõningad seaded mida " +"Knights saab ise paika sättida, et aidata sul kiiremini alustada. Vali " +"'Järgmine' et näha mis need on." + +#: wiz_setup.cpp:77 +msgid "Welcome to Knights v%1!" +msgstr "Tere tulemast kasutama Knights v%1!" + +#: wiz_setup.cpp:97 +#, fuzzy +msgid "" +"When Knights saves a match to disk, it uses Portable Game Notation (PGN) to " +"store the match. Several other computer chess games use PGN too. If you " +"like, Knights can be the default PGN viewer on this system." +msgstr "" +"Kui Knights salvestab partii kettale, kasutab ta Portable Game Notation " +"(PGN) formaati. Paljud teised maleprogrammid kasutavad samuti PGN formaati. " +"Kui sa tahad, siis Knights võib olla vaikimisi PGN vaataja sinu süsteemis." + +#: wiz_setup.cpp:100 +msgid "Let Knights handle PGN files?" +msgstr "Seosta Knights PGN failidega?" + +#: wiz_setup.cpp:106 +msgid "Let Knights handle your .pgn files?" +msgstr "Las Knights seostub sinu pgn failidega?" + +#: wiz_setup.cpp:125 +#, fuzzy +msgid "" +"Knights can not play a chess match against you without help. Known as Chess " +"Engines, these helpers can be found on the Internet and are often included " +"with your distribution. Knights can look for Chess Engines that you may " +"already have. If found, Knights will configure itself to use them." +msgstr "" +"Knights ei suuda mängida malepartiid inimese vastu enne pisikese abita. " +"Tuntud malemootorite nime all, võib neid abiprogramme leida internetist ja " +"tihti on nad ka kaasas distributsioonidega. Knights võib otsida " +"malemootoreid mis on juba süsteemis olemas. Kui leiab, seadistab Knights " +"ennast ise neid kasutama." + +#: wiz_setup.cpp:128 wiz_setup.cpp:134 +msgid "Let Knights search for chess engines?" +msgstr "Las Knights otsib mänguprogramme" + +#: wiz_setup.cpp:153 +msgid "" +"In order for you to play chess online, Knights will have to connect to a " +"chess server. Knights has a list of several of these servers. If you like, " +"this list can be used to automatically configure Knights." +msgstr "" +"Knights peab ühenduma maleserveriga, et sa saaksid mängida malet onlainis. " +"Knights'l on nimekiri mitmesugustest sellistest serveritest. Seda nimekirja " +"võib kasutada Knights'i automaatseks seadistamiseks." + +#: wiz_setup.cpp:156 wiz_setup.cpp:162 +msgid "Let Knights configure chess servers?" +msgstr "Las Knights seadistab maleserverid" + +#: wiz_setup.cpp:181 +msgid "" +"Knights has now configured itself according to your choices. We strongly " +"recommend that you read the documentation to make full use of all that " +"Knights has to offer. You can access it by pressing F1." +msgstr "" +"Knights on ennast seadistanud sinu valikute järgi. Me soovitama soojalt " +"lugeda dokumentatsiooni et osata teha kõike mida Knights suudab pakkuda. Sa " +"näed dokumentatsiooni kui vajutad F1. " + +#: wiz_setup.cpp:184 +msgid "Setup Complete" +msgstr "Paigaldamine lõpetatud" + +#: wiz_setup.cpp:213 +msgid "Do you accept the terms of our license?" +msgstr "Kas sa nõustud meie litsentsi tingimustega?" + +#: wiz_setup.cpp:218 +msgid "Please read and accept our license:" +msgstr "Palun loe litsentsi:" + +#: wiz_setup.cpp:269 +msgid "Free Internet Chess Server" +msgstr "Free Internet Chess Server" + +#: wiz_setup.cpp:269 +msgid "Internet Chess Club" +msgstr "Internet Chess Club" + +#: wiz_setup.cpp:269 +msgid "Global Chess Server" +msgstr "Global Chess Server" + +#: wiz_setup.cpp:269 +msgid "Chess.Net" +msgstr "Chess.Net" + +#: wiz_setup.cpp:270 +msgid "Chess-Square.Com" +msgstr "Chess-Square.Com" + +#: wiz_setup.cpp:270 +msgid "Australian FICS" +msgstr "Austraalia FICS" + +#: wiz_setup.cpp:270 +msgid "Brazilian FICS" +msgstr "Brasiilia FICS" + +#: wiz_setup.cpp:270 +msgid "Chilean FICS" +msgstr "Tšiili FICS" + +#: wiz_setup.cpp:271 +msgid "Croatian FICS" +msgstr "Horvaatia FICS" + +#: wiz_setup.cpp:271 +msgid "Dutch FICS" +msgstr "Hollandi FICS" + +#: wiz_setup.cpp:271 +msgid "French FICS" +msgstr "Prantsuse FICS" + +#: wiz_setup.cpp:271 +msgid "German FICS" +msgstr "Saksa FICS" + +#: wiz_setup.cpp:271 +msgid "Swedish FICS" +msgstr "Rootsi FICS" + +#: proto_xboard.cpp:443 +msgid "" +"%1 suggests this move:\n" +"%2" +msgstr "" +"%1 soovitab sellist käiku:\n" +"%2" + +#: proto_xboard.cpp:465 proto_xboard.cpp:472 proto_xboard.cpp:479 +msgid "" +"%1 tells you:\n" +"%2" +msgstr "" +"%1 teatab sulle:\n" +"%2" + +#~ msgid "Save Game?" +#~ msgstr "Salvesta partii?" + +#~ msgid "Save Game..." +#~ msgstr "Salvesta partii..." + +#~ msgid " Game paused" +#~ msgstr "Partii peatatud" + +#, fuzzy +#~ msgid "Chat" +#~ msgstr "Crafty" + +#, fuzzy +#~ msgid "&Find" +#~ msgstr "&Nõuanne" + +#~ msgid "Red Hat Binary RPMs" +#~ msgstr "Red Hat-i binaarsed RPM-d" + +#~ msgid "Early Beta Testing" +#~ msgstr "Varajane beetatestimine" + +#~ msgid "Would you like to email this move?" +#~ msgstr "Kas sa tahaksid e-postitada selle käigu?" + +#~ msgid "Send Email?" +#~ msgstr "Saada e-post?" + +#~ msgid "Console Orientation" +#~ msgstr "Konsooli paiknemine" + +#~ msgid "engineio" +#~ msgstr "engineio" + +#, fuzzy +#~ msgid "Knightsio" +#~ msgstr "Knights" + +#~ msgid "pgn" +#~ msgstr "pgn" + +#~ msgid "Server Login Failed" +#~ msgstr "Serverisse logimine ebaõnnestus" + +#~ msgid "White's Time Controls" +#~ msgstr "Valge ajakontrollid" + +#~ msgid "Black's Time Controls" +#~ msgstr "Musta ajakontrollid" + +#~ msgid "" +#~ "Knights can not find %1.\n" +#~ "Please make sure the address was entered correctly and that you are " +#~ "connected to the internet." +#~ msgstr "" +#~ "Knights ei leia %1.\n" +#~ "Palun kontrolli, et aadress oli sisestatud korrektselt ja et ühendus " +#~ "internetiga toimib." + +#~ msgid "&Solitaire Chess" +#~ msgstr "&Mängi iseendaga" + +#~ msgid "&Computer vs. Computer" +#~ msgstr "&Arvuti vs. arvuti" + +#~ msgid "&Save Game" +#~ msgstr "&Salvesta partii" + +#~ msgid "Console - Knights" +#~ msgstr "Konsool Knights" + +#~ msgid "High Quality" +#~ msgstr "Kõrge kvaliteet" + +#~ msgid "GNUChess" +#~ msgstr "GNUChess" + +#~ msgid "Sjeng" +#~ msgstr "Sjeng" + +#~ msgid "KnightCap" +#~ msgstr "KnightCap" + +#~ msgid "BabyChess" +#~ msgstr "BabyChess" + +#~ msgid "Phalanx-XXII" +#~ msgstr "Phalanx-XXII" + +#~ msgid "Bowron Abernethy Chess Engine" +#~ msgstr "Bowron Abernethy malemootor" + +#~ msgid "enable Timeseal" +#~ msgstr "luba Timeseal" diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..ca782de --- /dev/null +++ b/po/fi.po @@ -0,0 +1,2116 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-01-21 04:30-0600\n" +"PO-Revision-Date: 2003-04-23 09:28+0300\n" +"Last-Translator: bastian salmela \n" +"Language-Team: Finnish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 0.9.6\n" + +#: accel.cpp:23 +msgid "Previous Move" +msgstr "Edellinen siirto" + +#: accel.cpp:24 +msgid "Next Move" +msgstr "Seuraava siirto" + +#: accel.cpp:25 +msgid "Enter Text" +msgstr "Kirjoita Teksti" + +#: accel.cpp:26 +msgid "Page Up" +msgstr "Sivu Ylös" + +#: accel.cpp:27 +msgid "Page Down" +msgstr "Sivu alas" + +#: accel.cpp:28 +msgid "Increase Board Size" +msgstr "Suurenna laudan kokoa" + +#: accel.cpp:29 +msgid "Decrease Board Size" +msgstr "Pienennä laudan kokoa" + +#: accel.cpp:30 +msgid "Last History Item" +msgstr "Viimeinen historiassa" + +#: accel.cpp:31 +msgid "Next History Item" +msgstr "Seuraava historiassa" + +#: accel.cpp:32 +msgid "Reply to the Last Tell" +msgstr "Vastaa viimeiseen viestiin" + +#: accel.cpp:33 +msgid "Reply to the Channel" +msgstr "Vastaa kanavalle" + +#: accel.cpp:34 +msgid "Kibitz" +msgstr "" + +#: accel.cpp:35 +#: setpagedisplay.cpp:523 +msgid "Whisper" +msgstr "Kuiskaa" + +#: challenge_graph.cpp:75 +#: tab_seeklist.cpp:40 +msgid "Seek Matches" +msgstr "Etsi Osumia" + +#: challenge_graph.cpp:77 +#: tab_seeklist.cpp:42 +msgid "Accept This Match" +msgstr "Hyväksy Tämä Osuma" + +#: challenge_graph.cpp:78 +#: tab_seeklist.cpp:43 +msgid "Tell..." +msgstr "Kerro..." + +#: challenge_graph.cpp:79 +#: tab_seeklist.cpp:44 +msgid "Assess..." +msgstr "Arvioi..." + +#: challenge_graph.cpp:80 +#: tab_seeklist.cpp:45 +msgid "Player Info" +msgstr "Pelaajatiedot" + +#: challenge_graph.cpp:82 +#: tab_seeklist.cpp:47 +msgid "Player History" +msgstr "Pelaajahistoria" + +#: challenge_graph.cpp:84 +#: tab_seeklist.cpp:49 +msgid "Add to Friends" +msgstr "Lisää Ystäviin" + +#: challenge_graph.cpp:85 +#: tab_seeklist.cpp:50 +msgid "Ignore This Player" +msgstr "Ohita Tämä Pelaaja" + +#: challenge_graph.cpp:304 +#: tab_seeklist.cpp:28 +msgid "Rating" +msgstr "Tasosi" + +#: challenge_graph.cpp:311 +msgid "Time" +msgstr "Aika" + +#: challenge_graph_view.cpp:105 +msgid " Name: %1 Rating: %2 Match Type: %3 %4 Base Time: %5 Increment: %6" +msgstr "Nimi: %1 Taso: %2 Pelityyppi: %3 %4 Peliaika: %5 Lisäys: %6" + +#: core.cpp:385 +msgid "Hint" +msgstr "Vihje" + +#: core.cpp:388 +msgid "Tell User" +msgstr "Viesti Käyttäjälle" + +#: core.cpp:391 +msgid "Tell User Error" +msgstr "Viesti Käyttäjälle Virhe" + +#: core.cpp:397 +msgid "Tell Opponent" +msgstr "Viesti Vastustajalle" + +#: core.cpp:411 +msgid "Tell All" +msgstr "Viesti Kaikille" + +#: core.cpp:646 +#, fuzzy +msgid "Load PGN..." +msgstr "Lataa peli..." + +#: core.cpp:690 +msgid "Would you like to save this match?" +msgstr "Haluatko tallentaa tämän pelin?" + +#: core.cpp:691 +msgid "Save Match?" +msgstr "Tallenna peli" + +#: core.cpp:710 +msgid "Save Match..." +msgstr "Tallenna peli nimellä..." + +#: dlg_challenge.cpp:25 +msgid "You've Been Challenged:" +msgstr "Sinut On Haastettu: " + +#: dlg_challenge.cpp:29 +msgid "Accept" +msgstr "Hyväksy" + +#: dlg_challenge.cpp:30 +msgid "Decline" +msgstr "Kieltäydy" + +#: dlg_challenge.cpp:49 +msgid "Time Odds Match" +msgstr " Aikatasoitus peli" + +#: dlg_challenge.cpp:53 +msgid "Unrated" +msgstr " Luokittelematon" + +#: dlg_challenge.cpp:54 +msgid "Rated" +msgstr " Luokiteltu" + +#: dlg_challenge.cpp:60 +#: dlg_challenge.cpp:69 +#: dlg_newmatch.cpp:87 +#: dlg_newmatch.cpp:104 +#: tab_seeklist.cpp:101 +msgid " min." +msgstr " min." + +#: dlg_challenge.cpp:61 +#: dlg_challenge.cpp:70 +#: dlg_newmatch.cpp:97 +#: dlg_newmatch.cpp:114 +#: setpageservers.cpp:146 +#: tab_seeklist.cpp:102 +msgid " sec." +msgstr " sek." + +#: dlg_challenge.cpp:62 +#: dlg_challenge.cpp:71 +#: tab_seeklist.cpp:31 +msgid "Base Time" +msgstr "Pohja Aika" + +#: dlg_challenge.cpp:63 +#: dlg_challenge.cpp:72 +#: tab_seeklist.cpp:32 +msgid "Increment" +msgstr "Lisäys" + +#: dlg_challenge.cpp:109 +msgid "" +"%1 %2 vs. %3 %4\n" +"in a %5 match." +msgstr "" +"%1 %2 vs. %3 %4\n" +" %5 pelissä." + +#: dlg_challenge.cpp:124 +#: dlg_challenge.cpp:125 +#, fuzzy +msgid "Time Controls" +msgstr "Ajan säädöt" + +#: dlg_challenge.cpp:154 +msgid "Counter Offer" +msgstr "Vastatarjous" + +#: dlg_engine.cpp:26 +msgid "Configure Engine" +msgstr "Määrittele pelikone" + +#: dlg_engine.cpp:38 +msgid "Engine Name" +msgstr "Pelikoneen nimi" + +#: dlg_engine.cpp:43 +#: setpageengines.cpp:63 +msgid "Protocol" +msgstr "Protokolla" + +#: dlg_engine.cpp:48 +msgid "Engine Filename" +msgstr "Pelikoneen tiedostonnimi" + +#: dlg_engine.cpp:54 +msgid "Command Line Arguments" +msgstr "Komentorivi käskyt" + +#: dlg_engine.cpp:59 +#: dlg_server.cpp:88 +msgid "Log File" +msgstr "Lokitiedosto" + +#: dlg_login.cpp:21 +msgid "Login Prompt" +msgstr "Login" + +#: dlg_login.cpp:31 +msgid "Login:" +msgstr "Login:" + +#: dlg_login.cpp:32 +msgid "Password:" +msgstr "Passwort:" + +#: dlg_login.cpp:38 +msgid "Log in as guest" +msgstr "Kirjaudu sisään vieraana" + +#: dlg_login.cpp:54 +msgid "Login" +msgstr "Login" + +#: dlg_login.cpp:54 +msgid "Log in to the chess server using this name and password." +msgstr "Kirjaudu sisään shakki palvelimelle käyttäen tätä nimeä ja salasanaa." + +#: dlg_newmatch.cpp:38 +msgid "Start a New Match" +msgstr "Aloita Uusi Peli" + +#: dlg_newmatch.cpp:45 +msgid "White" +msgstr "Valkoiset" + +#: dlg_newmatch.cpp:46 +msgid "Black" +msgstr "Mustat" + +#: dlg_newmatch.cpp:59 +#: dlg_newmatch.cpp:66 +msgid "Human" +msgstr "Ihminen" + +#: dlg_newmatch.cpp:60 +#: dlg_newmatch.cpp:67 +msgid "Computer" +msgstr "Tietokone" + +#: dlg_newmatch.cpp:61 +#: dlg_newmatch.cpp:68 +msgid "Email" +msgstr "Sähköposti" + +#: dlg_newmatch.cpp:85 +#: dlg_newmatch.cpp:102 +msgid "Base Time:" +msgstr "Peliaika:" + +#: dlg_newmatch.cpp:90 +#: dlg_newmatch.cpp:107 +msgid "Moves Per Base Time" +msgstr "Siirtoja peliaikana" + +# German NAG values taken from: +# http://scid.sourceforge.net/dhelp/NAGs.html +#: dlg_newmatch.cpp:92 +#: dlg_newmatch.cpp:109 +msgid " moves" +msgstr " siirtoa" + +#: dlg_newmatch.cpp:95 +#: dlg_newmatch.cpp:112 +msgid "Increment Per Move" +msgstr "Lisäys per vuoro" + +#: dlg_promote.cpp:94 +msgid "Promote your pawn to..." +msgstr "Korota\t sotilaasi ..." + +#: dlg_promote.cpp:101 +msgid "Pawn Promotion" +msgstr "Sotilaan korotus" + +#: dlg_selectemail.cpp:27 +msgid "Select Email Address" +msgstr "Valitse Sähköposti Osoite" + +#: dlg_selectengine.cpp:30 +msgid "Select Computer Player" +msgstr "Valitse Tietokone Vastustaja" + +#: dlg_selectengine.cpp:41 +msgid "Computer Players" +msgstr "Tietokone Vastustajat" + +#: dlg_selectengine.cpp:61 +msgid "Player Strength" +msgstr "Pelaajan Vahvuus" + +#: dlg_selectengine.cpp:63 +msgid "Weak" +msgstr "Heikko" + +#: dlg_selectengine.cpp:70 +msgid "Strong" +msgstr "Vahva" + +#: dlg_server.cpp:25 +msgid "Configure Server" +msgstr "Aseta palvelin" + +#: dlg_server.cpp:37 +msgid "Server Name" +msgstr "Palvelimen nimi" + +#: dlg_server.cpp:44 +msgid "Server URL" +msgstr "Palvelimen URL" + +#: dlg_server.cpp:49 +msgid "Server Port" +msgstr "Palvelimen portti" + +#: dlg_server.cpp:56 +msgid "Username" +msgstr "Käyttäjänimi" + +#: dlg_server.cpp:59 +msgid "Remember My Password" +msgstr "Muista salasanani" + +#: dlg_server.cpp:64 +msgid "Password" +msgstr "Salasana" + +#: dlg_server.cpp:71 +msgid "Confirm Password" +msgstr "Varmista salasana" + +#: dlg_server.cpp:79 +msgid "Timeseal" +msgstr "Timeseal" + +#: dlg_settings.cpp:48 +#: setpagedisplay.cpp:142 +msgid "General" +msgstr "Yleiset" + +#: dlg_settings.cpp:49 +msgid "Various aspects of Knights get configured here." +msgstr "Yleiset Knightsin asetukset." + +#: dlg_settings.cpp:55 +msgid "Display" +msgstr "Näyttö" + +#: dlg_settings.cpp:56 +msgid "These settings determine how Knights displays itself to you." +msgstr "Nämä asetukset määrittelevät miltä Knights näyttää." + +#: dlg_settings.cpp:62 +msgid "Audio" +msgstr "Ääni" + +#: dlg_settings.cpp:63 +msgid "These settings determine what Knights sounds like." +msgstr "Nämä asetukset määrittelevät miltä Knights kuulostaa." + +#: dlg_settings.cpp:69 +msgid "Computer Opponents" +msgstr "Tietokone vastustajat" + +#: dlg_settings.cpp:70 +msgid "Configure your chess engines here." +msgstr "Määrittele shakki pelikoneet täällä." + +#: dlg_settings.cpp:76 +#: setpageservers.cpp:65 +msgid "Chess Servers" +msgstr "Shakki palvelimet" + +#: dlg_settings.cpp:77 +msgid "Configure your internet chess servers here." +msgstr "Määrittele internet shakki palvelimet täällä." + +#: io_internet.cpp:80 +msgid "" +"There are no servers configured.\n" +"Please make sure you have at least one server configured." +msgstr "" +"Palvelimia ei ole määritelty.\n" +"Varmista ett sinulla on vähintään yksi palvelin asennettu." + +#: io_internet.cpp:80 +msgid "Cannot find a server." +msgstr "Palvelinta ei löydy." + +#: io_internet.cpp:99 +msgid "" +"Knights can not start Timeseal.\n" +"Please make sure you have the correct path and filename configured." +msgstr "" +"Knights ei voinut käynnistää Timeseal:ia.\n" +"Varmista että asetukset tiedoston nimelle ja polulle ovat oikein." + +#: io_internet.cpp:99 +msgid "Cannot find Timeseal." +msgstr "Timesealia ei löytynyt." + +#: io_internet.cpp:109 +#: io_internet.cpp:121 +msgid "" +"Knights is unable to connect to the server.\n" +" Please make sure your internet connection is working and try again." +msgstr "" +"Knights ei onnistunut yhdistämään palvelimelle.\n" +" Varmista että internet yhteytesi toimii, ja yritä uudelleen." + +#: io_internet.cpp:109 +#: io_internet.cpp:121 +msgid "Cannot connect to server." +msgstr "Yhdistäminen palvelimelle epäonnistui." + +#: io_internet.cpp:144 +msgid "%1 Console" +msgstr "%1 Konsoli" + +#: io_internet.cpp:149 +msgid "Sought Matches List" +msgstr "Pelattujen pelien lista" + +#: io_internet.cpp:154 +msgid "Sought Matches Graph" +msgstr "Pelattujen pelien tilastot" + +#: knights.cpp:70 +#: main.cpp:34 +msgid "Knights" +msgstr "Knights" + +#: knights.cpp:250 +msgid "&Draw" +msgstr "&Tasapeli" + +#: knights.cpp:254 +msgid "&Retract Move" +msgstr "&Peru siirto" + +#: knights.cpp:256 +msgid "Select this to retract your last move." +msgstr "Tällä voit perua edellisen siirtosi." + +#: knights.cpp:258 +msgid "Resign" +msgstr "Luovuta" + +#: knights.cpp:260 +msgid "Use this to concede the match to your opponent." +msgstr "Käytä tätä myöntääksesi tappiosi pelissä." + +#: knights.cpp:262 +msgid "&Call Flag" +msgstr "&Ilmoita lippu" + +#: knights.cpp:264 +msgid "Use this to declare the match over, due to your opponent being out of time." +msgstr "Käytä tätä julistaaksesi peli päättyneeksi, kun vastustajaltasi on loppunut aika" + +#: knights.cpp:266 +msgid "&Hint" +msgstr "&Vihje" + +#: knights.cpp:268 +msgid "This will ask your opponent for a hint." +msgstr "Tällä voit kysyä vastustajaltasi vihjettä." + +#: knights.cpp:270 +msgid "Move &Now" +msgstr "Siirrä &Nyt" + +#: knights.cpp:272 +msgid "Clicking this option will force your opponent to move immediately." +msgstr "Tästä klikkaamalla pakotat vastustajasi siirtämään heti." + +#: knights.cpp:274 +msgid "&Flip View" +msgstr "&Käännä Näkymä" + +#: knights.cpp:276 +msgid "This will reverse the chessboard's orientation by 180 degrees." +msgstr "Tämä kääntää shakkilaudan näkymää 180 astetta." + +#: knights.cpp:278 +msgid "&Ponder" +msgstr "&Mieti" + +#: knights.cpp:281 +msgid "This toggles your opponent's ability to think while it's your turn." +msgstr "Tällä voit valita saako vastustaja miettiä siirtosi aikana." + +#: knights.cpp:285 +#: knights.cpp:949 +msgid "Pause" +msgstr "Tauko" + +#: knights.cpp:287 +msgid "Select this to pause the clock for this match." +msgstr "Valitse tämän pysäyttääksesi pelin kellon hetkeksi." + +#: knights.cpp:292 +msgid "&Offer Draw" +msgstr "&Ehdota tasapeliä" + +#: knights.cpp:293 +msgid "Clicking this will inform your opponent that you are willing draw the match." +msgstr "Ilmoita vastustajallesi että olet valmis tasapeliin." + +#: knights.cpp:295 +msgid "&Accept Draw" +msgstr "&Hyväksy tasapeli" + +#: knights.cpp:296 +msgid "Clicking this will accept a draw offered by your opponent." +msgstr "Hyväksy vastustajasi ehdotuksen tasapeliin." + +#: knights.cpp:298 +msgid "&Reject Draw" +msgstr "&Kieltäydy tasapelistä" + +#: knights.cpp:299 +msgid "Clicking this will reject a draw offered by your opponent." +msgstr "Kieltäydy vastustajasi ehdottomasta tasapelistä." + +#: knights.cpp:301 +msgid "&Ignore Draw" +msgstr "&Hylkää tasapelit" + +#: knights.cpp:302 +msgid "Clicking this will ignore future draw offers from your opponent." +msgstr "Hylkää kaikki vastustajasi tulevat ehdotukset tasapelistä automaattisesti." + +#: knights.cpp:308 +msgid "&New Match..." +msgstr "&Uusi peli..." + +#: knights.cpp:309 +msgid "This allows you to begin a new match." +msgstr "Tästä voit aloittaa uuden pelin." + +#: knights.cpp:312 +msgid "&Load Match..." +msgstr "&Lataa peli..." + +#: knights.cpp:313 +msgid "The Load command will allow you to select a previously saved match and play it again." +msgstr "Voit valita aikaisemmin tallentamasi pelin ja pelata sitä uudestaan. " + +#: knights.cpp:316 +#: thinbuttons.cpp:40 +msgid "&Close Match" +msgstr "&Sulje peli" + +#: knights.cpp:318 +msgid "This command removes the current match." +msgstr "Sulkee auki olevan nykyisen pelin." + +#: knights.cpp:320 +msgid "Close All" +msgstr "Sulje kaikki" + +#: knights.cpp:322 +msgid "This command will remove all matches that are currently loaded." +msgstr "Poistaa kaikki tällä hetkellä avoinna olevat pelit." + +#: knights.cpp:326 +#: thinbuttons.cpp:32 +msgid "&Save Match" +msgstr "&Tallenna peli" + +#: knights.cpp:328 +#: knights.cpp:333 +msgid "The Save command will allow you to store a copy of your current match for later use." +msgstr "Tallentaa nykyisen pelisi myöhempää käyttöä varten." + +#: knights.cpp:331 +#: thinbuttons.cpp:34 +msgid "Save Match &As..." +msgstr "Tallenna peli &nimellä..." + +#: knights.cpp:337 +#: knights.cpp:859 +msgid "Connect to Server" +msgstr "Yhdistä palvelimeen" + +#: knights.cpp:338 +msgid "Clicking this will connect Knights with an internet chess server." +msgstr "Yhdistää Knightsin internet shakki palvelimeen." + +#: knights.cpp:342 +#: thinbuttons.cpp:37 +msgid "&Print Notation..." +msgstr "&Tulosta ..." + +# !! tsekkaa "notation" +#: knights.cpp:344 +msgid "The Print command will allow you to print this game's notation on your printer." +msgstr "Tulostaa pelin nuotit ja tilanteen." + +#: knights.cpp:349 +msgid "The Quit command will stop all matches and exit Knights." +msgstr "Keskeyttää käynnissä olevat pelit ja poistuu Knightsista." + +#: knights.cpp:355 +msgid "Play &White" +msgstr "Pelaa &Valkoisilla" + +#: knights.cpp:358 +msgid "If checked, this option tells Knights that you will play as the White army when you play vs. the computer." +msgstr "Jos valitset tämän, pelaat Valkoisilla pelatessasi tietokonetta vastaan. " + +#: knights.cpp:360 +msgid "Play &Black" +msgstr "Pelaa &Mustilla" + +#: knights.cpp:363 +msgid "If checked, this option tells Knights that you will play as the Black army when you play vs. the computer." +msgstr "Jos valitset tämän, pelaat Mustilla pelatessasi tietokonetta vastaan." + +#: knights.cpp:366 +msgid "&Install Themes" +msgstr "&Asenna Teemoja" + +#: knights.cpp:367 +msgid "This lets you install downloaded themes into Knights." +msgstr "Tällä voit asentaa imuroimiasi teemoja Knightsiin." + +#: knights.cpp:371 +msgid "Click this if you want to change the keyboard shortcuts that Knights uses." +msgstr "Klikkaa tästä jos haluat vaihtaa Knightsin pikanäppäimiä." + +#: knights.cpp:374 +msgid "&Configure Knights..." +msgstr "Aseta &Knights..." + +#: knights.cpp:375 +msgid "This opens a new window which allows you to customize Knights to your particular tastes." +msgstr "Tästä voit avata uuden ikkunan jossa voit muokata Knightsin ulkoasua mielesi mukaiseksi." + +#: knights.cpp:381 +msgid "Begin a Tutorial" +msgstr "Aloita opetuspeli" + +#: knights.cpp:387 +msgid "&Match" +msgstr "&Peli" + +#: knights.cpp:576 +msgid "Error with white engine" +msgstr " Virhe valkoisen koneessa" + +#: knights.cpp:578 +#, fuzzy +msgid "" +"You selected %1 to play white,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play white." +msgstr "" +"Olet valinnut %1 pelataksesi valkoista,\n" +"mutta sitä voidaan käyttää vain book enginenä.\n" +"Ole hyvä ja valitse toinen engine. " + +#: knights.cpp:579 +msgid "White Engine Problem" +msgstr "Valkoisen koneessa ongelmia" + +#: knights.cpp:582 +#, fuzzy +msgid "Error with white book engine" +msgstr " Virhe valkoisen book enginessä" + +#: knights.cpp:584 +msgid "" +"You selected %1 to play white's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play white's book." +msgstr "" +"Olet valinnut %1 pelataksesi valkoisen book engineä,\n" +"mutta sitä voidaan käyttää vain normaalina koneena.\n" +"Ole hyäv ja valitse toinen pelikone." + +#: knights.cpp:585 +msgid "White Book Engine Problem" +msgstr "Ongelmia valkoisen book enginessä" + +#: knights.cpp:588 +#, fuzzy +msgid "Error with black engine" +msgstr " Ongelmia mustan book enginessä" + +#: knights.cpp:590 +#, fuzzy +msgid "" +"You selected %1 to play black,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play black." +msgstr "" +"Olet valinnut %1 pelataksesi mustaa,\n" +"mutta sitä voidaan käyttää vain book enginenä.\n" +"Ole hyvä ja valitse toinen pelikone." + +#: knights.cpp:591 +msgid "Black Engine Problem" +msgstr "Ongelmia mustan pelikoneen kanssa" + +#: knights.cpp:594 +#, fuzzy +msgid "Error with black book engine" +msgstr " Ongelmia mustan book enginen kanssa" + +#: knights.cpp:596 +#, fuzzy +msgid "" +"You selected %1 to play black's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play black's book." +msgstr "" +"Olet valinnut %1 pelataksesi mustan kirjaa,\n" +"mutta sitä voidaan käyttää vain normaaleihin peleihin.\n" +"Ole hyvä ja valitse toinen pelikone." + +#: knights.cpp:597 +msgid "Black Book Engine Problem" +msgstr "Ongelmia mustan book enginen kanssa" + +#: knights.cpp:600 +msgid "The computer opponent assigned to play %1 has crashed" +msgstr " Tietokone vastustaja joka oli määrätty pelaamaan %1, on kaatunut." + +#: knights.cpp:603 +msgid "There was an error while loading the file" +msgstr " Virhe ladattaessa tiedostoa" + +#: knights.cpp:606 +msgid "There was an error while saving the file" +msgstr " Virhe tallentaessa tiedostoa" + +#: knights.cpp:610 +msgid "Loading complete" +msgstr " Lataus valmis" + +#: knights.cpp:613 +msgid "Saving complete" +msgstr " Tallennus valmis" + +#: knights.cpp:616 +msgid "Reading File" +msgstr " Luetaan tiedostoa" + +#: knights.cpp:619 +msgid "Can not move a chessman while reviewing the match" +msgstr " Et voi siirtää nappulaa tarkastellessasi peliä" + +#: knights.cpp:622 +msgid "Illegal Move" +msgstr " Laiton siirto" + +#: knights.cpp:625 +msgid "White's turn" +msgstr " Valkoisen vuoro" + +#: knights.cpp:628 +msgid "Black's turn" +msgstr " Mustan vuoro" + +#: knights.cpp:631 +msgid "White wins" +msgstr " Valkoinen voitti" + +#: knights.cpp:634 +msgid "Black wins" +msgstr " Musta voitti" + +#: knights.cpp:637 +msgid "Checkmate, White wins" +msgstr " Shakki-matti, Valkoinen voitti" + +#: knights.cpp:640 +msgid "Checkmate, Black wins" +msgstr " Shakki-matti, Musta voitti" + +#: knights.cpp:643 +msgid "White resigns" +msgstr " Valkoinen luovutti" + +#: knights.cpp:646 +msgid "Black resigns" +msgstr " Musta luovutti" + +#: knights.cpp:649 +msgid "White's flag fell" +msgstr " Valkoisen merkkilippu putosi" + +#: knights.cpp:652 +msgid "Black's flag fell" +msgstr " Mustan merkkilippu putosi" + +#: knights.cpp:655 +msgid "Black's flag was called, White wins" +msgstr " Mustan merkkilippu huomattiin pudonneeksi, Valkoinen voitti" + +#: knights.cpp:658 +msgid "White's flag was called, Black wins" +msgstr " Valkoisen merkkilippu huomattiin pudonneeksi, Musta voitti" + +#: knights.cpp:661 +msgid "Draw match" +msgstr " Lopeta tasapeliin" + +#: knights.cpp:664 +msgid "50 moves rule, draw match" +msgstr " 50 siirron säännöt, tasapeli" + +#: knights.cpp:667 +msgid "Starting computer players, please wait" +msgstr " Käynnistellään tietokone vastustajia, odota hetki" + +#: knights.cpp:670 +msgid "Match paused" +msgstr "Pelitauko" + +#: knights.cpp:673 +msgid "White has offered a draw" +msgstr " Valkoinen ehdottaa tasapeliä" + +# !! +# onko kanssa tasapeli? +#: knights.cpp:676 +msgid "Black has offered a draw" +msgstr " Musta ehdottaa tasapeliä" + +#: knights.cpp:679 +msgid "Lost contact with opponent" +msgstr " Yhteys vastustajaan katkesi" + +#: knights.cpp:682 +msgid "Ready" +msgstr " Valmis" + +#: knights.cpp:866 +msgid "Disconnect from Server" +msgstr "Katkaise yhteys palvelimeen" + +#: knights.cpp:955 +msgid "Resume" +msgstr "Jatka" + +#: knights.cpp:1014 +msgid "Knights Themes" +msgstr "Knights Teemat" + +#: knights.cpp:1015 +msgid "Install Theme..." +msgstr "Asenna Teema..." + +#: knights.cpp:1045 +msgid "You do not have permission to install this theme systemwide, so Knights installed it locally." +msgstr "Sinulla ei ole riittäviä oikeuksia asentaa teemaa järjestelmänlaajuisesti, joten Knights asensi sen paikallisesti." + +#: knights.cpp:1046 +msgid "Installed theme locally" +msgstr "Teema asennettiin paikallisesti" + +#: knights.cpp:1051 +#, c-format +msgid "" +"The theme could not be installed:\n" +"%1" +msgstr "" +"Teemaa ei voitu asentaa:\n" +"%1" + +#: knights.cpp:1052 +msgid "Can not install theme" +msgstr "Teemaa ei voida asentaa" + +#: knightstextview.cpp:35 +msgid "Select &All" +msgstr "Valitse &Kaikki" + +#: knightstextview.cpp:44 +msgid "Zoom &In" +msgstr "&Suurenna" + +#: knightstextview.cpp:46 +msgid "Zoom &Out" +msgstr "&Pienennä" + +#: list_pgn.cpp:29 +#: list_pgn.cpp:48 +msgid "Result" +msgstr "Tulos" + +#: list_pgn.cpp:30 +#: list_pgn.cpp:49 +msgid "Title" +msgstr "Otsikko" + +#: list_pgn.cpp:31 +#: list_pgn.cpp:50 +msgid "Round" +msgstr "Kierros" + +#: list_pgn.cpp:32 +#: list_pgn.cpp:51 +msgid "Site" +msgstr "Sivu" + +#: list_pgn.cpp:33 +#: list_pgn.cpp:52 +msgid "Date" +msgstr "Päivä" + +#: list_pgn.cpp:81 +#, c-format +msgid "Can not open %1" +msgstr "Tiedostoa %1 ei voitu avata" + +#: list_pgn.cpp:140 +msgid "%1 matches found." +msgstr "%1 löydettiin." + +#: main.cpp:26 +msgid "Specify the location of your Knights data directory." +msgstr "Määrittele Knightsin data hakemiston sijainti." + +#: main.cpp:27 +msgid "A .pgn file to be loaded." +msgstr "Ladatattava .pgn tiedosto." + +#: main.cpp:36 +msgid "" +"The Knights Chess Interface\n" +"\n" +"Knights is a chess interface\n" +"for the K Desktop Environment." +msgstr "" +"Knights Shakki Käyttöliittymä\n" +"\n" +"Knights on shakki käyttöliittymä\n" +"KDE työpöytäympäristölle. " + +#: main.cpp:44 +msgid "Project Manager and Programmer" +msgstr "Projektin Manageri ja Ohjelmoija" + +#: main.cpp:48 +msgid "Communications Programmer" +msgstr "Kommunikaatio ohjelmointi" + +#: main.cpp:52 +msgid "Qtopia port and patches" +msgstr "Qtopia käännös ja patchit" + +#: main.cpp:56 +msgid "Patches and suggestions" +msgstr "Patchit ja ehdotukset" + +#: main.cpp:60 +msgid "KDE3 Compatability Patch" +msgstr "KDE3 yhteensopivat patchit" + +#: main.cpp:64 +msgid "XBoard protocol" +msgstr "XBoard-Protokolla" + +#: _translatorinfo.cpp:1 +#: main.cpp:67 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Bastian Salmela" + +#: _translatorinfo.cpp:3 +#: main.cpp:68 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "bastiansalmela@users.sourceforge.net" + +#: match_param.cpp:107 +msgid "Unknown" +msgstr "Tuntematon" + +#: pgn.cpp:145 +msgid "%1 vs. %2" +msgstr "%1 vs. %2" + +#: pgn.cpp:943 +#, c-format +msgid "Page %1" +msgstr "Sivu %1" + +# German NAG values taken from: +# http://scid.sourceforge.net/dhelp/NAGs.html +#: pgn.cpp:975 +msgid " Good move" +msgstr "Hyvä siirto" + +#: pgn.cpp:978 +msgid " Poor move" +msgstr "Surkea siirto" + +#: pgn.cpp:981 +msgid " Very good move" +msgstr "Todella upea siirto" + +#: pgn.cpp:984 +msgid " Very poor move" +msgstr "Hirveän karmea siirto" + +#: pgn.cpp:987 +msgid " Speculative move" +msgstr " " + +#: pgn.cpp:990 +msgid " Questionable move" +msgstr "Kyseenalainen siirto" + +#: pgn.cpp:993 +msgid " Forced move" +msgstr "Pakotettu siirto" + +#: pgn.cpp:996 +msgid " Singular move" +msgstr " Poikkeuksellinen siirto" + +#: pgn.cpp:999 +msgid " Worst move" +msgstr "Huonoin siirto" + +#: pgn.cpp:1002 +msgid " Drawish position" +msgstr " Tasapelin kaltainen asetelma" + +#: pgn.cpp:1005 +msgid " Equal chances, quiet position" +msgstr " Yhtäläiset mahdollisuudet, hiljainen asema" + +#: pgn.cpp:1008 +msgid " Equal chances, active position" +msgstr " Yhtäläiset mahdollisuudet, aktiivinen asema " + +#: pgn.cpp:1011 +msgid " Unclear position" +msgstr "Epäselvä asema" + +#: pgn.cpp:1014 +msgid " White has a slight advantage" +msgstr "Valkoisella on lievä etu" + +#: pgn.cpp:1017 +msgid " Black has a slight advantage" +msgstr "Mustalla on lievä etu" + +#: pgn.cpp:1020 +msgid " White has a moderate advantage" +msgstr "Valkoisella on keskinkertainen etu" + +#: pgn.cpp:1023 +msgid " Black has a moderate advantage" +msgstr "Mustalla on keskinkertainen etu" + +#: pgn.cpp:1026 +msgid " White has a decisive advantage" +msgstr " Valkoisella on ratkaiseva etu" + +#: pgn.cpp:1029 +msgid " Black has a decisive advantage" +msgstr " Mustalla on ratkaiseva etu" + +#: pgn.cpp:1032 +msgid " White has a crushing advantage ( Black should resign )" +msgstr " Valkoisella on murskaava etu ( Mustan olisi syytä luovuttaa )" + +#: pgn.cpp:1035 +msgid " Black has a crushing advantage ( White should resign )" +msgstr " Mustalle on murskaava etu ( Valkoisen olisi syytä luovuttaa )" + +#: pgn.cpp:1038 +msgid " White is in zugzwang" +msgstr " Valkoisella on siirtopakko" + +#: pgn.cpp:1041 +msgid " Black is in zugzwang" +msgstr " Mustalla on siirtopakko" + +#: pgn.cpp:1044 +msgid " White has a slight space advantage" +msgstr " Valkoisella on lievä tila etu" + +#: pgn.cpp:1047 +msgid " Black has a slight space advantage" +msgstr " Mustalla on lievä tila etu" + +#: pgn.cpp:1050 +msgid " White has a moderate space advantage" +msgstr " Valkoisella on keskinkertainen tila etu" + +#: pgn.cpp:1053 +msgid " Black has a moderate space advantage" +msgstr " Mustalla on keskinkertainen tila etu" + +#: pgn.cpp:1056 +msgid " White has a decisive space advantage" +msgstr " Valkoisella on ratkaiseva tila etu" + +#: pgn.cpp:1059 +msgid " Black has a decisive space advantage" +msgstr " Mustalla on ratkaiseva tila etu" + +#: pgn.cpp:1062 +msgid " White has a slight time ( development ) advantage" +msgstr " Valkoisella on lievä aika ( kehitys ) etu" + +#: pgn.cpp:1065 +msgid " Black has a slight time ( development ) advantage" +msgstr " Mustalla on lievä aika ( kehitys ) etu" + +#: pgn.cpp:1068 +msgid " White has a moderate time ( development ) advantage" +msgstr " Valkoisella on keskinkertainen aika ( kehitys ) etu" + +#: pgn.cpp:1071 +msgid " Black has a moderate time ( development ) advantage" +msgstr " Mustalla on keskinkertainen aika ( kehitys ) etu" + +#: pgn.cpp:1074 +msgid " White has a decisive time ( development ) advantage" +msgstr " Valkoisella on ratkaiseva aika ( kehitys ) etu" + +#: pgn.cpp:1077 +msgid " Black has a decisive time ( development ) advantage" +msgstr " Mustalla on ratkaiseva aika ( kehitys ) etu" + +#: pgn.cpp:1080 +msgid " White has the initiative" +msgstr " Valkoisella on aloitus" + +#: pgn.cpp:1083 +msgid " Black has the initiative" +msgstr " Mustalla on aloitus" + +#: pgn.cpp:1086 +msgid " White has a lasting initiative" +msgstr " Valkoisella on kestävä aloitus" + +#: pgn.cpp:1089 +msgid " Black has a lasting initiative" +msgstr " Mustalla on kestävä aloitus" + +#: pgn.cpp:1092 +msgid " White has the attack" +msgstr " Valkoinen hyökkää" + +#: pgn.cpp:1095 +msgid " Black has the attack" +msgstr " Musta hyökkää" + +#: pgn.cpp:1098 +msgid " White has insufficient compensation for material deficit" +msgstr " Valkoisella on riittämätön hyvitys materiaaliseen menetykseen" + +#: pgn.cpp:1101 +msgid " Black has insufficient compensation for material deficit" +msgstr " Mustalla on riittämätön hyvitys materiaaliseen menetykseen" + +#: pgn.cpp:1104 +msgid " White has sufficient compensation for material deficit" +msgstr " Valkoisella on riittävä hyvitys materiaaliseen menetykseen" + +#: pgn.cpp:1107 +msgid " Black has sufficient compensation for material deficit" +msgstr " Mustalla on riittävä hyvitys materiaaliseen menetykseen" + +#: pgn.cpp:1110 +msgid " White has more than adequate compensation for material deficit" +msgstr " Valkoisella on enemmän kuin riittävä hyvitys materiaaliseen menetykseen" + +#: pgn.cpp:1113 +msgid " Black has more than adequate compensation for material deficit" +msgstr " Mustalla on enemmän kuin riittävä hyvitys materiaaliseen menetykseen" + +#: pgn.cpp:1116 +msgid " White has a slight center control advantage" +msgstr " Valkoisella on lievä keskustan etu" + +#: pgn.cpp:1119 +msgid " Black has a slight center control advantage" +msgstr " Mustalla on lievä keskustan etu" + +#: pgn.cpp:1122 +msgid " White has a moderate center control advantage" +msgstr " Valkoisella on keskinkertainen keskustan etu" + +#: pgn.cpp:1125 +msgid " Black has a moderate center control advantage" +msgstr " Mustalla on keskinkertainen keskustan etu" + +#: pgn.cpp:1128 +msgid " White has a decisive center control advantage" +msgstr " Valkoisella on ratkaiseva keskustan etu" + +#: pgn.cpp:1131 +msgid " Black has a decisive center control advantage" +msgstr " Mustalla on ratkaiseva keskustan etu" + +#: pgn.cpp:1134 +msgid " White has a slight kingside control advantage" +msgstr " Valkoisella on lievä kuningassivustan etu" + +#: pgn.cpp:1137 +msgid " Black has a slight kingside control advantage" +msgstr " Mustalla on lievä kuningassivustan etu" + +#: pgn.cpp:1140 +msgid " White has a moderate kingside control advantage" +msgstr " Valkoisella on keskinkertainen kuningassivustan etu" + +#: pgn.cpp:1143 +msgid " Black has a moderate kingside control advantage" +msgstr " Mustalla on keskinkertainen kuningassivustan etu" + +#: pgn.cpp:1146 +msgid " White has a decisive kingside control advantage" +msgstr " Valkoisella on ratkaiseva kuningassivustan etu" + +#: pgn.cpp:1149 +msgid " Black has a decisive kingside control advantage" +msgstr " Mustalla on ratkaiseva kuningassivustan etu" + +#: pgn.cpp:1152 +msgid " White has a slight queenside control advantage" +msgstr " Valkoisella on lievä kuningatarsivustan etu" + +#: pgn.cpp:1155 +msgid " Black has a slight queenside control advantage" +msgstr " Mustalla on lievä kuningatarsivustan etu" + +#: pgn.cpp:1158 +msgid " White has a moderate queenside control advantage" +msgstr " Valkoisella on keskinkertainen kuningatarsivustan etu" + +#: pgn.cpp:1161 +msgid " Black has a moderate queenside control advantage" +msgstr " Mustalla on keskinkertainen kuningatarsivustan etu" + +#: pgn.cpp:1164 +msgid " White has a decisive queenside control advantage" +msgstr " Valkoisella on ratkaiseva kuningatarsivustan etu" + +#: pgn.cpp:1167 +msgid " Black has a decisive queenside control advantage" +msgstr " Mustalla on ratkaiseva kuningatarsivustan etu" + +#: pgn.cpp:1170 +msgid " White has a vulnerable first rank" +msgstr " Valkoisella on haavoittuvainen ensimmäinen rivi " + +#: pgn.cpp:1173 +msgid " Black has a vulnerable first rank" +msgstr " Mustalla on haavoittuvainen ensimmäinen rivi" + +#: pgn.cpp:1176 +msgid " White has a well protected first rank" +msgstr " Valkoisella on hyvin suojattu ensimmäinen rivi" + +#: pgn.cpp:1179 +msgid " Black has a well protected first rank" +msgstr " Mustalla on hyvin suojattu ensimmäinen rivi" + +#: pgn.cpp:1182 +msgid " White has a poorly protected king" +msgstr "Valkoisella on surkeasti suojattu kuningas" + +#: pgn.cpp:1185 +msgid " Black has a poorly protected king" +msgstr " Mustalla on surkeasti suojattu kuningas" + +#: pgn.cpp:1188 +msgid " White has a well protected king" +msgstr " Valkoisella on hyvin suojattu kuningas" + +#: pgn.cpp:1191 +msgid " Black has a well protected king" +msgstr " Mustalla on hyvin suojattu kuningas" + +#: pgn.cpp:1194 +msgid " White has a poorly placed king" +msgstr " Valkoisella on surkeasti sijoitettu kuningas" + +#: pgn.cpp:1197 +msgid " Black has a poorly placed king" +msgstr " Mustalla on surkeasti sijoitettu kuningas" + +#: pgn.cpp:1200 +msgid " White has a well placed king" +msgstr " Valkoisella on hyvin sijoitettu kuningas" + +#: pgn.cpp:1203 +msgid " Black has a well placed king" +msgstr " Mustalla on hyvin sijoitettu kuningas" + +#: pgn.cpp:1206 +msgid " White has a very weak pawn structure" +msgstr " Valkoisella on hyvin heikko sotilaiden asetelma" + +#: pgn.cpp:1209 +msgid " Black has a very weak pawn structure" +msgstr " Mustalla on hyvin heikko sotilaiden asetelma" + +#: pgn.cpp:1212 +msgid " White has a moderately weak pawn structure" +msgstr " Valkoisella on heikko sotilaiden asetelma" + +#: pgn.cpp:1215 +msgid " Black has a moderately weak pawn structure" +msgstr " Mustalla on heikko sotilaiden asetelma" + +#: pgn.cpp:1218 +msgid " White has a moderately strong pawn structure" +msgstr " Valkoisella on hyvä sotilaiden asetelma" + +#: pgn.cpp:1221 +msgid " Black has a moderately strong pawn structure" +msgstr " Mustalla on hyvä sotilaiden asetelma" + +#: pgn.cpp:1224 +msgid " White has a very strong pawn structure" +msgstr " Valkoisella on erittäin hyvä sotilaiden asetelma" + +#: pgn.cpp:1227 +msgid " Black has a very strong pawn structure" +msgstr " Mustalla on erittäin hyvä sotilaiden asetelma" + +#: pgn.cpp:1230 +msgid " White has poor knight placement" +msgstr " Valkoisella on surkea ratsun sijoitus" + +#: pgn.cpp:1233 +msgid " Black has poor knight placement" +msgstr " Mustalla on surkea ratsun sijoitus" + +#: pgn.cpp:1236 +msgid " White has good knight placement" +msgstr " Valkoisella on hyvä ratsun sijoitus" + +#: pgn.cpp:1239 +msgid " Black has good knight placement" +msgstr " Mustalla on hyvä ratsun sijoitus" + +#: pgn.cpp:1242 +msgid " White has poor bishop placement" +msgstr " Valkoisella on surkea lähetin sijoitus" + +#: pgn.cpp:1245 +msgid " Black has poor bishop placement" +msgstr " Mustalla on surkea lähetin sijoitus" + +#: pgn.cpp:1248 +msgid " White has good bishop placement" +msgstr " Valkoisella on hyvä lähetin sijoitus" + +#: pgn.cpp:1251 +msgid " Black has good bishop placement" +msgstr " Mustalla on hyvä lähetin sijoitus" + +#: pgn.cpp:1254 +msgid " White has poor rook placement" +msgstr " Valkoisella on surkea tornin sijoitus" + +#: pgn.cpp:1257 +msgid " Black has poor rook placement" +msgstr " Mustalla on surkea tornin sijoitus" + +#: pgn.cpp:1260 +msgid " White has good rook placement" +msgstr " Valkoisella on hyvä tornin sijoitus" + +#: pgn.cpp:1263 +msgid " Black has good rook placement" +msgstr " Mustalla on hyvä tornin sijoitus" + +#: pgn.cpp:1266 +msgid " White has poor queen placement" +msgstr " Valkoisella on surkea kuningattaren sijoitus" + +#: pgn.cpp:1269 +msgid " Black has poor queen placement" +msgstr " Mustalla on surkea kuningattaren sijoitus" + +#: pgn.cpp:1272 +msgid " White has good queen placement" +msgstr " Valkoisella on hyvä kuningattaren sijoitus" + +#: pgn.cpp:1275 +msgid " Black has good queen placement" +msgstr " Mustalla on hyvä kuningattaren sijoitus" + +#: pgn.cpp:1278 +msgid " White has poor piece coordination" +msgstr " Valkoisella on surkea shakkinappuloiden koordinaatio" + +#: pgn.cpp:1281 +msgid " Black has poor piece coordination" +msgstr " Mustalla on surkea shakkinappuloiden koordinaatio" + +#: pgn.cpp:1284 +msgid " White has good piece coordination" +msgstr " Valkoisella on hyvä shakkinappuloiden koordinaatio " + +#: pgn.cpp:1287 +msgid " Black has good piece coordination" +msgstr " Mustalla on hyvä shakkinappuloiden koordinaatio" + +#: pgn.cpp:1290 +msgid " White has played the opening very poorly" +msgstr " Valkoinen on pelannut avauksen todella huonosti" + +#: pgn.cpp:1293 +msgid " Black has played the opening very poorly" +msgstr " Musta on pelannut avauksen todella huonosti" + +#: pgn.cpp:1296 +msgid " White has played the opening poorly" +msgstr " Valkoinen on pelannut avauksen huonosti" + +#: pgn.cpp:1299 +msgid " Black has played the opening poorly" +msgstr " Musta on pelannut avauksen huonosti" + +#: pgn.cpp:1302 +msgid " White has played the opening well" +msgstr " Valkoinen on pelannut avauksen hyvin" + +#: pgn.cpp:1305 +msgid " Black has played the opening well" +msgstr " Mutsa on pelannut avauksen hyvin" + +#: pgn.cpp:1308 +msgid " White has played the opening very well" +msgstr " Valkoinen on pelannut avauksen erittäin hyvin" + +#: pgn.cpp:1311 +msgid " Black has played the opening very well" +msgstr " Musta on pelannut avauksen erittäin hyvin" + +#: pgn.cpp:1314 +msgid " White has played the middlegame very poorly" +msgstr " Valkoinen on pelannut keskipeli erittäin huonosti" + +#: pgn.cpp:1317 +msgid " Black has played the middlegame very poorly" +msgstr " Musta on pelannut keskipelin erittäin huonosti" + +#: pgn.cpp:1320 +msgid " White has played the middlegame poorly" +msgstr " Valkoinen on pelannut keskipelin huonosti" + +#: pgn.cpp:1323 +msgid " Black has played the middlegame poorly" +msgstr " Musta on pelannut keskipelin huonosti" + +#: pgn.cpp:1326 +msgid " White has played the middlegame well" +msgstr " Valkoinen on pelannut keskipelin hyvin" + +#: pgn.cpp:1329 +msgid " Black has played the middlegame well" +msgstr " Musta on pelannut keskipelin hyvin" + +#: pgn.cpp:1332 +msgid " White has played the middlegame very well" +msgstr " Valkoinen on pelannut keskipelin erittäin hyvin" + +#: pgn.cpp:1335 +msgid " Black has played the middlegame very well" +msgstr " Musta on pelannut keskipelin erittäin hyvin" + +#: pgn.cpp:1338 +msgid " White has played the ending very poorly" +msgstr " Valkoinen on pelannut lopun todella huonosti" + +#: pgn.cpp:1341 +msgid " Black has played the ending very poorly" +msgstr " Musta on pelannut lopun erittäin huonosti" + +#: pgn.cpp:1344 +msgid " White has played the ending poorly" +msgstr " Valkoinen on pelannut lopun huonosti" + +#: pgn.cpp:1347 +msgid " Black has played the ending poorly" +msgstr " Musta on pelannut lopun huonosti" + +#: pgn.cpp:1350 +msgid " White has played the ending well" +msgstr " Valkoinen on pelannut lopun hyvin" + +#: pgn.cpp:1353 +msgid " Black has played the ending well" +msgstr " Musta on pelannut lopun hyvin" + +#: pgn.cpp:1356 +msgid " White has played the ending very well" +msgstr " Valkoinen on pelannut lopun erittäin hyvin" + +#: pgn.cpp:1359 +msgid " Black has played the ending very well" +msgstr " Musta on pelannut lopun erittäin hyvin" + +#: pgn.cpp:1362 +msgid " White has slight counterplay" +msgstr " Valkoisella on lievä vastapeli" + +#: pgn.cpp:1365 +msgid " Black has slight counterplay" +msgstr " Mustalla on lievä vastapeli" + +#: pgn.cpp:1368 +msgid " White has moderate counterplay" +msgstr " Valkoisella on keskinkertainen vastapeli" + +#: pgn.cpp:1371 +msgid " Black has moderate counterplay" +msgstr " Mustalla on keskinkertainen vastapeli" + +#: pgn.cpp:1374 +msgid " White has decisive counterplay" +msgstr " Valkoisella on ratkaiseva vastapeli" + +#: pgn.cpp:1377 +msgid " Black has decisive counterplay" +msgstr " Mustalla on ratkaiseva vastapeli" + +#: pgn.cpp:1380 +msgid " White has moderate time control pressure" +msgstr " Valkoisella on keskinkertainen ajanhallinnan paine" + +#: pgn.cpp:1383 +msgid " Black has moderate time control pressure" +msgstr " Mustalla on keskinkertainen ajanhallinnan paine" + +#: pgn.cpp:1386 +msgid " White has severe time control pressure" +msgstr " Valkoisella on paha ajanhallinnan paine" + +#: pgn.cpp:1389 +msgid " Black has severe time control pressure" +msgstr " Mustalla on paha ajanhallinnan paine" + +#: pgn.cpp:1391 +msgid " With the idea..." +msgstr " Ajatuksena..." + +#: pgn.cpp:1394 +msgid " Aimed against..." +msgstr " Suunnattu kohti..." + +#: pgn.cpp:1397 +msgid " Better Move" +msgstr "Parempi siirto" + +#: pgn.cpp:1400 +msgid " Worse Move" +msgstr " Huonompi siirto" + +#: pgn.cpp:1403 +msgid " Equivalent move" +msgstr " Vastaava siirto" + +#: pgn.cpp:1406 +msgid " Editor's Remark" +msgstr " Toim.Huom." + +#: pgn.cpp:1409 +msgid " Novelty" +msgstr " Uutuus" + +#: pgn.cpp:1412 +msgid " Weak point" +msgstr "Heikkous" + +#: pgn.cpp:1415 +msgid " Endgame" +msgstr " Loppupeli" + +#: pgn.cpp:1418 +msgid " Line" +msgstr " Linja" + +#: pgn.cpp:1421 +msgid " Diagonal" +msgstr " Diagonaali" + +#: pgn.cpp:1424 +msgid " White has a pair of Bishops" +msgstr " Valkoisella on lähetti pari" + +#: pgn.cpp:1427 +msgid " Black has a pair of Bishops" +msgstr " Mustalla on lähetti pari" + +#: pgn.cpp:1430 +msgid " Bishops of opposite color" +msgstr " Vastakkaisen väriset lähetit" + +#: pgn.cpp:1433 +msgid " Bishops of same color" +msgstr " Saman väriset lähetit" + +#: pgn.cpp:1436 +msgid " Etc." +msgstr " Jne." + +#: pgn.cpp:1439 +msgid " Doubled pawns" +msgstr " Kaksoissotilaat " + +#: pgn.cpp:1442 +msgid " Isolated pawn" +msgstr " Eristetty sotilas" + +#: pgn.cpp:1445 +msgid " Connected pawns" +msgstr " Sotilasketju" + +#: pgn.cpp:1448 +msgid " Hanging pawns" +msgstr " Vapaasotilas" + +#: pgn.cpp:1451 +msgid " Backwards pawn" +msgstr " Takasotilas" + +#: setpageaudio.cpp:28 +msgid "enable Audio" +msgstr "käytä Ääniä" + +#: setpageaudio.cpp:36 +msgid "Audio Themes" +msgstr "Ääniteemat" + +#: setpageaudio.cpp:47 +msgid "Volume" +msgstr "Äänenvoimakkuus" + +#: setpageaudio.cpp:48 +msgid "Maximum" +msgstr "Maksimi" + +#: setpageaudio.cpp:52 +msgid "Minimum" +msgstr "Minimi" + +#: setpageaudio.cpp:55 +msgid "For Current Match Only" +msgstr "Vain tämän hetkiselle pelille" + +#: setpagedisplay.cpp:74 +msgid "Board Themes" +msgstr "Lautateemat" + +#: setpagedisplay.cpp:79 +msgid "Chessman Themes" +msgstr "Nappulateemat" + +#: setpagedisplay.cpp:85 +msgid "Theme Size" +msgstr "Teeman koko" + +#: setpagedisplay.cpp:88 +msgid "Small" +msgstr "Pieni" + +#: setpagedisplay.cpp:95 +msgid "Large" +msgstr "Suuri" + +#: setpagedisplay.cpp:99 +msgid "Other Display Options" +msgstr "Muut Näytön Asetukset" + +#: setpagedisplay.cpp:102 +msgid "Reverse Board Orientation" +msgstr "Vastakkainen laudan sijainti" + +#: setpagedisplay.cpp:107 +msgid "Display Startup Logo" +msgstr "Näytä käynnistys logo" + +#: setpagedisplay.cpp:112 +msgid "Automatic Preview" +msgstr "Automaattinen esikatselu" + +#: setpagedisplay.cpp:117 +msgid "Show Last Move" +msgstr "Näytä edellinen siirto" + +#: setpagedisplay.cpp:122 +msgid "Animate Moves" +msgstr "Animoi siirrot" + +#: setpagedisplay.cpp:127 +msgid "Show Coordinates" +msgstr "Näytä koordinaatit" + +#: setpagedisplay.cpp:161 +msgid "Restore Defaults" +msgstr "Palauta oletukset" + +#: setpagedisplay.cpp:165 +msgid "Standard Font..." +msgstr "Vakio..." + +#: setpagedisplay.cpp:174 +msgid "Private Font..." +msgstr "Yksityinen..." + +#: setpagedisplay.cpp:183 +msgid "Channel Font..." +msgstr "Kanava..." + +#: setpagedisplay.cpp:192 +msgid "Shout Font..." +msgstr "Huuto..." + +#: setpagedisplay.cpp:201 +msgid "Whisper Font..." +msgstr "Kuiskaus..." + +#: setpagedisplay.cpp:210 +msgid "Notification Font..." +msgstr "Ilmoitus..." + +#: setpagedisplay.cpp:225 +msgid "Console" +msgstr "Konsoli" + +#: setpagedisplay.cpp:519 +msgid "Standard" +msgstr "Vakio" + +#: setpagedisplay.cpp:520 +msgid "Private Tell" +msgstr "Yksityinen Viesti" + +#: setpagedisplay.cpp:521 +msgid "Channel Tell" +msgstr "Kanava Viesti" + +#: setpagedisplay.cpp:522 +msgid "Shout" +msgstr "Huuda" + +#: setpagedisplay.cpp:524 +msgid "Notification" +msgstr "Ilmoitus" + +#: setpageengines.cpp:33 +msgid "Engines to Play White" +msgstr "Pelikoneet valkoiselle" + +#: setpageengines.cpp:36 +#: setpageengines.cpp:48 +msgid "enable Book Engine" +msgstr "Book Engine" + +#: setpageengines.cpp:45 +msgid "Engines to Play Black" +msgstr "Pelikoneet mustalle" + +#: setpageengines.cpp:57 +msgid "Chess Engines" +msgstr "Shakkikoneet" + +#: setpageengines.cpp:62 +#: setpageservers.cpp:69 +#: tab_seeklist.cpp:27 +msgid "Name" +msgstr "Nimi" + +#: setpageengines.cpp:64 +msgid "Wins" +msgstr "Voittaa" + +#: setpageengines.cpp:65 +msgid "Losses" +msgstr "Häviää" + +#: setpageengines.cpp:66 +msgid "Draws" +msgstr "Tasapeli" + +#: setpageengines.cpp:73 +#: setpageservers.cpp:77 +msgid "&Add..." +msgstr "&Lisää..." + +#: setpageengines.cpp:74 +#: setpageservers.cpp:78 +msgid "&Modify..." +msgstr "&Muokkaa..." + +#: setpageengines.cpp:75 +#: setpageservers.cpp:79 +msgid "&Delete..." +msgstr "&Tuhoa..." + +#: setpagegeneral.cpp:29 +msgid "Your Name:" +msgstr "Nimesi:" + +#: setpagegeneral.cpp:36 +msgid "When Knights Begins It Should:" +msgstr "Knightsin käynnistyttyä sen pitäisi:" + +#: setpagegeneral.cpp:38 +msgid "Do Nothing" +msgstr "Älä tee mitään" + +#: setpagegeneral.cpp:39 +msgid "Start a Match vs. PC" +msgstr "Aloita peli tietokonetta vastaan" + +#: setpagegeneral.cpp:40 +msgid "Connect to ICS" +msgstr "Yhdistä ICS:n" + +#: setpagegeneral.cpp:48 +msgid "Save Match on Close?" +msgstr "Talleta peli lopettaessa?" + +#: setpagegeneral.cpp:52 +msgid "Ask" +msgstr "Kysy" + +#: setpagegeneral.cpp:62 +msgid "Append to Save File:" +msgstr "Jatka tallennetuun tiedostoon:" + +#: setpagegeneral.cpp:65 +msgid "Append to Save File" +msgstr "Määritä tiedosto" + +#: setpagegeneral.cpp:79 +msgid "Pause on Minimize" +msgstr "Pysäytä pienennettäessä" + +#: setpagegeneral.cpp:85 +msgid "Always Promote to Queen" +msgstr "Korota aina kuningattareksi" + +#: setpagegeneral.cpp:91 +msgid "Call Flag Automatically" +msgstr " Huomaa pudonnut merkkilippu automaattisesti" + +#: setpageservers.cpp:56 +msgid "Current Server" +msgstr "Nykyinen palvelin" + +#: setpageservers.cpp:70 +msgid "URL" +msgstr "URL" + +#: setpageservers.cpp:90 +msgid "Servers" +msgstr "Palvelimet" + +#: setpageservers.cpp:106 +msgid "Profanity Filter" +msgstr "Kieli suodatin" + +#: setpageservers.cpp:110 +msgid "Filter Everything" +msgstr "Suodata Kaikki" + +#: setpageservers.cpp:110 +msgid "No Filtering" +msgstr "Ei Suodatusta" + +#: setpageservers.cpp:115 +msgid "Automatically Close Previous ICS Match" +msgstr "sulje automaattisesti edellinen ICS-peli" + +#: setpageservers.cpp:120 +msgid "Private Matches" +msgstr "yksityiset pelit" + +#: setpageservers.cpp:124 +msgid "enable Premove" +msgstr "käytä ennakkosiirtoa" + +#: setpageservers.cpp:128 +msgid "enable Kibitzes" +msgstr "käytä kibitzes" + +#: setpageservers.cpp:132 +msgid "enable Unregistered Tells" +msgstr "käytä rekisteröimättömiä viestejä" + +#: setpageservers.cpp:136 +msgid "enable Shouts" +msgstr "käytä huutoja" + +#: setpageservers.cpp:140 +msgid "enable Seeks" +msgstr "käytä hakuja" + +#: setpageservers.cpp:150 +msgid "Seconds Between Seek Updates" +msgstr " sekunteja hakujen välissä" + +#: tab_seeklist.cpp:29 +msgid "Match Type" +msgstr "Pelityyppi" + +#: tab_seeklist.cpp:30 +msgid "Is Rated?" +msgstr "Is Rated?" + +#: tabbox.cpp:163 +msgid "%1 - Knights" +msgstr "%1 - Knights" + +#: wiz_setup.cpp:51 +msgid "Knights Setup Wizard" +msgstr "Knights Ohjattu Asennus" + +#: wiz_setup.cpp:74 +msgid "Thank you for installing Knights, the graphical chess interface for KDE. To help you get started quickly, there are a few things Knights will need to setup. You should click 'Next' to see what they are." +msgstr "Kiitoksia että asensit Knightsin, graafisen shakki käyttöliittymän KDE:lle. Päästäksesi mahdollisimman nopeasti aloittamaan, Knights voi suorittaa muutamia asetuksia puolestasi. Painamalla 'Seuraava' näet mitä ne ovat. Jos haluat tehdä kaikki asetukset itse, paina 'Peruuta'." + +#: wiz_setup.cpp:77 +msgid "Welcome to Knights v%1!" +msgstr "Tervetuloa Knights v%1:n!" + +#: wiz_setup.cpp:97 +msgid "When Knights saves a match to disk, it uses Portable Game Notation (PGN) to store the match. Several other computer chess games use PGN too. If you like, Knights can be the default PGN viewer on this system." +msgstr "Knights tallentaa pelin käyttämällä Portable Game Notation (PGN) systeemiä. Monet muutkin tietokoneshakit käyttävät tätä. Jos haluat, Knights voi toimia oletusohjelmana PGN tiedostojen avaamisessa." + +#: wiz_setup.cpp:100 +msgid "Let Knights handle PGN files?" +msgstr "Haluatko että Knights hoitaa PGN tiedostojen avauksen?" + +#: wiz_setup.cpp:106 +msgid "Let Knights handle your .pgn files?" +msgstr "Haluatko että Knights hoitaa PGN tiedostojen avauksen?" + +#: wiz_setup.cpp:125 +msgid "Knights can not play a chess match against you without help. Known as Chess Engines, these helpers can be found on the Internet and are often included with your distribution. Knights can look for Chess Engines that you may already have. If found, Knights will configure itself to use them." +msgstr "Knights ei pysty pelaamaan shakkia kanssasi ilman pientä apua. Näitä apuohjelmia kutsutaan shakki koneiksi, ja ovat imuroitavissa internetistä, ja useasti pakattu myös mukaan Linux jakelupakettiin. Knights voi etsiä shakki konetta kovalevyltäsi, ja löytäessään asettaa itsensä käyttämään niitä. " + +#: wiz_setup.cpp:128 +#: wiz_setup.cpp:134 +msgid "Let Knights search for chess engines?" +msgstr "Haluatko että Knights etsii Chess Engineitä?" + +#: wiz_setup.cpp:153 +msgid "In order for you to play chess online, Knights will have to connect to a chess server. Knights has a list of several of these servers. If you like, this list can be used to automatically configure Knights." +msgstr "Pelataksesi shakkia verkossa, Knightsin on otettava yhteys shakki-palvelimelle. Knightsissa on mukana iso lista näistä palvelimista. Jos haluat, shakkipalvelimien asetukset voidaan ottaa automaattisesti tältä listalta." + +#: wiz_setup.cpp:156 +#: wiz_setup.cpp:162 +msgid "Let Knights configure chess servers?" +msgstr "Haluatko että Knights asettaa shakki palvelimet?" + +#: wiz_setup.cpp:181 +msgid "Knights has now configured itself according to your choices. We strongly recommend that you read the documentation to make full use of all that Knights has to offer. You can access it by pressing F1." +msgstr "Knights on nyt määritellyt asetukset valintojesi mukaan. Suosittelemme, että käyt vielä läpi mukana tulevat ohjeet, jotta saat täyden hyödyn kaikesta mitä Knightsilla on tarjottavana. Ohjeet saat painamalla F1." + +#: wiz_setup.cpp:184 +msgid "Setup Complete" +msgstr "Asennus On Valmis" + +#: wiz_setup.cpp:213 +msgid "Do you accept the terms of our license?" +msgstr "Oletko lukenut, ja hyväksynyt lisenssi ehdot?" + +#: wiz_setup.cpp:218 +msgid "Please read and accept our license:" +msgstr "Olet hyvä, ja lue lisenssimme:" + +#: wiz_setup.cpp:269 +msgid "Free Internet Chess Server" +msgstr "Ilmainen Internet Shakki Palvelin" + +#: wiz_setup.cpp:269 +msgid "Internet Chess Club" +msgstr "Internet Shakki Klubi" + +#: wiz_setup.cpp:269 +msgid "Global Chess Server" +msgstr "Yleinen Shakki Palvelin" + +#: wiz_setup.cpp:269 +msgid "Chess.Net" +msgstr "Chess.Net" + +#: wiz_setup.cpp:270 +msgid "Chess-Square.Com" +msgstr "Chess-Square.Com" + +#: wiz_setup.cpp:270 +msgid "Australian FICS" +msgstr "Australian FICS" + +#: wiz_setup.cpp:270 +msgid "Brazilian FICS" +msgstr "Brazilian FICS" + +#: wiz_setup.cpp:270 +msgid "Chilean FICS" +msgstr "Chilean FICS" + +#: wiz_setup.cpp:271 +msgid "Croatian FICS" +msgstr "Croatian FICS" + +#: wiz_setup.cpp:271 +msgid "Dutch FICS" +msgstr "Dutch FICS" + +#: wiz_setup.cpp:271 +msgid "French FICS" +msgstr "French FICS" + +#: wiz_setup.cpp:271 +msgid "German FICS" +msgstr "German FICS" + +#: wiz_setup.cpp:271 +msgid "Swedish FICS" +msgstr "Swedish FICS" + +#: proto_xboard.cpp:443 +msgid "" +"%1 suggests this move:\n" +"%2" +msgstr "" +"%1 ehdota tätä siirtoa: \n" +"%2" + +#: proto_xboard.cpp:465 +#: proto_xboard.cpp:472 +#: proto_xboard.cpp:479 +msgid "" +"%1 tells you:\n" +"%2" +msgstr "" +"%1 kertoo:\n" +"%2" + diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..7c1edca --- /dev/null +++ b/po/fr.po @@ -0,0 +1,2258 @@ +# translation of fr.po to Française +# Copyright (C) 2003 Free Software Foundation, Inc. +# Gilles CAULIER , 2003 +# +msgid "" +msgstr "" +"Project-Id-Version: fr\n" +"POT-Creation-Date: 2003-01-21 04:30-0600\n" +"PO-Revision-Date: 2003-04-25 11:10+0200\n" +"Last-Translator: Gilles CAULIER \n" +"Language-Team: Française \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.1\n" + +#: accel.cpp:23 +msgid "Previous Move" +msgstr "Déplacement précèdent" + +#: accel.cpp:24 +msgid "Next Move" +msgstr "Déplacement suivant" + +#: accel.cpp:25 +msgid "Enter Text" +msgstr "Saisir un texte" + +#: accel.cpp:26 +msgid "Page Up" +msgstr "Page supérieure" + +#: accel.cpp:27 +msgid "Page Down" +msgstr "Page inférieure" + +#: accel.cpp:28 +msgid "Increase Board Size" +msgstr "Augmenter la taille de l'échiquier" + +#: accel.cpp:29 +msgid "Decrease Board Size" +msgstr "Réduire la taille de l'échiquier" + +#: accel.cpp:30 +msgid "Last History Item" +msgstr "Historique suivant des déplacements" + +#: accel.cpp:31 +msgid "Next History Item" +msgstr "Historique précédent des déplacements" + +#: accel.cpp:32 +msgid "Reply to the Last Tell" +msgstr "Répondre à la derniére discussion" + +#: accel.cpp:33 +msgid "Reply to the Channel" +msgstr "Répondre dans le canal de discussion" + +#: accel.cpp:34 +msgid "Kibitz" +msgstr "Messages issus des joueurs et des observateurs (Kibitz)" + +#: accel.cpp:35 setpagedisplay.cpp:523 +msgid "Whisper" +msgstr "Chuchotement" + +#: challenge_graph.cpp:75 tab_seeklist.cpp:40 +msgid "Seek Matches" +msgstr "Afficher la liste des matchs" + +#: challenge_graph.cpp:77 tab_seeklist.cpp:42 +msgid "Accept This Match" +msgstr "Accepter cette partie d'échecs" + +#: challenge_graph.cpp:78 tab_seeklist.cpp:43 +msgid "Tell..." +msgstr "Communiquer..." + +#: challenge_graph.cpp:79 tab_seeklist.cpp:44 +msgid "Assess..." +msgstr "Évaluer cette partie d'échecs..." + +#: challenge_graph.cpp:80 tab_seeklist.cpp:45 +msgid "Player Info" +msgstr "Informations sur le joueur" + +#: challenge_graph.cpp:82 tab_seeklist.cpp:47 +msgid "Player History" +msgstr "Historique du joueur" + +#: challenge_graph.cpp:84 tab_seeklist.cpp:49 +msgid "Add to Friends" +msgstr "Ajouter ce joueur à la liste des amis" + +#: challenge_graph.cpp:85 tab_seeklist.cpp:50 +msgid "Ignore This Player" +msgstr "Ignorer ce joueur" + +#: challenge_graph.cpp:304 tab_seeklist.cpp:28 +msgid "Rating" +msgstr "Classement" + +#: challenge_graph.cpp:311 +msgid "Time" +msgstr "Temps" + +#: challenge_graph_view.cpp:105 +msgid " Name: %1 Rating: %2 Match Type: %3 %4 Base Time: %5 Increment: %6" +msgstr "" +" Nom : %1 Taux : %2 Type de partie : %3 %4 Temps de base : %5 " +"Incrémentation : %6" + +#: core.cpp:385 +msgid "Hint" +msgstr "Conseil" + +#: core.cpp:388 +msgid "Tell User" +msgstr "Communiquer avec l'utilisateur" + +#: core.cpp:391 +msgid "Tell User Error" +msgstr "Communiquer l'erreur à l'utilisateur" + +#: core.cpp:397 +msgid "Tell Opponent" +msgstr "Communiquer avec l'adversaire" + +#: core.cpp:411 +msgid "Tell All" +msgstr "Communiquer avec tous les joueurs" + +#: core.cpp:646 +msgid "Load PGN..." +msgstr "Ouvrir un fichier PGN..." + +#: core.cpp:690 +msgid "Would you like to save this match?" +msgstr "Voulez-vous enregistrer cette partie ?" + +#: core.cpp:691 +msgid "Save Match?" +msgstr "Enregistrer la partie ?" + +#: core.cpp:710 +msgid "Save Match..." +msgstr "Enregistrer la partie..." + +#: dlg_challenge.cpp:25 +msgid "You've Been Challenged:" +msgstr "Proposition de partie d'échecs :" + +#: dlg_challenge.cpp:29 +msgid "Accept" +msgstr "Accepter" + +#: dlg_challenge.cpp:30 +msgid "Decline" +msgstr "Refuser" + +#: dlg_challenge.cpp:49 +msgid "Time Odds Match" +msgstr "Différences temporelles entre les deux joueurs" + +#: dlg_challenge.cpp:53 +msgid "Unrated" +msgstr "Non classifié" + +#: dlg_challenge.cpp:54 +msgid "Rated" +msgstr "Classifié" + +#: dlg_challenge.cpp:60 dlg_challenge.cpp:69 dlg_newmatch.cpp:87 +#: dlg_newmatch.cpp:104 tab_seeklist.cpp:101 +msgid " min." +msgstr " min." + +#: dlg_challenge.cpp:61 dlg_challenge.cpp:70 dlg_newmatch.cpp:97 +#: dlg_newmatch.cpp:114 setpageservers.cpp:146 tab_seeklist.cpp:102 +msgid " sec." +msgstr " sec." + +#: dlg_challenge.cpp:62 dlg_challenge.cpp:71 tab_seeklist.cpp:31 +msgid "Base Time" +msgstr "Temps de base" + +#: dlg_challenge.cpp:63 dlg_challenge.cpp:72 tab_seeklist.cpp:32 +msgid "Increment" +msgstr "Temps additionel" + +#: dlg_challenge.cpp:109 +msgid "" +"%1 %2 vs. %3 %4\n" +"in a %5 match." +msgstr "" +"« %1 %2 » contre « %3 %4 »\n" +"dans une partie du type « %5 »." + +#: dlg_challenge.cpp:124 dlg_challenge.cpp:125 +msgid "Time Controls" +msgstr "Paramètres temporels" + +#: dlg_challenge.cpp:154 +msgid "Counter Offer" +msgstr "Proposer un temps plus long" + +#: dlg_engine.cpp:26 +msgid "Configure Engine" +msgstr "Configurer le calculateur pour jeux d'échecs" + +#: dlg_engine.cpp:38 +msgid "Engine Name" +msgstr "Nom du calculateur pour jeux d'échecs" + +#: dlg_engine.cpp:43 setpageengines.cpp:63 +msgid "Protocol" +msgstr "Protocole" + +#: dlg_engine.cpp:48 +msgid "Engine Filename" +msgstr "Nom de fichier du calculateur pour jeux d'échecs" + +#: dlg_engine.cpp:54 +msgid "Command Line Arguments" +msgstr "Arguments de la ligne de commande" + +#: dlg_engine.cpp:59 dlg_server.cpp:88 +msgid "Log File" +msgstr "Fichier journal" + +#: dlg_login.cpp:21 +msgid "Login Prompt" +msgstr "Informations d'identification" + +#: dlg_login.cpp:31 +msgid "Login:" +msgstr "Identification :" + +#: dlg_login.cpp:32 +msgid "Password:" +msgstr "Mot de passe :" + +#: dlg_login.cpp:38 +msgid "Log in as guest" +msgstr "Se connecter comme invité" + +#: dlg_login.cpp:54 +msgid "Login" +msgstr "Se connecter" + +#: dlg_login.cpp:54 +msgid "Log in to the chess server using this name and password." +msgstr "" +"S'identifie a un serveur de jeu d'échecs en utilisant un nom d'utilisateur " +"et un mot de passe." + +#: dlg_newmatch.cpp:38 +msgid "Start a New Match" +msgstr "Commencer une nouvelle partie" + +#: dlg_newmatch.cpp:45 +msgid "White" +msgstr "Blancs" + +#: dlg_newmatch.cpp:46 +msgid "Black" +msgstr "Noirs" + +#: dlg_newmatch.cpp:59 dlg_newmatch.cpp:66 +msgid "Human" +msgstr "Humain" + +#: dlg_newmatch.cpp:60 dlg_newmatch.cpp:67 +msgid "Computer" +msgstr "Ordinateur" + +#: dlg_newmatch.cpp:61 dlg_newmatch.cpp:68 +msgid "Email" +msgstr "Messagerie électronique" + +#: dlg_newmatch.cpp:85 dlg_newmatch.cpp:102 +msgid "Base Time:" +msgstr "Temps de base :" + +#: dlg_newmatch.cpp:90 dlg_newmatch.cpp:107 +msgid "Moves Per Base Time" +msgstr "Déplacements par temps de base" + +#: dlg_newmatch.cpp:92 dlg_newmatch.cpp:109 +msgid " moves" +msgstr " déplacements" + +#: dlg_newmatch.cpp:95 dlg_newmatch.cpp:112 +msgid "Increment Per Move" +msgstr "Incrémentation par déplacement" + +#: dlg_promote.cpp:94 +msgid "Promote your pawn to..." +msgstr "Promouvoir votre pion pour..." + +#: dlg_promote.cpp:101 +msgid "Pawn Promotion" +msgstr "Promotion du pion" + +#: dlg_selectemail.cpp:27 +msgid "Select Email Address" +msgstr "Choisir l'adresse de courrier électronique" + +#: dlg_selectengine.cpp:30 +msgid "Select Computer Player" +msgstr "Sélectionner l'adversaire informatique" + +#: dlg_selectengine.cpp:41 +msgid "Computer Players" +msgstr "Adversaires informatiques" + +#: dlg_selectengine.cpp:61 +msgid "Player Strength" +msgstr "Niveau du joueur" + +#: dlg_selectengine.cpp:63 +msgid "Weak" +msgstr "Faible" + +#: dlg_selectengine.cpp:70 +msgid "Strong" +msgstr "Mauvais" + +#: dlg_server.cpp:25 +msgid "Configure Server" +msgstr "Configurer le serveur" + +#: dlg_server.cpp:37 +msgid "Server Name" +msgstr "Nom du serveur" + +#: dlg_server.cpp:44 +msgid "Server URL" +msgstr "Adresse du serveur" + +#: dlg_server.cpp:49 +msgid "Server Port" +msgstr "Port du serveur" + +#: dlg_server.cpp:56 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: dlg_server.cpp:59 +msgid "Remember My Password" +msgstr "Se souvenir du mot de passe" + +#: dlg_server.cpp:64 +msgid "Password" +msgstr "Mot de passe" + +#: dlg_server.cpp:71 +msgid "Confirm Password" +msgstr "Confirmation du mot de passe" + +#: dlg_server.cpp:79 +msgid "Timeseal" +msgstr "Programme de compensation des délais du réseau internet" + +#: dlg_settings.cpp:48 setpagedisplay.cpp:142 +msgid "General" +msgstr "Général" + +#: dlg_settings.cpp:49 +msgid "Various aspects of Knights get configured here." +msgstr "Plusieurs aspects de Knights peuvent être configurés ici." + +#: dlg_settings.cpp:55 +msgid "Display" +msgstr "Affichage" + +#: dlg_settings.cpp:56 +msgid "These settings determine how Knights displays itself to you." +msgstr "Ces paramètres configurent l'affichage de Knights." + +#: dlg_settings.cpp:62 +msgid "Audio" +msgstr "Audio" + +#: dlg_settings.cpp:63 +msgid "These settings determine what Knights sounds like." +msgstr "Ces paramètres réglent les options sonores de Knights." + +#: dlg_settings.cpp:69 +msgid "Computer Opponents" +msgstr "Adversaire informatique" + +#: dlg_settings.cpp:70 +msgid "Configure your chess engines here." +msgstr "Configurer ici votre calculateur pour jeux d'échecs." + +#: dlg_settings.cpp:76 setpageservers.cpp:65 +msgid "Chess Servers" +msgstr "Serveurs de jeux d'échecs" + +#: dlg_settings.cpp:77 +msgid "Configure your internet chess servers here." +msgstr "Configurer ici les serveurs du jeu d'échecs disponibles sur internet." + +#: io_internet.cpp:80 +msgid "" +"There are no servers configured.\n" +"Please make sure you have at least one server configured." +msgstr "" +"Il n'y a aucun serveur de configuré.\n" +"Veuillez vérifier que vous avez au moins un serveur de configuré." + +#: io_internet.cpp:80 +msgid "Cannot find a server." +msgstr "Impossible de trouver un serveur." + +#: io_internet.cpp:99 +msgid "" +"Knights can not start Timeseal.\n" +"Please make sure you have the correct path and filename configured." +msgstr "" +"Knights ne peut pas démarrer le programme de compensation des délais du " +"réseau internet.\n" +"Veuillez vérifier que le chemin et le nom du programme sont correct." + +#: io_internet.cpp:99 +msgid "Cannot find Timeseal." +msgstr "" +"Impossible de trouver le programme de synchronisation du temps pour les " +"serveurs de jeu d'échecs." + +#: io_internet.cpp:109 io_internet.cpp:121 +msgid "" +"Knights is unable to connect to the server.\n" +" Please make sure your internet connection is working and try again." +msgstr "" +"Knights ne peut pas se connecter au serveur. Vérifier que votre connexion " +"internet est active et réessayer." + +#: io_internet.cpp:109 io_internet.cpp:121 +msgid "Cannot connect to server." +msgstr "Impossible de se connecter au serveur" + +#: io_internet.cpp:144 +msgid "%1 Console" +msgstr "Console « %1 »" + +#: io_internet.cpp:149 +msgid "Sought Matches List" +msgstr "Liste des parties d'échecs" + +#: io_internet.cpp:154 +msgid "Sought Matches Graph" +msgstr "Graphique des parties d'échecs" + +#: knights.cpp:70 main.cpp:34 +msgid "Knights" +msgstr "Knights" + +#: knights.cpp:250 +msgid "&Draw" +msgstr "&Partie nulle" + +#: knights.cpp:254 +msgid "&Retract Move" +msgstr "Annule&r le mouvement" + +#: knights.cpp:256 +msgid "Select this to retract your last move." +msgstr "Selectionnez cette option pour annuler votre dernier déplacement." + +#: knights.cpp:258 +msgid "Resign" +msgstr "Abandonner la partie" + +#: knights.cpp:260 +msgid "Use this to concede the match to your opponent." +msgstr "Utilisez cette option pour abandonner la partie." + +#: knights.cpp:262 +msgid "&Call Flag" +msgstr "&Fin de jeu sur dépassement du temps (drapeau)" + +#: knights.cpp:264 +msgid "Use this to declare the match over, due to your opponent being out of time." +msgstr "" +"Utiliser cette option pour déclarer la fin de la partie d'échecs, si l'adversaire a " +"dépassé le temps réglementaire pour jouer." + +#: knights.cpp:266 +msgid "&Hint" +msgstr "Demander un consei&l" + +#: knights.cpp:268 +msgid "This will ask your opponent for a hint." +msgstr "Cette option demande un conseil à votre adversaire." + +#: knights.cpp:270 +msgid "Move &Now" +msgstr "Déplacer mai&ntenant" + +#: knights.cpp:272 +msgid "Clicking this option will force your opponent to move immediately." +msgstr "" +"Choisissez cette option pour forcer votre adverssaire à déplacer une piéce " +"immédiatement." + +#: knights.cpp:274 +msgid "&Flip View" +msgstr "Retourner l'échi&quier" + +#: knights.cpp:276 +msgid "This will reverse the chessboard's orientation by 180 degrees." +msgstr "Retourne la vue de l'échiquier suivant un angle de 180 degrés." + +#: knights.cpp:278 +msgid "&Ponder" +msgstr "&Réfléchir constamment" + +#: knights.cpp:281 +msgid "This toggles your opponent's ability to think while it's your turn." +msgstr "" +"Cette option indique à votre adversaire qu'il doit calculer ses prochains " +"coups tout le temps et pas uniquement lorsque c'est son tour." + +#: knights.cpp:285 knights.cpp:949 +msgid "Pause" +msgstr "Mettre en pause" + +#: knights.cpp:287 +msgid "Select this to pause the clock for this match." +msgstr "" +"Selectionnez cette option pour faire mettre le chronométre en pause pour " +"cette partie." + +#: knights.cpp:292 +msgid "&Offer Draw" +msgstr "Pr&oposer une partie nulle" + +#: knights.cpp:293 +msgid "Clicking this will inform your opponent that you are willing draw the match." +msgstr "" +"Selectionner cette option pour informer à votre adversersaire lorsque vous voulez " +"rendre nulle la partie d'échecs." + +#: knights.cpp:295 +msgid "&Accept Draw" +msgstr "&Accepter une partie nulle" + +#: knights.cpp:296 +msgid "Clicking this will accept a draw offered by your opponent." +msgstr "" +"Selectionner cette option pour informer votre adversaire de votre accord " +"pour déclarer la partie comme nulle lorsque celui ci en fait la proposition." + +#: knights.cpp:298 +msgid "&Reject Draw" +msgstr "&Rejeter une partie nulle" + +#: knights.cpp:299 +msgid "Clicking this will reject a draw offered by your opponent." +msgstr "" +"Selectionner cette option pour informer votre adversaire de votre désaccord " +"pour déclarer la partie comme nulle lorsque celui ci en fait la proposition." + +#: knights.cpp:301 +msgid "&Ignore Draw" +msgstr "&Ignorer une partie nulle" + +#: knights.cpp:302 +msgid "Clicking this will ignore future draw offers from your opponent." +msgstr "" +"Selectionner cette option pour informer votre adversaire que vous ignorez " +"toute proposition de partie nulle." + +#: knights.cpp:308 +msgid "&New Match..." +msgstr "&Nouvelle partie d'échecs..." + +#: knights.cpp:309 +msgid "This allows you to begin a new match." +msgstr "Ceci vous permet de commencer une nouvelle partie." + +#: knights.cpp:312 +msgid "&Load Match..." +msgstr "&Ouvrir une partie..." + +#: knights.cpp:313 +msgid "" +"The Load command will allow you to select a previously saved match and play " +"it again." +msgstr "" +"Cette option permet d'ouvrir et de poursuivre une partie d'échecs préalablement " +"jouée et enregistrée." + +#: knights.cpp:316 thinbuttons.cpp:40 +msgid "&Close Match" +msgstr "Ferme&r la partie" + +#: knights.cpp:318 +msgid "This command removes the current match." +msgstr "Cette commande ferme la partie en cours." + +#: knights.cpp:320 +msgid "Close All" +msgstr "Fermer tout" + +#: knights.cpp:322 +msgid "This command will remove all matches that are currently loaded." +msgstr "Cette commande fermera toutes les parties en cours." + +#: knights.cpp:326 thinbuttons.cpp:32 +msgid "&Save Match" +msgstr "&Enregistrer la partie" + +#: knights.cpp:328 knights.cpp:333 +msgid "" +"The Save command will allow you to store a copy of your current match for " +"later use." +msgstr "" +"Cette option permet de faire un enregistrement de la partie d'échecs en cours pour " +"la poursuivre plus tard." + +#: knights.cpp:331 thinbuttons.cpp:34 +msgid "Save Match &As..." +msgstr "Enregistrer la p&artie sous..." + +#: knights.cpp:337 knights.cpp:859 +msgid "Connect to Server" +msgstr "Se connecter à un serveur" + +#: knights.cpp:338 +msgid "Clicking this will connect Knights with an internet chess server." +msgstr "" +"Sélectionnez cette option pour connecter Knights avec un serveur d'échecs " +"sur internet." + +#: knights.cpp:342 thinbuttons.cpp:37 +msgid "&Print Notation..." +msgstr "Im&primer la liste des déplacements..." + +#: knights.cpp:344 +msgid "" +"The Print command will allow you to print this game's notation on your " +"printer." +msgstr "Cette option imprimera tous les déplacement réalisés dans une partie." + +#: knights.cpp:349 +msgid "The Quit command will stop all matches and exit Knights." +msgstr "Cette option arrête la partie d'échecs en cours et quitte Knights." + +#: knights.cpp:355 +msgid "Play &White" +msgstr "Jouer avec les &blancs" + +#: knights.cpp:358 +msgid "" +"If checked, this option tells Knights that you will play as the White army " +"when you play vs. the computer." +msgstr "" +"Cette option indique à Knights que vous voulez jouer avec l'équipe des " +"blancs quand vous débutez une partie contre l'ordinateur." + +#: knights.cpp:360 +msgid "Play &Black" +msgstr "Jouer avec les &noirs" + +#: knights.cpp:363 +msgid "" +"If checked, this option tells Knights that you will play as the Black army " +"when you play vs. the computer." +msgstr "" +"Cette option indique à Knights que vous voulez jouer avec l'équipe des noirs " +"quand vous débutez une partie contre l'ordinateur." + +#: knights.cpp:366 +msgid "&Install Themes" +msgstr "&Installer des thèmes" + +#: knights.cpp:367 +msgid "This lets you install downloaded themes into Knights." +msgstr "" +"Cette option vous permet d'installer dans Knights des thémes préalablement " +"téléchargé." + +#: knights.cpp:371 +msgid "Click this if you want to change the keyboard shortcuts that Knights uses." +msgstr "" +"Cliquer sur cette option si vous voulez changer les raccourcis clavier que " +"Knights utilise." + +#: knights.cpp:374 +msgid "&Configure Knights..." +msgstr "&Configurer Knights..." + +#: knights.cpp:375 +msgid "" +"This opens a new window which allows you to customize Knights to your " +"particular tastes." +msgstr "" +"Cette option ouvre une nouvelle fenêtre qui vous permet de paramètrer toutes " +"les options de Knights." + +#: knights.cpp:381 +msgid "Begin a Tutorial" +msgstr "Lancer le tutoriel" + +#: knights.cpp:387 +msgid "&Match" +msgstr "&Partie d'échecs" + +#: knights.cpp:576 +msgid "Error with white engine" +msgstr "Erreur avec le moteur d'échecs associé aux pions blancs" + +#: knights.cpp:578 +msgid "" +"You selected %1 to play white,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play white." +msgstr "" +"Vous avez sélectionné %1 pour jouer avec avec l'équipes des blancs,\n" +"mais il peut seulement être utilisé comme un livre de reférences du jeu " +"d'échecs.\n" +"Veuillez sélectionner un autre programme de jeu d'échecs pour l'équipe des " +"blancs." + +#: knights.cpp:579 +msgid "White Engine Problem" +msgstr "Problème avec le calculateur pour jeux d'échecs associé aux blancs" + +#: knights.cpp:582 +msgid "Error with white book engine" +msgstr "Erreur avec le livre de reférences des pions blancs" + +#: knights.cpp:584 +msgid "" +"You selected %1 to play white's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play white's book." +msgstr "" +"Vous avez sélectionné %1 pour jouer avec avec l'équipes des blancs avec un " +"livre de reférences,\n" +"mais il peut seulement être utilisé comme un programme de calcul pour le jeu " +"d'échecs sans livre de références.\n" +"Veuillez sélectionner un autre programme de jeu d'échecs pour l'équipe des " +"blancs qui autorise les livres de références." + +#: knights.cpp:585 +msgid "White Book Engine Problem" +msgstr "Problème avec le livre de reférences des blancs" + +#: knights.cpp:588 +msgid "Error with black engine" +msgstr "Erreur avec le moteur d'échecs associé aux pions noirs" + +#: knights.cpp:590 +msgid "" +"You selected %1 to play black,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play black." +msgstr "" +"Vous avez sélectionné %1 pour jouer avec avec l'équipes des noirs,\n" +"mais il peut seulement être utilisé comme un livre de reférences du jeu " +"d'échecs.\n" +"Veuillez sélectionner un autre programme de jeu d'échecs pour l'équipe des " +"noirs." + +#: knights.cpp:591 +msgid "Black Engine Problem" +msgstr "Problème avec le moteur d'échecs associé aux noirs" + +#: knights.cpp:594 +msgid "Error with black book engine" +msgstr "Erreur avec le livre de reférences des pions noirs" + +#: knights.cpp:596 +msgid "" +"You selected %1 to play black's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play black's book." +msgstr "" +"Vous avez sélectionné %1 pour jouer avec avec l'équipes des noirs avec un " +"livre de reférences,\n" +"mais il peut seulement être utilisé comme un programme de calcul pour le jeu " +"d'échecs sans livre de références.\n" +"Veuillez sélectionner un autre programme de jeu d'échecs pour l'équipe des " +"noirs qui autorise les livres de références." + +#: knights.cpp:597 +msgid "Black Book Engine Problem" +msgstr "Problème avec le livre de reférences des noirs" + +#: knights.cpp:600 +msgid "The computer opponent assigned to play %1 has crashed" +msgstr "" +"L'adverssaire informatique qui est assigné à jouer avec les pions %1 c'est arrêté " +"anormalement" + +#: knights.cpp:603 +msgid "There was an error while loading the file" +msgstr "Une erreur est survenue pendant l'ouverture du fichier" + +#: knights.cpp:606 +msgid "There was an error while saving the file" +msgstr "Une erreur est survenue pendant l'enregistrement du fichier" + +#: knights.cpp:610 +msgid "Loading complete" +msgstr "Chargement terminé" + +#: knights.cpp:613 +msgid "Saving complete" +msgstr "Enregistrement terminé" + +#: knights.cpp:616 +msgid "Reading File" +msgstr "Lecture du fichier" + +#: knights.cpp:619 +msgid "Can not move a chessman while reviewing the match" +msgstr "Impossible de déplacer une piéce du jeu pendant que j'examine la partie d'échecs" + +#: knights.cpp:622 +msgid "Illegal Move" +msgstr "Déplacement illégal" + +#: knights.cpp:625 +msgid "White's turn" +msgstr "Les blancs doivent jouer" + +#: knights.cpp:628 +msgid "Black's turn" +msgstr "Les noirs doivent jouer" + +#: knights.cpp:631 +msgid "White wins" +msgstr "Les blancs ont gagné" + +#: knights.cpp:634 +msgid "Black wins" +msgstr "Les noirs ont gagné" + +#: knights.cpp:637 +msgid "Checkmate, White wins" +msgstr "Échecs et mat, les blancs ont gagné" + +#: knights.cpp:640 +msgid "Checkmate, Black wins" +msgstr "Échecs et mat, les noirs ont gagné" + +#: knights.cpp:643 +msgid "White resigns" +msgstr "Les blancs ont abandonné" + +#: knights.cpp:646 +msgid "Black resigns" +msgstr "Les noirs ont abandonné" + +#: knights.cpp:649 +msgid "White's flag fell" +msgstr "Le temps pour les blancs est dépassé" + +#: knights.cpp:652 +msgid "Black's flag fell" +msgstr "Le temps pour les noirs est dépassé" + +#: knights.cpp:655 +msgid "Black's flag was called, White wins" +msgstr "Les blancs gagnent en prennant le drapeau des noirs" + +#: knights.cpp:658 +msgid "White's flag was called, Black wins" +msgstr "Les noirs gagnent en prennant le drapeau des blancs" + +#: knights.cpp:661 +msgid "Draw match" +msgstr "Partie nulle" + +#: knights.cpp:664 +msgid "50 moves rule, draw match" +msgstr "50 déplacements ont été effectué, la partie d'échecs est nulle" + +#: knights.cpp:667 +msgid "Starting computer players, please wait" +msgstr "Patientez, exécution de l'adversaire informatique" + +#: knights.cpp:670 +msgid "Match paused" +msgstr "Type de partie d'échecs" + +#: knights.cpp:673 +msgid "White has offered a draw" +msgstr "Les blancs proposent une partie nulle" + +#: knights.cpp:676 +msgid "Black has offered a draw" +msgstr "Les noirs proposent une partie nulle" + +#: knights.cpp:679 +msgid "Lost contact with opponent" +msgstr "Connexion perdue avec l'adversaire" + +#: knights.cpp:682 +msgid "Ready" +msgstr "Prêt" + +#: knights.cpp:866 +msgid "Disconnect from Server" +msgstr "Se déconnecter du serveur" + +#: knights.cpp:955 +msgid "Resume" +msgstr "Reprendre" + +#: knights.cpp:1014 +msgid "Knights Themes" +msgstr "Thémes de Knights" + +#: knights.cpp:1015 +msgid "Install Theme..." +msgstr "Installer un thème..." + +#: knights.cpp:1045 +msgid "" +"You do not have permission to install this theme systemwide, so Knights " +"installed it locally." +msgstr "" +"Vous n'avez pas les permissions d'installer ce théme dans les répertoires " +"systémes de votre machine. Cependant, Knights peut faire une installation " +"dans votre répertoire personnel." + +#: knights.cpp:1046 +msgid "Installed theme locally" +msgstr "Installer un théme en local" + +#: knights.cpp:1051 +#, c-format +msgid "" +"The theme could not be installed:\n" +"%1" +msgstr "" +"Impossible d'installer le thème :\n" +"%1" + +#: knights.cpp:1052 +msgid "Can not install theme" +msgstr "Impossible d'installer le thème" + +#: knightstextview.cpp:35 +msgid "Select &All" +msgstr "Sélectionner &Tout" + +#: knightstextview.cpp:44 +msgid "Zoom &In" +msgstr "Zoomer vers l'&interieur" + +#: knightstextview.cpp:46 +msgid "Zoom &Out" +msgstr "Z&oomer vers l'exterieur" + +#: list_pgn.cpp:29 list_pgn.cpp:48 +msgid "Result" +msgstr "Résultat" + +#: list_pgn.cpp:30 list_pgn.cpp:49 +msgid "Title" +msgstr "Titre" + +#: list_pgn.cpp:31 list_pgn.cpp:50 +msgid "Round" +msgstr "Partie" + +#: list_pgn.cpp:32 list_pgn.cpp:51 +msgid "Site" +msgstr "Site" + +#: list_pgn.cpp:33 list_pgn.cpp:52 +msgid "Date" +msgstr "Date" + +#: list_pgn.cpp:81 +#, c-format +msgid "Can not open %1" +msgstr "Impossible d'ouvrir %1" + +#: list_pgn.cpp:140 +msgid "%1 matches found." +msgstr "%1 parties ont été trouvé." + +#: main.cpp:26 +msgid "Specify the location of your Knights data directory." +msgstr "Spécifiez l'emplacement du dossier contenant vos données pour Knights." + +#: main.cpp:27 +msgid "A .pgn file to be loaded." +msgstr "Un fichier « .png » est ouvert." + +#: main.cpp:36 +msgid "" +"The Knights Chess Interface\n" +"\n" +"Knights is a chess interface\n" +"for the K Desktop Environment." +msgstr "" +"L'interface graphique Knights pour les échecs\n" +"\n" +"Knights est une interface du jeu des échecs\n" +"pour l'environnement de bureau KDE." + +#: main.cpp:44 +msgid "Project Manager and Programmer" +msgstr "Administrateur du projet et programmeur" + +#: main.cpp:48 +msgid "Communications Programmer" +msgstr "Programmeur des couches de communications" + +#: main.cpp:52 +msgid "Qtopia port and patches" +msgstr "Portage sur « Qtopia » et correctifs" + +#: main.cpp:56 +msgid "Patches and suggestions" +msgstr "Correctifs et suggestions" + +#: main.cpp:60 +msgid "KDE3 Compatability Patch" +msgstr "Correctif pour une compatibilté avec KDE3" + +#: main.cpp:64 +msgid "XBoard protocol" +msgstr "Protocole « XBoard »" + +#: _translatorinfo.cpp:1 main.cpp:67 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Caulier Gilles,Caulier Danielle" + +#: _translatorinfo.cpp:3 main.cpp:68 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "caulier.gilles@free.fr,caulier.danielle@free.fr" + +#: match_param.cpp:107 +msgid "Unknown" +msgstr "Inconnu" + +#: pgn.cpp:145 +msgid "%1 vs. %2" +msgstr "%1 contre %2" + +#: pgn.cpp:943 +#, c-format +msgid "Page %1" +msgstr "Page %1" + +#: pgn.cpp:975 +msgid " Good move" +msgstr " Bon déplacement" + +#: pgn.cpp:978 +msgid " Poor move" +msgstr " Mauvais déplacement " + +#: pgn.cpp:981 +msgid " Very good move" +msgstr " Très bon déplacement" + +#: pgn.cpp:984 +msgid " Very poor move" +msgstr " Très mauvais déplacement" + +#: pgn.cpp:987 +msgid " Speculative move" +msgstr " Déplacement spéculatif" + +#: pgn.cpp:990 +msgid " Questionable move" +msgstr " Déplacement douteux" + +#: pgn.cpp:993 +msgid " Forced move" +msgstr " Déplacement forcé" + +#: pgn.cpp:996 +msgid " Singular move" +msgstr " Déplacement singulier" + +#: pgn.cpp:999 +msgid " Worst move" +msgstr "Déplacement très mauvais" + +#: pgn.cpp:1002 +msgid " Drawish position" +msgstr "Position pour une partie nulle" + +#: pgn.cpp:1005 +msgid " Equal chances, quiet position" +msgstr " Chance égale, position discréte" + +#: pgn.cpp:1008 +msgid " Equal chances, active position" +msgstr " Chance égale, position active" + +#: pgn.cpp:1011 +msgid " Unclear position" +msgstr " Position invérifiable" + +#: pgn.cpp:1014 +msgid " White has a slight advantage" +msgstr " Les blancs ont un faible avantage" + +#: pgn.cpp:1017 +msgid " Black has a slight advantage" +msgstr " Les noirs ont un faible avantage" + +#: pgn.cpp:1020 +msgid " White has a moderate advantage" +msgstr " Les blancs ont un avantage moyen" + +#: pgn.cpp:1023 +msgid " Black has a moderate advantage" +msgstr " Les noirs ont un avantage moyen" + +#: pgn.cpp:1026 +msgid " White has a decisive advantage" +msgstr " Les Blancs ont un bon avantage" + +#: pgn.cpp:1029 +msgid " Black has a decisive advantage" +msgstr " Les noirs ont un bon avantage" + +#: pgn.cpp:1032 +msgid " White has a crushing advantage ( Black should resign )" +msgstr " Les blancs ont un avantage très fort (Les noirs doivent abandonner)" + +#: pgn.cpp:1035 +msgid " Black has a crushing advantage ( White should resign )" +msgstr " Les noirs ont un avantage très fort (Les blancs doivent abandonner)" + +#: pgn.cpp:1038 +msgid " White is in zugzwang" +msgstr " Les blancs sont dans une position indésirable" + +#: pgn.cpp:1041 +msgid " Black is in zugzwang" +msgstr " Les noirs sont dans une position indésirable" + +#: pgn.cpp:1044 +msgid " White has a slight space advantage" +msgstr " Les blancs ont un faible avantage sur l'échiquier" + +#: pgn.cpp:1047 +msgid " Black has a slight space advantage" +msgstr " Les noirs ont un faible avantage sur l'échiquier" + +#: pgn.cpp:1050 +msgid " White has a moderate space advantage" +msgstr " Les blancs ont un avantage moyen sur l'échiquier" + +#: pgn.cpp:1053 +msgid " Black has a moderate space advantage" +msgstr " Les noirs ont un avantage moyen sur l'échiquier" + +#: pgn.cpp:1056 +msgid " White has a decisive space advantage" +msgstr " Les blancs ont un bon avantage sur l'échiquier" + +#: pgn.cpp:1059 +msgid " Black has a decisive space advantage" +msgstr " Les noirs ont un bon avantage sur l'échiquier" + +#: pgn.cpp:1062 +msgid " White has a slight time ( development ) advantage" +msgstr " Les blancs ont un faible avantage dans le temps" + +#: pgn.cpp:1065 +msgid " Black has a slight time ( development ) advantage" +msgstr " Les noirs ont un faible avantage dans le temps" + +#: pgn.cpp:1068 +msgid " White has a moderate time ( development ) advantage" +msgstr " Les blancs ont un avantage moyen dans le temps" + +#: pgn.cpp:1071 +msgid " Black has a moderate time ( development ) advantage" +msgstr " Les noirs ont un avantage moyen dans le temps" + +#: pgn.cpp:1074 +msgid " White has a decisive time ( development ) advantage" +msgstr " Les blancs ont un bon avantage dans le temps" + +#: pgn.cpp:1077 +msgid " Black has a decisive time ( development ) advantage" +msgstr " Les noirs ont un bon avantage dans le temps" + +#: pgn.cpp:1080 +msgid " White has the initiative" +msgstr " Les blancs réagissent en premier" + +#: pgn.cpp:1083 +msgid " Black has the initiative" +msgstr " Les noirs réagissent en premier" + +#: pgn.cpp:1086 +msgid " White has a lasting initiative" +msgstr " Les blancs prennent une derniére initiative" + +#: pgn.cpp:1089 +msgid " Black has a lasting initiative" +msgstr " Les noirs prennent une derniére initiative" + +#: pgn.cpp:1092 +msgid " White has the attack" +msgstr " Les blancs attaquent" + +#: pgn.cpp:1095 +msgid " Black has the attack" +msgstr "Les noirs attaquent" + +#: pgn.cpp:1098 +msgid " White has insufficient compensation for material deficit" +msgstr "" +" Les blancs n'ont pas suffisamment de piéces adverses pour compenser leur " +"infériorité materielle" + +#: pgn.cpp:1101 +msgid " Black has insufficient compensation for material deficit" +msgstr "" +" Les noirs n'ont pas suffisamment de piéces adverses pour compenser leur " +"infériorité materielle" + +#: pgn.cpp:1104 +msgid " White has sufficient compensation for material deficit" +msgstr "" +" Les blancs ont suffisamment de piéces adverses pour compenser leur " +"infériorité materielle" + +#: pgn.cpp:1107 +msgid " Black has sufficient compensation for material deficit" +msgstr "" +" Les noirs ont suffisamment de piéces adverses pour compenser leur " +"infériorité materielle" + +#: pgn.cpp:1110 +msgid " White has more than adequate compensation for material deficit" +msgstr "" +" Les blancs ont largement plus de piéces adverses pour compenser leur " +"infériorité materielle" + +#: pgn.cpp:1113 +msgid " Black has more than adequate compensation for material deficit" +msgstr "" +" Les noirs ont largement plus de piéces adverses pour compenser leur " +"infériorité materielle" + +#: pgn.cpp:1116 +msgid " White has a slight center control advantage" +msgstr " Les blancs ont un faible avantage de contrôle au centre de l'échiquier" + +#: pgn.cpp:1119 +msgid " Black has a slight center control advantage" +msgstr " Les noirs ont un faible avantage pour le contrôle au centre de l'échiquier" + +#: pgn.cpp:1122 +msgid " White has a moderate center control advantage" +msgstr " Les blancs ont un avantage modéré pour le contrôle au centre de l'échiquier" + +#: pgn.cpp:1125 +msgid " Black has a moderate center control advantage" +msgstr " Les noirs ont un avantage modéré pour le contrôle au centre de l'échiquier" + +#: pgn.cpp:1128 +msgid " White has a decisive center control advantage" +msgstr " Les blancs ont un avantage décisif pour le contrôle au centre de l'échiquier" + +#: pgn.cpp:1131 +msgid " Black has a decisive center control advantage" +msgstr " Les noirs ont un avantage décisif pour le contrôle au centre de l'échiquier" + +#: pgn.cpp:1134 +msgid " White has a slight kingside control advantage" +msgstr " Les blancs ont un faible avantage pour le contrôle du rois" + +#: pgn.cpp:1137 +msgid " Black has a slight kingside control advantage" +msgstr " Les noirs ont un faible avantage pour le contrôle du rois" + +#: pgn.cpp:1140 +msgid " White has a moderate kingside control advantage" +msgstr " Les blancs ont un avantage moyen pour le contrôle du rois" + +#: pgn.cpp:1143 +msgid " Black has a moderate kingside control advantage" +msgstr " Les noirs ont un avantage moyen pour le contrôle du rois" + +#: pgn.cpp:1146 +msgid " White has a decisive kingside control advantage" +msgstr " Les blancs ont un avantage décisif pour le contrôle du rois" + +#: pgn.cpp:1149 +msgid " Black has a decisive kingside control advantage" +msgstr " Les noirs ont un avantage décisif pour le contrôle du rois" + +#: pgn.cpp:1152 +msgid " White has a slight queenside control advantage" +msgstr " Les blancs ont un faible avantage pour le contrôle de la reine" + +#: pgn.cpp:1155 +msgid " Black has a slight queenside control advantage" +msgstr " Les noirs ont un faible avantage pour le contrôle de la reine" + +#: pgn.cpp:1158 +msgid " White has a moderate queenside control advantage" +msgstr " Les blancs ont un avantage moyen pour le contrôle de la reine" + +#: pgn.cpp:1161 +msgid " Black has a moderate queenside control advantage" +msgstr " Les noirs ont un avantage moyen pour le contrôle de la reine" + +#: pgn.cpp:1164 +msgid " White has a decisive queenside control advantage" +msgstr " Les blancs ont un avantage décisif pour le contrôle de la reine" + +#: pgn.cpp:1167 +msgid " Black has a decisive queenside control advantage" +msgstr " Les noirs ont un avantage décisif pour le contrôle de la reine" + +#: pgn.cpp:1170 +msgid " White has a vulnerable first rank" +msgstr " Les blancs ont une premiére ligne de front vulnérable" + +#: pgn.cpp:1173 +msgid " Black has a vulnerable first rank" +msgstr " Les noirs ont une premiére ligne de front vulnérable" + +#: pgn.cpp:1176 +msgid " White has a well protected first rank" +msgstr " Les blancs ont une premiére ligne de front bien protégée" + +#: pgn.cpp:1179 +msgid " Black has a well protected first rank" +msgstr " Les noirs ont une premiére ligne de front bien protégée" + +#: pgn.cpp:1182 +msgid " White has a poorly protected king" +msgstr " Les blancs ont un roi qui est faiblement protégé" + +#: pgn.cpp:1185 +msgid " Black has a poorly protected king" +msgstr " Les noirs ont un roi qui est faiblement protégé" + +#: pgn.cpp:1188 +msgid " White has a well protected king" +msgstr " Les blancs ont un roi qui est bien protégé" + +#: pgn.cpp:1191 +msgid " Black has a well protected king" +msgstr " Les noirs ont un roi qui est bien protégé" + +#: pgn.cpp:1194 +msgid " White has a poorly placed king" +msgstr " Les blancs ont un roi qui est mal placé" + +#: pgn.cpp:1197 +msgid " Black has a poorly placed king" +msgstr " Les noirs ont un roi qui est mal placé" + +#: pgn.cpp:1200 +msgid " White has a well placed king" +msgstr " Les blancs ont un roi qui est bien placé" + +#: pgn.cpp:1203 +msgid " Black has a well placed king" +msgstr " Les noirs ont un roi qui est bien placé" + +#: pgn.cpp:1206 +msgid " White has a very weak pawn structure" +msgstr " Les blancs ont une structure de pions très fragile" + +#: pgn.cpp:1209 +msgid " Black has a very weak pawn structure" +msgstr " Les noirs ont une structure de pions très fragile" + +#: pgn.cpp:1212 +msgid " White has a moderately weak pawn structure" +msgstr " Les blancs ont une structure de pions fragile" + +#: pgn.cpp:1215 +msgid " Black has a moderately weak pawn structure" +msgstr " Les noirs ont une structure de pions fragile" + +#: pgn.cpp:1218 +msgid " White has a moderately strong pawn structure" +msgstr " Les blancs ont une structure de pions moyennement solide" + +#: pgn.cpp:1221 +msgid " Black has a moderately strong pawn structure" +msgstr " Les noirs ont une structure de pions moyennement solide" + +#: pgn.cpp:1224 +msgid " White has a very strong pawn structure" +msgstr " Les blancs ont une structure de pions solide" + +#: pgn.cpp:1227 +msgid " Black has a very strong pawn structure" +msgstr " Les noirs ont une structure de pions solide" + +#: pgn.cpp:1230 +msgid " White has poor knight placement" +msgstr " Les blancs ont un cheval en difficulté" + +#: pgn.cpp:1233 +msgid " Black has poor knight placement" +msgstr " Les noirs ont un cheval en difficulté" + +#: pgn.cpp:1236 +msgid " White has good knight placement" +msgstr " Les blancs ont un cheval bien placé" + +#: pgn.cpp:1239 +msgid " Black has good knight placement" +msgstr " Les noirs ont un cheval bien placé" + +#: pgn.cpp:1242 +msgid " White has poor bishop placement" +msgstr " Les blancs ont un fou en difficulté" + +#: pgn.cpp:1245 +msgid " Black has poor bishop placement" +msgstr " Les noirs ont un fou en difficulté" + +#: pgn.cpp:1248 +msgid " White has good bishop placement" +msgstr " Les blancs ont un fou bien placé" + +#: pgn.cpp:1251 +msgid " Black has good bishop placement" +msgstr " Les noirs ont un fou bien placé" + +#: pgn.cpp:1254 +msgid " White has poor rook placement" +msgstr " Les blancs ont une tour en difficulté" + +#: pgn.cpp:1257 +msgid " Black has poor rook placement" +msgstr " Les noirs ont une tour en difficulté" + +#: pgn.cpp:1260 +msgid " White has good rook placement" +msgstr " Les blancs ont une tour bien placé" + +#: pgn.cpp:1263 +msgid " Black has good rook placement" +msgstr " Les noirs ont une tour bien placé" + +#: pgn.cpp:1266 +msgid " White has poor queen placement" +msgstr " Les blancs ont la dame en difficulté" + +#: pgn.cpp:1269 +msgid " Black has poor queen placement" +msgstr " Les noirs ont la dame en difficulté" + +#: pgn.cpp:1272 +msgid " White has good queen placement" +msgstr " Les blancs ont la dame bien placée" + +#: pgn.cpp:1275 +msgid " Black has good queen placement" +msgstr " Les noirs ont la dame bien placée" + +#: pgn.cpp:1278 +msgid " White has poor piece coordination" +msgstr " Les blancs ont une mauvaise coordination des piéces" + +#: pgn.cpp:1281 +msgid " Black has poor piece coordination" +msgstr " Les noirs ont une mauvaise coordination des piéces" + +#: pgn.cpp:1284 +msgid " White has good piece coordination" +msgstr " Les blancs ont une bonne coordination des piéces" + +#: pgn.cpp:1287 +msgid " Black has good piece coordination" +msgstr " Les noirs ont une bonne coordination des piéces" + +#: pgn.cpp:1290 +msgid " White has played the opening very poorly" +msgstr " Les blancs ont joué une très mauvaise ouverture" + +#: pgn.cpp:1293 +msgid " Black has played the opening very poorly" +msgstr " Les noirs ont joué une très mauvaise ouverture" + +#: pgn.cpp:1296 +msgid " White has played the opening poorly" +msgstr " Les blancs ont joué une mauvaise ouverture" + +#: pgn.cpp:1299 +msgid " Black has played the opening poorly" +msgstr " Les noirs ont joué une mauvaise ouverture" + +#: pgn.cpp:1302 +msgid " White has played the opening well" +msgstr " Les blancs ont joué une bonne ouverture" + +#: pgn.cpp:1305 +msgid " Black has played the opening well" +msgstr " Les noirs ont joué une bonne ouverture" + +#: pgn.cpp:1308 +msgid " White has played the opening very well" +msgstr " Les blancs ont joué une très bonne ouverture" + +#: pgn.cpp:1311 +msgid " Black has played the opening very well" +msgstr " Les noirs ont joué une très bonne ouverture" + +#: pgn.cpp:1314 +msgid " White has played the middlegame very poorly" +msgstr " Les blancs ont joué une très mauvaise moitié de jeu" + +#: pgn.cpp:1317 +msgid " Black has played the middlegame very poorly" +msgstr " Les noirs ont joué une très mauvaise moitié de jeu" + +#: pgn.cpp:1320 +msgid " White has played the middlegame poorly" +msgstr " Les blancs ont joué une mauvaise moitié de jeu" + +#: pgn.cpp:1323 +msgid " Black has played the middlegame poorly" +msgstr " Les noirs ont joué une mauvaise moitié de jeu" + +#: pgn.cpp:1326 +msgid " White has played the middlegame well" +msgstr " Les blancs ont joué une bonne moitié de jeu" + +#: pgn.cpp:1329 +msgid " Black has played the middlegame well" +msgstr " Les noirs ont joué une bonne moitié de jeu" + +#: pgn.cpp:1332 +msgid " White has played the middlegame very well" +msgstr " Les blancs ont joué une très bonne moitié de jeu" + +#: pgn.cpp:1335 +msgid " Black has played the middlegame very well" +msgstr " Les noirs ont joué une très bonne moitié de jeu" + +#: pgn.cpp:1338 +msgid " White has played the ending very poorly" +msgstr " Les blancs ont joué une très mauvaise fin de jeu" + +#: pgn.cpp:1341 +msgid " Black has played the ending very poorly" +msgstr " Les noirs ont joué une très mauvaise fin de jeu" + +#: pgn.cpp:1344 +msgid " White has played the ending poorly" +msgstr " Les blancs ont joué une mauvaise fin de jeu" + +#: pgn.cpp:1347 +msgid " Black has played the ending poorly" +msgstr " Les noirs ont joué une mauvaise fin de jeu" + +#: pgn.cpp:1350 +msgid " White has played the ending well" +msgstr " Les blancs ont joué une bonne fin de jeu" + +#: pgn.cpp:1353 +msgid " Black has played the ending well" +msgstr " Les noirs ont joué une bonne fin de jeu" + +#: pgn.cpp:1356 +msgid " White has played the ending very well" +msgstr " Les blancs ont joué une très bonne fin de jeu" + +#: pgn.cpp:1359 +msgid " Black has played the ending very well" +msgstr " Les noirs ont joué une très bonne fin de jeu" + +#: pgn.cpp:1362 +msgid " White has slight counterplay" +msgstr " Les blancs ont fait une pauvre diversion" + +#: pgn.cpp:1365 +msgid " Black has slight counterplay" +msgstr " Les noirs ont fait une pauvre diversion" + +#: pgn.cpp:1368 +msgid " White has moderate counterplay" +msgstr " Les blancs ont fait une diversion moyenne" + +#: pgn.cpp:1371 +msgid " Black has moderate counterplay" +msgstr " Les noirs ont fait une diversion moyenne" + +#: pgn.cpp:1374 +msgid " White has decisive counterplay" +msgstr " Les blancs ont fait une diversion décisive" + +#: pgn.cpp:1377 +msgid " Black has decisive counterplay" +msgstr " Les noirs ont fait une diversion décisive" + +#: pgn.cpp:1380 +msgid " White has moderate time control pressure" +msgstr " Les blancs ne sont pas trop limités par le temps" + +#: pgn.cpp:1383 +msgid " Black has moderate time control pressure" +msgstr " Les noirs ne sont pas trop limités par le temps" + +#: pgn.cpp:1386 +msgid " White has severe time control pressure" +msgstr " Les blancs sont très limités par le temps" + +#: pgn.cpp:1389 +msgid " Black has severe time control pressure" +msgstr " Les noirs sont très limités par le temps" + +#: pgn.cpp:1391 +msgid " With the idea..." +msgstr " Avec une arriére pensée..." + +#: pgn.cpp:1394 +msgid " Aimed against..." +msgstr " Faire opposition à l'adversaire..." + +#: pgn.cpp:1397 +msgid " Better Move" +msgstr " Déplacement bénéfique" + +#: pgn.cpp:1400 +msgid " Worse Move" +msgstr " Déplacement empirique" + +#: pgn.cpp:1403 +msgid " Equivalent move" +msgstr " Déplacement équivalent" + +#: pgn.cpp:1406 +msgid " Editor's Remark" +msgstr " Commentaires" + +#: pgn.cpp:1409 +msgid " Novelty" +msgstr " Nouveauté" + +#: pgn.cpp:1412 +msgid " Weak point" +msgstr " Point faible" + +#: pgn.cpp:1415 +msgid " Endgame" +msgstr " Fin de jeu" + +#: pgn.cpp:1418 +msgid " Line" +msgstr " Ligne" + +#: pgn.cpp:1421 +msgid " Diagonal" +msgstr " Diagonale" + +#: pgn.cpp:1424 +msgid " White has a pair of Bishops" +msgstr " Les blancs ont une paire de Fous" + +#: pgn.cpp:1427 +msgid " Black has a pair of Bishops" +msgstr " Les noirs ont une paire de Fous" + +#: pgn.cpp:1430 +msgid " Bishops of opposite color" +msgstr " Fous de couleurs opposées" + +#: pgn.cpp:1433 +msgid " Bishops of same color" +msgstr " Fous de même couleur" + +#: pgn.cpp:1436 +msgid " Etc." +msgstr " Etc..." + +#: pgn.cpp:1439 +msgid " Doubled pawns" +msgstr " Pions en binôme" + +#: pgn.cpp:1442 +msgid " Isolated pawn" +msgstr " Pion isolé" + +#: pgn.cpp:1445 +msgid " Connected pawns" +msgstr " Pions liés" + +#: pgn.cpp:1448 +msgid " Hanging pawns" +msgstr " Pions à prendre" + +#: pgn.cpp:1451 +msgid " Backwards pawn" +msgstr " Pions en arriére" + +#: setpageaudio.cpp:28 +msgid "enable Audio" +msgstr "Activer l'audio" + +#: setpageaudio.cpp:36 +msgid "Audio Themes" +msgstr "Thèmes sonores" + +#: setpageaudio.cpp:47 +msgid "Volume" +msgstr "Volume" + +#: setpageaudio.cpp:48 +msgid "Maximum" +msgstr "Maximum" + +#: setpageaudio.cpp:52 +msgid "Minimum" +msgstr "Minimum" + +#: setpageaudio.cpp:55 +msgid "For Current Match Only" +msgstr "Seulement pour la partie active" + +#: setpagedisplay.cpp:74 +msgid "Board Themes" +msgstr "Thèmes pour l'échiquier" + +#: setpagedisplay.cpp:79 +msgid "Chessman Themes" +msgstr "Thèmes pour les piéces" + +#: setpagedisplay.cpp:85 +msgid "Theme Size" +msgstr "Taille du théme" + +#: setpagedisplay.cpp:88 +msgid "Small" +msgstr "Petit" + +#: setpagedisplay.cpp:95 +msgid "Large" +msgstr "Large" + +#: setpagedisplay.cpp:99 +msgid "Other Display Options" +msgstr "Autres options d'affichage" + +#: setpagedisplay.cpp:102 +msgid "Reverse Board Orientation" +msgstr "Inverser l'orientation de l'échiquier" + +#: setpagedisplay.cpp:107 +msgid "Display Startup Logo" +msgstr "Afficher le logo de démarrage." + +#: setpagedisplay.cpp:112 +msgid "Automatic Preview" +msgstr "Prévisualisation automatique des piéces" + +#: setpagedisplay.cpp:117 +msgid "Show Last Move" +msgstr "Voir le dernier mouvement" + +#: setpagedisplay.cpp:122 +msgid "Animate Moves" +msgstr "Mouvements animés" + +#: setpagedisplay.cpp:127 +msgid "Show Coordinates" +msgstr "Voir les coordonnées sur l'échiquier" + +#: setpagedisplay.cpp:161 +msgid "Restore Defaults" +msgstr "Rétablir les paramètres par défaut" + +#: setpagedisplay.cpp:165 +msgid "Standard Font..." +msgstr "Police standard..." + +#: setpagedisplay.cpp:174 +msgid "Private Font..." +msgstr "Police pour les discussions privées..." + +#: setpagedisplay.cpp:183 +msgid "Channel Font..." +msgstr "Police pour les canaux de discussions..." + +#: setpagedisplay.cpp:192 +msgid "Shout Font..." +msgstr "Police pour les appels..." + +#: setpagedisplay.cpp:201 +msgid "Whisper Font..." +msgstr "Police pour les chuchotements..." + +#: setpagedisplay.cpp:210 +msgid "Notification Font..." +msgstr "Police pour les notifications..." + +#: setpagedisplay.cpp:225 +msgid "Console" +msgstr "Console" + +#: setpagedisplay.cpp:519 +msgid "Standard" +msgstr "Standard" + +#: setpagedisplay.cpp:520 +msgid "Private Tell" +msgstr "Discussion privée" + +#: setpagedisplay.cpp:521 +msgid "Channel Tell" +msgstr "Canal de discussion" + +#: setpagedisplay.cpp:522 +msgid "Shout" +msgstr "Appel" + +#: setpagedisplay.cpp:524 +msgid "Notification" +msgstr "Notification" + +#: setpageengines.cpp:33 +msgid "Engines to Play White" +msgstr "Calculateur pour jeux d'échecs jouant avec les blancs" + +#: setpageengines.cpp:36 setpageengines.cpp:48 +msgid "enable Book Engine" +msgstr "Activer le livre de reférences" + +#: setpageengines.cpp:45 +msgid "Engines to Play Black" +msgstr "Calculateur pour jeux d'échecs jouant avec les noirs" + +#: setpageengines.cpp:57 +msgid "Chess Engines" +msgstr "Programmes d'échecs" + +#: setpageengines.cpp:62 setpageservers.cpp:69 tab_seeklist.cpp:27 +msgid "Name" +msgstr "Nom" + +#: setpageengines.cpp:64 +msgid "Wins" +msgstr "Parties gagnées" + +#: setpageengines.cpp:65 +msgid "Losses" +msgstr "Parties perdues" + +#: setpageengines.cpp:66 +msgid "Draws" +msgstr "Parties nulles" + +#: setpageengines.cpp:73 setpageservers.cpp:77 +msgid "&Add..." +msgstr "&Ajouter..." + +#: setpageengines.cpp:74 setpageservers.cpp:78 +msgid "&Modify..." +msgstr "&Modifier..." + +#: setpageengines.cpp:75 setpageservers.cpp:79 +msgid "&Delete..." +msgstr "&Supprimer..." + +#: setpagegeneral.cpp:29 +msgid "Your Name:" +msgstr "Votre nom :" + +#: setpagegeneral.cpp:36 +msgid "When Knights Begins It Should:" +msgstr "Quand le programme démarre, il doit :" + +#: setpagegeneral.cpp:38 +msgid "Do Nothing" +msgstr "Ne rien faire" + +#: setpagegeneral.cpp:39 +msgid "Start a Match vs. PC" +msgstr "Commencer une partie contre l'ordinateur" + +#: setpagegeneral.cpp:40 +msgid "Connect to ICS" +msgstr "Se connecter à un serveur Internet" + +#: setpagegeneral.cpp:48 +msgid "Save Match on Close?" +msgstr "Enregistrer la partie lors de la fermeture du programme ?" + +#: setpagegeneral.cpp:52 +msgid "Ask" +msgstr "Demander" + +#: setpagegeneral.cpp:62 +msgid "Append to Save File:" +msgstr "Enregistrement de toutes les parties dans un unique fichier PNG :" + +#: setpagegeneral.cpp:65 +msgid "Append to Save File" +msgstr "Ajouter les parties dans un fichier PNG unique" + +#: setpagegeneral.cpp:79 +msgid "Pause on Minimize" +msgstr "Mettre le chronomètre en pause lorsqu'on réduit la fenêtre" + +#: setpagegeneral.cpp:85 +msgid "Always Promote to Queen" +msgstr "Toujours promouvoir un pion pour une reine" + +#: setpagegeneral.cpp:91 +msgid "Call Flag Automatically" +msgstr "Tenir compte automatiquement du dépassement de temps (drapeau)" + +#: setpageservers.cpp:56 +msgid "Current Server" +msgstr "Serveur courant" + +#: setpageservers.cpp:70 +msgid "URL" +msgstr "Adresse Internet" + +#: setpageservers.cpp:90 +msgid "Servers" +msgstr "Serveurs" + +#: setpageservers.cpp:106 +msgid "Profanity Filter" +msgstr "Filtrage des messages" + +#: setpageservers.cpp:110 +msgid "Filter Everything" +msgstr "Filtrer tous" + +#: setpageservers.cpp:110 +msgid "No Filtering" +msgstr "Pas de filtre" + +#: setpageservers.cpp:115 +msgid "Automatically Close Previous ICS Match" +msgstr "" +"Fermer automatiquement la partie précédente avec le serveur de jeux d'échecs " +"sur Internet" + +#: setpageservers.cpp:120 +msgid "Private Matches" +msgstr "Parties en privé (non observables)" + +#: setpageservers.cpp:124 +msgid "enable Premove" +msgstr "Activer les pré-mouvements" + +#: setpageservers.cpp:128 +msgid "enable Kibitzes" +msgstr "" +"Activer les messages issus de tous les joueurs ou de tous les observateurs " +"d'une partie (Kibitz)" + +#: setpageservers.cpp:132 +msgid "enable Unregistered Tells" +msgstr "Activer les dialogues non déclarés" + +#: setpageservers.cpp:136 +msgid "enable Shouts" +msgstr "Activer les appels" + +#: setpageservers.cpp:140 +msgid "enable Seeks" +msgstr "Activer les messages de diffusion des matchs" + +#: setpageservers.cpp:150 +msgid "Seconds Between Seek Updates" +msgstr "" +"Secondes pour le rafraîchissement à l'écran de la liste des matchs dans la " +"console" + +#: tab_seeklist.cpp:29 +msgid "Match Type" +msgstr "Type de partie d'échecs" + +#: tab_seeklist.cpp:30 +msgid "Is Rated?" +msgstr "Est classifié ?" + +#: tabbox.cpp:163 +msgid "%1 - Knights" +msgstr "%1 - Knights" + +#: wiz_setup.cpp:51 +msgid "Knights Setup Wizard" +msgstr "Assistant de configuration de Knights" + +#: wiz_setup.cpp:74 +msgid "" +"Thank you for installing Knights, the graphical chess interface for KDE. To " +"help you get started quickly, there are a few things Knights will need to " +"setup. You should click 'Next' to see what they are." +msgstr "" +"Merci d'utiliser « Knights », l'interface graphique du jeu d'échecs pour " +"l'environnement de bureau KDE. Pour vous aider à démarrer rapidement le jeu, " +"cet assistant vous propose de configurer quelques options. Appuyez sur " +"« Suivant » pour continuer." + +#: wiz_setup.cpp:77 +msgid "Welcome to Knights v%1!" +msgstr "Bienvenue dans Knights v%1 !" + +#: wiz_setup.cpp:97 +msgid "" +"When Knights saves a match to disk, it uses Portable Game Notation (PGN) to " +"store the match. Several other computer chess games use PGN too. If you " +"like, Knights can be the default PGN viewer on this system." +msgstr "" +"Lorsque Knights enregistre une partie d'échecs sur un disque, il utilise le format " +"PGN (Notation Portable pour les Jeux). D'autres jeux d'échecs comme Knights " +"utilisent aussi ce format d'enregistrement. Si vous le désirez, Knights peut " +"utiliser par défaut le format PGN sur votre système." + +#: wiz_setup.cpp:100 +msgid "Let Knights handle PGN files?" +msgstr "Gestion du format PGN ?" + +#: wiz_setup.cpp:106 +msgid "Let Knights handle your .pgn files?" +msgstr "Knights doit il utiliser le format PGN ?" + +#: wiz_setup.cpp:125 +msgid "" +"Knights can not play a chess match against you without help. Known as Chess " +"Engines, these helpers can be found on the Internet and are often included " +"with your distribution. Knights can look for Chess Engines that you may " +"already have. If found, Knights will configure itself to use them." +msgstr "" +"Knights ne peut pas jouer une partie d'échecs sans aide extérieure. Pour " +"reconnaître le programme externe qui réalisera les calculs nécessaires au " +"jeu d'échecs, cet assistant vous aidera à rechercher les programmes du jeu " +"des échecs sur le réseau Internet ou sur votre système. Si Knights trouve un " +"de ces programmes, il le configurera de lui-même pour que vous puissiez l'utiliser." + +#: wiz_setup.cpp:128 wiz_setup.cpp:134 +msgid "Let Knights search for chess engines?" +msgstr "Recherche des programmes d'échecs ?" + +#: wiz_setup.cpp:153 +msgid "" +"In order for you to play chess online, Knights will have to connect to a " +"chess server. Knights has a list of several of these servers. If you like, " +"this list can be used to automatically configure Knights." +msgstr "" +"Pour pouvoir jouer au échecs en ligne, Knights devra se connecter à un " +"serveur de jeu d'échecs. Knights a une liste quelques serveurs. Si vous le " +"désirez, cette liste peut être utilisée automatiquement pour configurer " +"Knights." + +#: wiz_setup.cpp:156 wiz_setup.cpp:162 +msgid "Let Knights configure chess servers?" +msgstr "Configuration des serveurs d'échecs ?" + +#: wiz_setup.cpp:181 +msgid "" +"Knights has now configured itself according to your choices. We strongly " +"recommend that you read the documentation to make full use of all that " +"Knights has to offer. You can access it by pressing F1." +msgstr "" +"Knights est maintenant configuré en fonction de vos choix. Nous vous " +"recommendons vivement de lire la documentation du logiciel pour profiter " +"pleinement de toutes ses possiblités. Pour y accéder, vous pouvez utiliser " +"la touche F1." + +#: wiz_setup.cpp:184 +msgid "Setup Complete" +msgstr "Configuration terminée" + +#: wiz_setup.cpp:213 +msgid "Do you accept the terms of our license?" +msgstr "Acceptez vous les termes de la licence ?" + +#: wiz_setup.cpp:218 +msgid "Please read and accept our license:" +msgstr "Veuillez lire et accepter la licence :" + +#: wiz_setup.cpp:269 +msgid "Free Internet Chess Server" +msgstr "Serveur d'échecs gratuit sur Internet" + +#: wiz_setup.cpp:269 +msgid "Internet Chess Club" +msgstr "Club d'échecs sur Internet" + +#: wiz_setup.cpp:269 +msgid "Global Chess Server" +msgstr "Serveur d'échecs global" + +#: wiz_setup.cpp:269 +msgid "Chess.Net" +msgstr "Chess.Net" + +#: wiz_setup.cpp:270 +msgid "Chess-Square.Com" +msgstr "Chess-Square.Com" + +#: wiz_setup.cpp:270 +msgid "Australian FICS" +msgstr "FICS d'Australie" + +#: wiz_setup.cpp:270 +msgid "Brazilian FICS" +msgstr "FICS du Brésil" + +#: wiz_setup.cpp:270 +msgid "Chilean FICS" +msgstr "FICS du Chili" + +#: wiz_setup.cpp:271 +msgid "Croatian FICS" +msgstr "FICS de Croatie" + +#: wiz_setup.cpp:271 +msgid "Dutch FICS" +msgstr "Dutch d'Allemagne" + +#: wiz_setup.cpp:271 +msgid "French FICS" +msgstr "FICS de France" + +#: wiz_setup.cpp:271 +msgid "German FICS" +msgstr "FICS Germanique" + +#: wiz_setup.cpp:271 +msgid "Swedish FICS" +msgstr "FICS de Suéde" + +#: proto_xboard.cpp:443 +msgid "" +"%1 suggests this move:\n" +"%2" +msgstr "" +"%1 suggère ce déplacement :\n" +"%2" + +#: proto_xboard.cpp:465 proto_xboard.cpp:472 proto_xboard.cpp:479 +msgid "" +"%1 tells you:\n" +"%2" +msgstr "" +"%1 vous a envoyé ce message :\n" +"%2" + +#~ msgid "Save Game?" +#~ msgstr "Enregistrer la partie ?" + +#~ msgid "Save Game..." +#~ msgstr "Partie enregistree..." + +#~ msgid " Game paused" +#~ msgstr " Partie en pause" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "&Find" +#~ msgstr "&Rechercher" + +#~ msgid "Programmer" +#~ msgstr "Programmeur" + +#~ msgid "Red Hat Binary RPMs" +#~ msgstr "RPMs des exécutables pour RedHat" + +#~ msgid "Early Beta Testing" +#~ msgstr "Béta testeur" + +#~ msgid "Would you like to email this move?" +#~ msgstr "" +#~ "Voulez vous envoyer ce déplacement de piéce par la messagerie électronique" + +#~ msgid "Send Email?" +#~ msgstr "Envoyer le courrier ?" + +#~ msgid "Console Orientation" +#~ msgstr "Orientation de la console" + +#~ msgid "engineio" +#~ msgstr "engineio" + +#~ msgid "Knightsio" +#~ msgstr "Knightsio" + +#~ msgid "pgn" +#~ msgstr "pgn" + +#~ msgid "Server Login Failed" +#~ msgstr "La séquence d'identification au serveur a échoué" + +#~ msgid "White's Time Controls" +#~ msgstr "Paramétres temporels pour les Blancs" + +#~ msgid "Black's Time Controls" +#~ msgstr "Paramétres temporels pour les Noirs" + +#~ msgid "" +#~ "Knights can not find %1.\n" +#~ "Please make sure the address was entered correctly and that you are " +#~ "connected to the internet." +#~ msgstr "" +#~ "Knights ne peut pas trouver %1.\n" +#~ "Veuillez vérifier que l'adresse est correctement saisie et que vous êtes " +#~ "bien connecté au réseau internet." + +#~ msgid "&Solitaire Chess" +#~ msgstr "Jeu en &solitaire" + +#~ msgid "&Computer vs. Computer" +#~ msgstr "&Ordinateur contre ordinateur" + +#~ msgid "&Save Game" +#~ msgstr "&Sauvegarder la partie" + +#~ msgid "Console - Knights" +#~ msgstr "Knights - console" + +#~ msgid "High Quality" +#~ msgstr "Haute qualité" + +#~ msgid "GNUChess" +#~ msgstr "GNUChess" + +#~ msgid "Sjeng" +#~ msgstr "Sjeng" + +#~ msgid "KnightCap" +#~ msgstr "KnightCap" + +#~ msgid "BabyChess" +#~ msgstr "BabyChess" + +#~ msgid "Phalanx-XXII" +#~ msgstr "Phalanx-XXII" + +#~ msgid "Bowron Abernethy Chess Engine" +#~ msgstr "Bowron Abernethy Chess Engine" + diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..766cc02 --- /dev/null +++ b/po/it.po @@ -0,0 +1,2242 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-01-21 04:30-0600\n" +"PO-Revision-Date: 2002-11-19 16:31+0100\n" +"Last-Translator: Daniele Medri \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 0.9.6\n" + +#: accel.cpp:23 +msgid "Previous Move" +msgstr "Mossa precedente" + +#: accel.cpp:24 +msgid "Next Move" +msgstr "Mossa successiva" + +#: accel.cpp:25 +msgid "Enter Text" +msgstr "Immetti testo" + +#: accel.cpp:26 +msgid "Page Up" +msgstr "Pagina su" + +#: accel.cpp:27 +msgid "Page Down" +msgstr "Pagina giù" + +#: accel.cpp:28 +msgid "Increase Board Size" +msgstr "Incrementa dimensione scacchiera" + +#: accel.cpp:29 +msgid "Decrease Board Size" +msgstr "Diminuisci dimensione scacchiera" + +#: accel.cpp:30 +msgid "Last History Item" +msgstr "Ultima voce nella cronologia" + +#: accel.cpp:31 +msgid "Next History Item" +msgstr "Prossima voce nella cronologia" + +#: accel.cpp:32 +msgid "Reply to the Last Tell" +msgstr "Rispondi all'ultimo comunicato" + +#: accel.cpp:33 +msgid "Reply to the Channel" +msgstr "Rispondi in canale" + +#: accel.cpp:34 +msgid "Kibitz" +msgstr "Kibitz" + +#: accel.cpp:35 setpagedisplay.cpp:523 +msgid "Whisper" +msgstr "Bisbiglio" + +#: challenge_graph.cpp:75 tab_seeklist.cpp:40 +msgid "Seek Matches" +msgstr "Ricerca partite" + +#: challenge_graph.cpp:77 tab_seeklist.cpp:42 +msgid "Accept This Match" +msgstr "Accetta questa partita" + +#: challenge_graph.cpp:78 tab_seeklist.cpp:43 +msgid "Tell..." +msgstr "Comunica..." + +#: challenge_graph.cpp:79 tab_seeklist.cpp:44 +msgid "Assess..." +msgstr "Valutazione..." + +#: challenge_graph.cpp:80 tab_seeklist.cpp:45 +msgid "Player Info" +msgstr "Informazioni giocatore" + +#: challenge_graph.cpp:82 tab_seeklist.cpp:47 +msgid "Player History" +msgstr "Storico giocatore" + +#: challenge_graph.cpp:84 tab_seeklist.cpp:49 +msgid "Add to Friends" +msgstr "Aggiungi agli amici" + +#: challenge_graph.cpp:85 tab_seeklist.cpp:50 +msgid "Ignore This Player" +msgstr "Ignora questo giocatore" + +#: challenge_graph.cpp:304 tab_seeklist.cpp:28 +msgid "Rating" +msgstr "Valutazione" + +#: challenge_graph.cpp:311 +msgid "Time" +msgstr "Tempo" + +#: challenge_graph_view.cpp:105 +msgid " Name: %1 Rating: %2 Match Type: %3 %4 Base Time: %5 Increment: %6" +msgstr "" +" Nome: %1 Punteggio: %2 Tipo di partita: %3 %4 Tempo base: %5 Incremento: %6" + +#: core.cpp:385 +msgid "Hint" +msgstr "Suggerimento" + +#: core.cpp:388 +msgid "Tell User" +msgstr "Comunica all'utente" + +#: core.cpp:391 +msgid "Tell User Error" +msgstr "Comunica l'errore dell'utente" + +#: core.cpp:397 +msgid "Tell Opponent" +msgstr "Comunica all'avversario" + +#: core.cpp:411 +msgid "Tell All" +msgstr "Comunica a tutti" + +#: core.cpp:646 +#, fuzzy +msgid "Load PGN..." +msgstr "Carica gioco..." + +#: core.cpp:690 +#, fuzzy +msgid "Would you like to save this match?" +msgstr "Desideri salvare questa partita?" + +#: core.cpp:691 +#, fuzzy +msgid "Save Match?" +msgstr "&Salva partita" + +#: core.cpp:710 +#, fuzzy +msgid "Save Match..." +msgstr "S&alva partita come..." + +#: dlg_challenge.cpp:25 +msgid "You've Been Challenged:" +msgstr "Sei stato sfidato:" + +#: dlg_challenge.cpp:29 +msgid "Accept" +msgstr "Accetta" + +#: dlg_challenge.cpp:30 +msgid "Decline" +msgstr "Declina" + +#: dlg_challenge.cpp:49 +msgid "Time Odds Match" +msgstr "" + +#: dlg_challenge.cpp:53 +msgid "Unrated" +msgstr "Non classificato" + +#: dlg_challenge.cpp:54 +msgid "Rated" +msgstr "Classificato" + +#: dlg_challenge.cpp:60 dlg_challenge.cpp:69 dlg_newmatch.cpp:87 +#: dlg_newmatch.cpp:104 tab_seeklist.cpp:101 +msgid " min." +msgstr " min." + +#: dlg_challenge.cpp:61 dlg_challenge.cpp:70 dlg_newmatch.cpp:97 +#: dlg_newmatch.cpp:114 setpageservers.cpp:146 tab_seeklist.cpp:102 +msgid " sec." +msgstr " secondi." + +#: dlg_challenge.cpp:62 dlg_challenge.cpp:71 tab_seeklist.cpp:31 +msgid "Base Time" +msgstr "Tempo base" + +#: dlg_challenge.cpp:63 dlg_challenge.cpp:72 tab_seeklist.cpp:32 +msgid "Increment" +msgstr "Incremento" + +#: dlg_challenge.cpp:109 +msgid "" +"%1 %2 vs. %3 %4\n" +"in a %5 match." +msgstr "" +"%1 %2 contro %3 %4\n" +"in una %5 partita." + +#: dlg_challenge.cpp:124 dlg_challenge.cpp:125 +msgid "Time Controls" +msgstr "Controlli dei tempi" + +#: dlg_challenge.cpp:154 +msgid "Counter Offer" +msgstr "" + +#: dlg_engine.cpp:26 +msgid "Configure Engine" +msgstr "Configura engine" + +#: dlg_engine.cpp:38 +msgid "Engine Name" +msgstr "Nome engine" + +#: dlg_engine.cpp:43 setpageengines.cpp:63 +msgid "Protocol" +msgstr "Protocollo" + +#: dlg_engine.cpp:48 +msgid "Engine Filename" +msgstr "Nome file engine" + +#: dlg_engine.cpp:54 +msgid "Command Line Arguments" +msgstr "Argomenti della riga dei comandi" + +#: dlg_engine.cpp:59 dlg_server.cpp:88 +msgid "Log File" +msgstr "File log" + +#: dlg_login.cpp:21 +msgid "Login Prompt" +msgstr "Prompt di accesso" + +#: dlg_login.cpp:31 +msgid "Login:" +msgstr "Login:" + +#: dlg_login.cpp:32 +msgid "Password:" +msgstr "Password:" + +#: dlg_login.cpp:38 +msgid "Log in as guest" +msgstr "Autenticati come \"guest\"" + +#: dlg_login.cpp:54 +msgid "Login" +msgstr "Login" + +#: dlg_login.cpp:54 +msgid "Log in to the chess server using this name and password." +msgstr "Autenticati in questo server degli scacchi con questo nome e password." + +#: dlg_newmatch.cpp:38 +msgid "Start a New Match" +msgstr "Avvia una nuova partita" + +#: dlg_newmatch.cpp:45 +msgid "White" +msgstr "Bianco" + +#: dlg_newmatch.cpp:46 +msgid "Black" +msgstr "Nero" + +#: dlg_newmatch.cpp:59 dlg_newmatch.cpp:66 +msgid "Human" +msgstr "Umano" + +#: dlg_newmatch.cpp:60 dlg_newmatch.cpp:67 +msgid "Computer" +msgstr "Computer" + +#: dlg_newmatch.cpp:61 dlg_newmatch.cpp:68 +msgid "Email" +msgstr "Posta elettronica" + +#: dlg_newmatch.cpp:85 dlg_newmatch.cpp:102 +msgid "Base Time:" +msgstr "Tempo base:" + +#: dlg_newmatch.cpp:90 dlg_newmatch.cpp:107 +msgid "Moves Per Base Time" +msgstr "Mosse per il tempo base" + +#: dlg_newmatch.cpp:92 dlg_newmatch.cpp:109 +msgid " moves" +msgstr " mosse" + +#: dlg_newmatch.cpp:95 dlg_newmatch.cpp:112 +msgid "Increment Per Move" +msgstr "Incremento per mossa" + +#: dlg_promote.cpp:94 +msgid "Promote your pawn to..." +msgstr "Promuovi i tuoi pedini a..." + +#: dlg_promote.cpp:101 +msgid "Pawn Promotion" +msgstr "Promozione pedini" + +#: dlg_selectemail.cpp:27 +msgid "Select Email Address" +msgstr "Seleziona indirizzo di posta elettronica" + +#: dlg_selectengine.cpp:30 +msgid "Select Computer Player" +msgstr "Seleziona il computer come giocatore" + +#: dlg_selectengine.cpp:41 +msgid "Computer Players" +msgstr "Computer avversario" + +#: dlg_selectengine.cpp:61 +msgid "Player Strength" +msgstr "Esperienza giocatore" + +#: dlg_selectengine.cpp:63 +msgid "Weak" +msgstr "Debole" + +#: dlg_selectengine.cpp:70 +msgid "Strong" +msgstr "Forte" + +#: dlg_server.cpp:25 +msgid "Configure Server" +msgstr "Configura server" + +#: dlg_server.cpp:37 +msgid "Server Name" +msgstr "Nome server" + +#: dlg_server.cpp:44 +msgid "Server URL" +msgstr "URL del server" + +#: dlg_server.cpp:49 +msgid "Server Port" +msgstr "Porta server" + +#: dlg_server.cpp:56 +msgid "Username" +msgstr "Nome utente" + +#: dlg_server.cpp:59 +msgid "Remember My Password" +msgstr "Ricorda la mia password" + +#: dlg_server.cpp:64 +msgid "Password" +msgstr "Password" + +#: dlg_server.cpp:71 +msgid "Confirm Password" +msgstr "Conferma password" + +#: dlg_server.cpp:79 +msgid "Timeseal" +msgstr "Timeseal" + +#: dlg_settings.cpp:48 setpagedisplay.cpp:142 +msgid "General" +msgstr "Generale" + +#: dlg_settings.cpp:49 +msgid "Various aspects of Knights get configured here." +msgstr "Vari aspetti di Knights possono essere configurati qui." + +#: dlg_settings.cpp:55 +msgid "Display" +msgstr "Visualizzazione" + +#: dlg_settings.cpp:56 +msgid "These settings determine how Knights displays itself to you." +msgstr "Queste configurazioni determinano l'aspetto di Knights." + +#: dlg_settings.cpp:62 +msgid "Audio" +msgstr "Audio" + +#: dlg_settings.cpp:63 +msgid "These settings determine what Knights sounds like." +msgstr "Queste impostazioni determineranno come saranno gli effetti sonori." + +#: dlg_settings.cpp:69 +msgid "Computer Opponents" +msgstr "Computer avversario" + +#: dlg_settings.cpp:70 +msgid "Configure your chess engines here." +msgstr "Configura qui il tuo engine di scacchi." + +#: dlg_settings.cpp:76 setpageservers.cpp:65 +msgid "Chess Servers" +msgstr "Server per gli scacchi" + +#: dlg_settings.cpp:77 +msgid "Configure your internet chess servers here." +msgstr "Configura qui il tuo server internet per gli scacchi." + +#: io_internet.cpp:80 +msgid "" +"There are no servers configured.\n" +"Please make sure you have at least one server configured." +msgstr "" +"Knights non può avviare il Timeseal.\n" +"Per piacere, assicurati di avere il percorso corretto e il nome file " +"configurati." + +#: io_internet.cpp:80 +msgid "Cannot find a server." +msgstr "Non è possibile trovare il server." + +#: io_internet.cpp:99 +msgid "" +"Knights can not start Timeseal.\n" +"Please make sure you have the correct path and filename configured." +msgstr "" +"Knights non può avviare il Timeseal.\n" +"Per piacere, assicurati di avere il percorso corretto e il nome file " +"configurati." + +#: io_internet.cpp:99 +msgid "Cannot find Timeseal." +msgstr "Non è possibile trovare il Timeseal." + +#: io_internet.cpp:109 io_internet.cpp:121 +msgid "" +"Knights is unable to connect to the server.\n" +" Please make sure your internet connection is working and try again." +msgstr "" +"Knights non può collegarsi a questo server. Per piacere, controlla il tuo " +"username e la tua password prima di riprovare nuovamente." + +#: io_internet.cpp:109 io_internet.cpp:121 +msgid "Cannot connect to server." +msgstr "Non è possibile collegarsi al server." + +#: io_internet.cpp:144 +msgid "%1 Console" +msgstr "Console %1" + +#: io_internet.cpp:149 +#, fuzzy +msgid "Sought Matches List" +msgstr "Lista dei giochi richiesti" + +#: io_internet.cpp:154 +#, fuzzy +msgid "Sought Matches Graph" +msgstr "Grafico dei giochi richiesti" + +#: knights.cpp:70 main.cpp:34 +msgid "Knights" +msgstr "Knights" + +#: knights.cpp:250 +msgid "&Draw" +msgstr "&Patta" + +#: knights.cpp:254 +msgid "&Retract Move" +msgstr "&Ritira la mossa" + +#: knights.cpp:256 +msgid "Select this to retract your last move." +msgstr "Seleziona questo per ritrarre l'ultima mossa." + +#: knights.cpp:258 +msgid "Resign" +msgstr "Abbandona" + +#: knights.cpp:260 +msgid "Use this to concede the match to your opponent." +msgstr "Utilizza questo per concedere la partita al tuo avversario." + +#: knights.cpp:262 +msgid "&Call Flag" +msgstr "&Chiama bandiera" + +#: knights.cpp:264 +#, fuzzy +msgid "" +"Use this to declare the match over, due to your opponent being out of time." +msgstr "" +"Utilizza questo per dichiarare il termine del gioco, visto che l'avversario " +"è andato fuori tempo." + +#: knights.cpp:266 +msgid "&Hint" +msgstr "&Suggerimento" + +#: knights.cpp:268 +msgid "This will ask your opponent for a hint." +msgstr "Questo chiederà al tuo avversario un suggerimento." + +#: knights.cpp:270 +msgid "Move &Now" +msgstr "Muovi &ora" + +#: knights.cpp:272 +msgid "Clicking this option will force your opponent to move immediately." +msgstr "" +"Selezionando questa opzione forzerai l'avversario a muovere immediatamente." + +#: knights.cpp:274 +msgid "&Flip View" +msgstr "&Inverti la scacchiera" + +#: knights.cpp:276 +msgid "This will reverse the chessboard's orientation by 180 degrees." +msgstr "Questa opzione invertirà la scacchiera di 180 gradi." + +#: knights.cpp:278 +msgid "&Ponder" +msgstr "&Pondera" + +#: knights.cpp:281 +msgid "This toggles your opponent's ability to think while it's your turn." +msgstr "" +"Questo dà al tuo avversario la possibilità di pensare durante il tuo turno." + +#: knights.cpp:285 knights.cpp:949 +msgid "Pause" +msgstr "Pausa" + +#: knights.cpp:287 +msgid "Select this to pause the clock for this match." +msgstr "" +"Seleziona questa opzione per mettere in pausa l'orologio per la partita." + +#: knights.cpp:292 +msgid "&Offer Draw" +msgstr "&Offri la patta" + +#: knights.cpp:293 +#, fuzzy +msgid "" +"Clicking this will inform your opponent that you are willing draw the match." +msgstr "" +"Cliccando qui informerai il tuo avversario che stai per ritirarti dal gioco." + +#: knights.cpp:295 +msgid "&Accept Draw" +msgstr "&Accetta la patta" + +#: knights.cpp:296 +msgid "Clicking this will accept a draw offered by your opponent." +msgstr "Cliccando qui accetterai un ritiro offerto dal tuo avversario." + +#: knights.cpp:298 +msgid "&Reject Draw" +msgstr "&Rifiuta la patta" + +#: knights.cpp:299 +msgid "Clicking this will reject a draw offered by your opponent." +msgstr "Cliccando qui rifiuterai un ritiro offerto dal tuo avversario." + +#: knights.cpp:301 +msgid "&Ignore Draw" +msgstr "&Ignora la patta" + +#: knights.cpp:302 +msgid "Clicking this will ignore future draw offers from your opponent." +msgstr "Cliccando qui ignorerai futuri ritiri offerti dai tuoi avversari." + +#: knights.cpp:308 +msgid "&New Match..." +msgstr "&Nuova partita..." + +#: knights.cpp:309 +msgid "This allows you to begin a new match." +msgstr "Questo ti permette di iniziare una nuova partita." + +#: knights.cpp:312 +msgid "&Load Match..." +msgstr "&Carica partita..." + +#: knights.cpp:313 +#, fuzzy +msgid "" +"The Load command will allow you to select a previously saved match and play " +"it again." +msgstr "" +"Il comando Apri ti permette di selezionare un gioco precedentemente salvato " +"e riutilizzarlo." + +#: knights.cpp:316 thinbuttons.cpp:40 +msgid "&Close Match" +msgstr "&Chiudi partita" + +#: knights.cpp:318 +msgid "This command removes the current match." +msgstr "Questo comando rimuove la partita attuale." + +#: knights.cpp:320 +msgid "Close All" +msgstr "Chiudi tutto" + +#: knights.cpp:322 +msgid "This command will remove all matches that are currently loaded." +msgstr "Questo comando rimuoverà tutte le partite attualmente caricate." + +#: knights.cpp:326 thinbuttons.cpp:32 +msgid "&Save Match" +msgstr "&Salva partita" + +#: knights.cpp:328 knights.cpp:333 +#, fuzzy +msgid "" +"The Save command will allow you to store a copy of your current match for " +"later use." +msgstr "" +"Il comando Salva ti permette di memorizzare una copia del gioco attuale per " +"un utilizzo successivo." + +#: knights.cpp:331 thinbuttons.cpp:34 +msgid "Save Match &As..." +msgstr "S&alva partita come..." + +#: knights.cpp:337 knights.cpp:859 +msgid "Connect to Server" +msgstr "Connessione al server" + +#: knights.cpp:338 +msgid "Clicking this will connect Knights with an internet chess server." +msgstr "" +"Cliccando qui collegherai Knights con un server di scacchi su Internet." + +#: knights.cpp:342 thinbuttons.cpp:37 +msgid "&Print Notation..." +msgstr "Stam&pa notazione..." + +#: knights.cpp:344 +msgid "" +"The Print command will allow you to print this game's notation on your " +"printer." +msgstr "" +"Il comando Stampa ti permette di stampare la notazione del gioco tramite la " +"stampante." + +#: knights.cpp:349 +#, fuzzy +msgid "The Quit command will stop all matches and exit Knights." +msgstr "Il comando Esci terminerà il gioco attuale e uscirà da Knights." + +#: knights.cpp:355 +msgid "Play &White" +msgstr "Gioca come &Bianco" + +#: knights.cpp:358 +msgid "" +"If checked, this option tells Knights that you will play as the White army " +"when you play vs. the computer." +msgstr "" +"Se attivata, questa opzione dice a Knights che utilizzerai gli scacchi " +"Bianchi quando giocherai contro il computer." + +#: knights.cpp:360 +msgid "Play &Black" +msgstr "Gioca come &Nero" + +#: knights.cpp:363 +msgid "" +"If checked, this option tells Knights that you will play as the Black army " +"when you play vs. the computer." +msgstr "" +"Se attivata, questa opzione dice a Knights che utilizzerai gli scacchi Neri " +"per giocare contro il computer." + +#: knights.cpp:366 +msgid "&Install Themes" +msgstr "&Installa temi" + +#: knights.cpp:367 +msgid "This lets you install downloaded themes into Knights." +msgstr "Questo ti permette di installare temi in Knights." + +#: knights.cpp:371 +msgid "" +"Click this if you want to change the keyboard shortcuts that Knights uses." +msgstr "" +"Clicca questo se vuoi cambiare le scorciatoie della tastiera che utilizza " +"Knights." + +#: knights.cpp:374 +msgid "&Configure Knights..." +msgstr "&Configura Knights..." + +#: knights.cpp:375 +msgid "" +"This opens a new window which allows you to customize Knights to your " +"particular tastes." +msgstr "" +"Questo apre una nuova finestra la quale permette di personalizzare Knights " +"secondo le personali preferenze." + +#: knights.cpp:381 +msgid "Begin a Tutorial" +msgstr "Incomincia un tutorial" + +#: knights.cpp:387 +msgid "&Match" +msgstr "&Partita" + +#: knights.cpp:576 +#, fuzzy +msgid "Error with white engine" +msgstr " Errore con l'engine Bianco" + +#: knights.cpp:578 +msgid "" +"You selected %1 to play white,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play white." +msgstr "" +"Hai selezionato %1 per giocare come bianco,\n" +"ma può essere utilizzato unicamente come book engine.\n" +"Per favore seleziona un'altro engine per giocare con i Bianchi." + +#: knights.cpp:579 +msgid "White Engine Problem" +msgstr "Problema con l'engine dei Bianchi" + +#: knights.cpp:582 +#, fuzzy +msgid "Error with white book engine" +msgstr " Errore con il book engine bianco" + +#: knights.cpp:584 +msgid "" +"You selected %1 to play white's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play white's book." +msgstr "" +"Hai selezionato %1 per giocare con il libro bianco,\n" +"ma può essere utilizzato unicamente come un engine regolare.\n" +"Per favore seleziona un'altro engine per giocare con il libro bianco." + +#: knights.cpp:585 +msgid "White Book Engine Problem" +msgstr "Problema con l'engine del libro bianco" + +#: knights.cpp:588 +#, fuzzy +msgid "Error with black engine" +msgstr " Errore con l'engine nero" + +#: knights.cpp:590 +msgid "" +"You selected %1 to play black,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play black." +msgstr "" +"Hai selezionato %1 per giocare come nero,\n" +"ma può essere utilizzato unicamente come un book engine.\n" +"Per favore seleziona un'altro engine per giocare con i Neri." + +#: knights.cpp:591 +msgid "Black Engine Problem" +msgstr "Problema con l'engine nero" + +#: knights.cpp:594 +#, fuzzy +msgid "Error with black book engine" +msgstr " Errore con il book engine nero" + +#: knights.cpp:596 +msgid "" +"You selected %1 to play black's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play black's book." +msgstr "" +"Hai selezionato %1 per giocare con il libro dei Neri,\n" +"ma può essere utilizzato unicamente come engine regolare.\n" +"Per favore seleziona un'altro engine per giocare con il libro dei Neri." + +#: knights.cpp:597 +msgid "Black Book Engine Problem" +msgstr "Problema con il book engine nero" + +#: knights.cpp:600 +#, fuzzy +msgid "The computer opponent assigned to play %1 has crashed" +msgstr "" +" Il computer avversario assegnato per giocare come %1 è andato in crash" + +#: knights.cpp:603 +#, fuzzy +msgid "There was an error while loading the file" +msgstr " C'è stato un errore durante il caricamento del file" + +#: knights.cpp:606 +#, fuzzy +msgid "There was an error while saving the file" +msgstr " C'è stato un errore salvando il file" + +#: knights.cpp:610 +#, fuzzy +msgid "Loading complete" +msgstr " Caricamento completato" + +#: knights.cpp:613 +#, fuzzy +msgid "Saving complete" +msgstr " Salvataggio completato" + +#: knights.cpp:616 +#, fuzzy +msgid "Reading File" +msgstr " Lettura file in corso" + +#: knights.cpp:619 +#, fuzzy +msgid "Can not move a chessman while reviewing the match" +msgstr " Non è possibile muovere uno scacco mentre si rivede un gioco" + +#: knights.cpp:622 +#, fuzzy +msgid "Illegal Move" +msgstr " Mossa illegale" + +#: knights.cpp:625 +#, fuzzy +msgid "White's turn" +msgstr " Turno dei Bianchi" + +#: knights.cpp:628 +#, fuzzy +msgid "Black's turn" +msgstr " Turno dei Neri" + +#: knights.cpp:631 +#, fuzzy +msgid "White wins" +msgstr " i Bianchi vincono" + +#: knights.cpp:634 +#, fuzzy +msgid "Black wins" +msgstr " i Neri vincono" + +#: knights.cpp:637 +#, fuzzy +msgid "Checkmate, White wins" +msgstr " Scacco matto, i Bianchi vincono" + +#: knights.cpp:640 +#, fuzzy +msgid "Checkmate, Black wins" +msgstr " Scacco matto, i Neri vincono" + +#: knights.cpp:643 +#, fuzzy +msgid "White resigns" +msgstr " I Bianchi abbandonano" + +#: knights.cpp:646 +#, fuzzy +msgid "Black resigns" +msgstr " I Neri abbandonano" + +#: knights.cpp:649 +#, fuzzy +msgid "White's flag fell" +msgstr " Caduta bandiera Bianchi" + +#: knights.cpp:652 +#, fuzzy +msgid "Black's flag fell" +msgstr " Caduta bandiera Neri" + +#: knights.cpp:655 +#, fuzzy +msgid "Black's flag was called, White wins" +msgstr " Presentata la bandiera dei Neri, i Bianchi vincono" + +#: knights.cpp:658 +#, fuzzy +msgid "White's flag was called, Black wins" +msgstr " Presentata bandiera dei Bianchi, i Neri vincono" + +#: knights.cpp:661 +#, fuzzy +msgid "Draw match" +msgstr "Ritiro dal gioco" + +#: knights.cpp:664 +#, fuzzy +msgid "50 moves rule, draw match" +msgstr " regola delle 50 mosse, abbandono gioco" + +#: knights.cpp:667 +#, fuzzy +msgid "Starting computer players, please wait" +msgstr " Avvio in corso dei computer avversari, attendere per favore" + +#: knights.cpp:670 +#, fuzzy +msgid "Match paused" +msgstr "Tipo di partita" + +#: knights.cpp:673 +#, fuzzy +msgid "White has offered a draw" +msgstr " I Bianchi hanno offerto la patta" + +#: knights.cpp:676 +#, fuzzy +msgid "Black has offered a draw" +msgstr " I Neri hanno offerto la patta" + +#: knights.cpp:679 +#, fuzzy +msgid "Lost contact with opponent" +msgstr " Perso il contatto con l'avversario" + +#: knights.cpp:682 +#, fuzzy +msgid "Ready" +msgstr " Pronto" + +#: knights.cpp:866 +msgid "Disconnect from Server" +msgstr "Disconnetti dal server" + +#: knights.cpp:955 +msgid "Resume" +msgstr "Ripristina" + +#: knights.cpp:1014 +msgid "Knights Themes" +msgstr "Temi di Knights" + +#: knights.cpp:1015 +msgid "Install Theme..." +msgstr "Installa nuovo tema..." + +#: knights.cpp:1045 +msgid "" +"You do not have permission to install this theme systemwide, so Knights " +"installed it locally." +msgstr "" +"Non hai i permessi per installare questo tema nel sistema, per tale motivo " +"sarà installato localmente." + +#: knights.cpp:1046 +msgid "Installed theme locally" +msgstr "Installato il tema localmente" + +#: knights.cpp:1051 +#, c-format +msgid "" +"The theme could not be installed:\n" +"%1" +msgstr "" +"Il tema non può essere installato:\n" +"%1" + +#: knights.cpp:1052 +msgid "Can not install theme" +msgstr "Non è possibile installare il tema" + +#: knightstextview.cpp:35 +msgid "Select &All" +msgstr "Seleziona t&utto" + +#: knightstextview.cpp:44 +msgid "Zoom &In" +msgstr "Zoom &avanti" + +#: knightstextview.cpp:46 +msgid "Zoom &Out" +msgstr "Zoom &indietro" + +#: list_pgn.cpp:29 list_pgn.cpp:48 +msgid "Result" +msgstr "Risultato" + +#: list_pgn.cpp:30 list_pgn.cpp:49 +msgid "Title" +msgstr "Titolo" + +#: list_pgn.cpp:31 list_pgn.cpp:50 +msgid "Round" +msgstr "Turno" + +#: list_pgn.cpp:32 list_pgn.cpp:51 +msgid "Site" +msgstr "Sito" + +#: list_pgn.cpp:33 list_pgn.cpp:52 +msgid "Date" +msgstr "Data" + +#: list_pgn.cpp:81 +#, c-format +msgid "Can not open %1" +msgstr "Impossibile aprire %1" + +#: list_pgn.cpp:140 +msgid "%1 matches found." +msgstr "%1 partite trovate." + +#: main.cpp:26 +msgid "Specify the location of your Knights data directory." +msgstr "Specifica la posizone della directory dati di Knights." + +#: main.cpp:27 +msgid "A .pgn file to be loaded." +msgstr "Un file .pgn per essere caricato." + +#: main.cpp:36 +msgid "" +"The Knights Chess Interface\n" +"\n" +"Knights is a chess interface\n" +"for the K Desktop Environment." +msgstr "" +"Knights: interfaccia grafica per il gioco degli scacchi\n" +"\n" +"Knights è un'interfaccia per il gioco degli scacchi\n" +"per l'ambiente desktop KDE." + +#: main.cpp:44 +msgid "Project Manager and Programmer" +msgstr "Capo progetto e programmatore" + +#: main.cpp:48 +msgid "Communications Programmer" +msgstr "Programmatore delle comunicazioni" + +#: main.cpp:52 +msgid "Qtopia port and patches" +msgstr "Port di Qtopia e patch" + +#: main.cpp:56 +msgid "Patches and suggestions" +msgstr "Patch e suggerimenti" + +#: main.cpp:60 +msgid "KDE3 Compatability Patch" +msgstr "Patch per la compatibilità con KDE3" + +#: main.cpp:64 +msgid "XBoard protocol" +msgstr "Protocollo XBoard" + +#: _translatorinfo.cpp:1 main.cpp:67 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "Daniele Medri" + +#: _translatorinfo.cpp:3 main.cpp:68 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "madrid@linuxmeeting.net" + +#: match_param.cpp:107 +msgid "Unknown" +msgstr "Sconosciuto" + +#: pgn.cpp:145 +msgid "%1 vs. %2" +msgstr "%1 contro %2" + +#: pgn.cpp:943 +#, c-format +msgid "Page %1" +msgstr "Pagina %1" + +#: pgn.cpp:975 +msgid " Good move" +msgstr " Buona mossa" + +#: pgn.cpp:978 +msgid " Poor move" +msgstr " Mossa debole" + +#: pgn.cpp:981 +msgid " Very good move" +msgstr " Mossa ottima" + +#: pgn.cpp:984 +msgid " Very poor move" +msgstr " Mossa debolissima" + +#: pgn.cpp:987 +msgid " Speculative move" +msgstr " Mossa stravagante" + +#: pgn.cpp:990 +msgid " Questionable move" +msgstr " Mossa dubbia" + +#: pgn.cpp:993 +msgid " Forced move" +msgstr " Mossa forzata" + +#: pgn.cpp:996 +msgid " Singular move" +msgstr " Mossa singolare" + +#: pgn.cpp:999 +msgid " Worst move" +msgstr " Mossa pessima" + +#: pgn.cpp:1002 +msgid " Drawish position" +msgstr " Posizione di ritiro" + +#: pgn.cpp:1005 +msgid " Equal chances, quiet position" +msgstr "Uguali possibilità, posizione calma" + +#: pgn.cpp:1008 +msgid " Equal chances, active position" +msgstr "Uguali possibilità, posizione attiva" + +#: pgn.cpp:1011 +msgid " Unclear position" +msgstr " Posizione non chiara" + +#: pgn.cpp:1014 +msgid " White has a slight advantage" +msgstr " i Bianchi hanno un vantaggio esiguo" + +#: pgn.cpp:1017 +msgid " Black has a slight advantage" +msgstr " i Neri hanno un vantaggio esiguo" + +#: pgn.cpp:1020 +msgid " White has a moderate advantage" +msgstr " i Bianchi hanno un moderato vantaggio" + +#: pgn.cpp:1023 +msgid " Black has a moderate advantage" +msgstr " i Neri hanno un moderato vantaggio" + +#: pgn.cpp:1026 +msgid " White has a decisive advantage" +msgstr " I Bianchi hanno un vantaggio decisivo" + +#: pgn.cpp:1029 +msgid " Black has a decisive advantage" +msgstr " I Neri hanno un vantaggio decisivo" + +#: pgn.cpp:1032 +msgid " White has a crushing advantage ( Black should resign )" +msgstr "" +" i Bianchi hanno un vantaggio schiacciante (i Neri dovrebbero abbandonare)" + +#: pgn.cpp:1035 +msgid " Black has a crushing advantage ( White should resign )" +msgstr "" +" i Neri hanno un vantaggio schiacciante (i Bianchi dovrebbero abbandonare)" + +#: pgn.cpp:1038 +msgid " White is in zugzwang" +msgstr " i Bianchi sono in zugzwang" + +#: pgn.cpp:1041 +msgid " Black is in zugzwang" +msgstr " i Neri sono in zugzwang" + +#: pgn.cpp:1044 +msgid " White has a slight space advantage" +msgstr " i Bianchi hanno uno spazio di vantaggio esiguo" + +#: pgn.cpp:1047 +msgid " Black has a slight space advantage" +msgstr " i Neri hanno uno spazio di vantaggio esiguo" + +#: pgn.cpp:1050 +msgid " White has a moderate space advantage" +msgstr " i Bianchi hanno un moderato spazio di vantaggio" + +#: pgn.cpp:1053 +msgid " Black has a moderate space advantage" +msgstr " i Neri hanno un moderato spazio di vantaggio" + +#: pgn.cpp:1056 +msgid " White has a decisive space advantage" +msgstr " i Bianchi hanno un decisivo spazio di vantaggio" + +#: pgn.cpp:1059 +msgid " Black has a decisive space advantage" +msgstr " i Neri hanno un decisivo spazio di vantaggio" + +#: pgn.cpp:1062 +msgid " White has a slight time ( development ) advantage" +msgstr " i Bianchi hanno un esiguo (sviluppo) vantaggio di tempo" + +#: pgn.cpp:1065 +msgid " Black has a slight time ( development ) advantage" +msgstr " i Neri hanno un esiguo (sviluppo) vantaggio di tempo" + +#: pgn.cpp:1068 +msgid " White has a moderate time ( development ) advantage" +msgstr " i Bianchi hanno un moderato (sviluppo) vantaggio di tempo" + +#: pgn.cpp:1071 +msgid " Black has a moderate time ( development ) advantage" +msgstr " i Neri hanno un moderato (sviluppo) vantaggio di tempo" + +#: pgn.cpp:1074 +msgid " White has a decisive time ( development ) advantage" +msgstr " i Bianchi hanno un decisivo (sviluppo) vantaggio di tempo" + +#: pgn.cpp:1077 +msgid " Black has a decisive time ( development ) advantage" +msgstr " i Neri hanno un decisivo (sviluppo) vantaggio di tempo" + +#: pgn.cpp:1080 +msgid " White has the initiative" +msgstr "i Bianchi hanno l'iniziativa" + +#: pgn.cpp:1083 +msgid " Black has the initiative" +msgstr " i Neri hanno l'iniziativa" + +#: pgn.cpp:1086 +msgid " White has a lasting initiative" +msgstr " i Bianchi hanno un'iniziativa duratura" + +#: pgn.cpp:1089 +msgid " Black has a lasting initiative" +msgstr " i Neri hanno un'iniziativa duratura" + +#: pgn.cpp:1092 +msgid " White has the attack" +msgstr " I Bianchi hanno l'attacco" + +#: pgn.cpp:1095 +msgid " Black has the attack" +msgstr " I Neri hanno l'attacco" + +#: pgn.cpp:1098 +msgid " White has insufficient compensation for material deficit" +msgstr "" +" i Bianchi hanno un'insufficiente compensazione per la perdita dei pezzi" + +#: pgn.cpp:1101 +msgid " Black has insufficient compensation for material deficit" +msgstr " i Neri hanno un'insufficiente compensazione per la perdita dei pezzi" + +#: pgn.cpp:1104 +msgid " White has sufficient compensation for material deficit" +msgstr "" +" i Bianchi hanno una sufficiente compensazione per la perdita dei pezzi" + +#: pgn.cpp:1107 +msgid " Black has sufficient compensation for material deficit" +msgstr " i Neri hanno una sufficiente compensazione per la perdita dei pezzi" + +#: pgn.cpp:1110 +msgid " White has more than adequate compensation for material deficit" +msgstr "" +" i Bianchi hanno più che adeguata compensazione per la perdita dei pezzi" + +#: pgn.cpp:1113 +msgid " Black has more than adequate compensation for material deficit" +msgstr " i Neri hanno più che adeguata compensazione per la perdita dei pezzi" + +#: pgn.cpp:1116 +msgid " White has a slight center control advantage" +msgstr " i Bianchi hanno un esile vantaggio sul controllo centrale" + +#: pgn.cpp:1119 +msgid " Black has a slight center control advantage" +msgstr " i Neri hanno un esile vantaggio sul controllo centrale" + +#: pgn.cpp:1122 +msgid " White has a moderate center control advantage" +msgstr " i Bianchi hanno un moderato vantaggio sul controllo centrale" + +#: pgn.cpp:1125 +msgid " Black has a moderate center control advantage" +msgstr " i Neri hanno un moderato vantaggio sul controllo centrale" + +#: pgn.cpp:1128 +msgid " White has a decisive center control advantage" +msgstr " i Bianchi hanno un decisivo vantaggio sul controllo centrale" + +#: pgn.cpp:1131 +msgid " Black has a decisive center control advantage" +msgstr " i Neri hanno un decisivo vantaggio sul controllo centrale" + +#: pgn.cpp:1134 +msgid " White has a slight kingside control advantage" +msgstr " i Bianchi hanno un esile vantaggio sul controllo lato Rè" + +#: pgn.cpp:1137 +msgid " Black has a slight kingside control advantage" +msgstr " i Neri hanno un esile vantaggio sul controllo lato Rè" + +#: pgn.cpp:1140 +msgid " White has a moderate kingside control advantage" +msgstr " i Bianchi hanno un moderato vantaggio sul controllo lato Rè" + +#: pgn.cpp:1143 +msgid " Black has a moderate kingside control advantage" +msgstr " i Neri hanno un moderato vantaggio sul controllo lato Rè" + +#: pgn.cpp:1146 +msgid " White has a decisive kingside control advantage" +msgstr " i Bianchi hanno un decisivo vantaggio sul controllo lato Rè" + +#: pgn.cpp:1149 +msgid " Black has a decisive kingside control advantage" +msgstr " i Neri hanno un decisivo vantaggio sul controllo lato Rè" + +#: pgn.cpp:1152 +msgid " White has a slight queenside control advantage" +msgstr " i Bianchi hanno un esiguo vantaggio sul controllo lato Regina" + +#: pgn.cpp:1155 +msgid " Black has a slight queenside control advantage" +msgstr " i Neri hanno un esiguo vantaggio sul controllo lato Regina" + +#: pgn.cpp:1158 +msgid " White has a moderate queenside control advantage" +msgstr " i Bianchi hanno un moderato vantaggio sul controllo lato Regina" + +#: pgn.cpp:1161 +msgid " Black has a moderate queenside control advantage" +msgstr " i Neri hanno un moderato vantaggio sul controllo lato Regina" + +#: pgn.cpp:1164 +msgid " White has a decisive queenside control advantage" +msgstr " i Bianchi hanno un decisivo vantaggio sul controllo lato Regina" + +#: pgn.cpp:1167 +msgid " Black has a decisive queenside control advantage" +msgstr " i Neri hanno un decisivo vantaggio sul controllo lato Regina" + +#: pgn.cpp:1170 +msgid " White has a vulnerable first rank" +msgstr " i Bianchi hanno le prime case vulnerabili" + +#: pgn.cpp:1173 +msgid " Black has a vulnerable first rank" +msgstr " i Neri hanno le prime case vulnerabili" + +#: pgn.cpp:1176 +msgid " White has a well protected first rank" +msgstr " i Bianchi hanno le prime case ben protette" + +#: pgn.cpp:1179 +msgid " Black has a well protected first rank" +msgstr " i Neri hanno le prime case ben protette" + +#: pgn.cpp:1182 +msgid " White has a poorly protected king" +msgstr " i Bianchi hanno il Rè scarsamente protetto" + +#: pgn.cpp:1185 +msgid " Black has a poorly protected king" +msgstr " i Neri hanno il Rè scarsamente protetto" + +#: pgn.cpp:1188 +msgid " White has a well protected king" +msgstr " i Bianchi hanno il Rè ben protetto" + +#: pgn.cpp:1191 +msgid " Black has a well protected king" +msgstr " i Neri hanno il Rè ben protetto" + +#: pgn.cpp:1194 +msgid " White has a poorly placed king" +msgstr " i Bianchi hanno il Rè posizionato male" + +#: pgn.cpp:1197 +msgid " Black has a poorly placed king" +msgstr " i Neri hanno il Rè posizionato male" + +#: pgn.cpp:1200 +msgid " White has a well placed king" +msgstr " i Bianchi hanno il Rè posizionato bene" + +#: pgn.cpp:1203 +msgid " Black has a well placed king" +msgstr " i Neri hanno il Rè posizionato bene" + +#: pgn.cpp:1206 +msgid " White has a very weak pawn structure" +msgstr " i Bianchi hanno una struttura dei pedini veramente resistente" + +#: pgn.cpp:1209 +msgid " Black has a very weak pawn structure" +msgstr " i Neri hanno una struttura dei pedini veramente resistente" + +#: pgn.cpp:1212 +msgid " White has a moderately weak pawn structure" +msgstr " i Bianchi hanno una struttura dei pedini moderatamente debole" + +#: pgn.cpp:1215 +msgid " Black has a moderately weak pawn structure" +msgstr " i Neri hanno una struttura dei pedini moderatamente debole" + +#: pgn.cpp:1218 +msgid " White has a moderately strong pawn structure" +msgstr " i Bianchi hanno una struttura dei pedini moderatamente forte" + +#: pgn.cpp:1221 +msgid " Black has a moderately strong pawn structure" +msgstr " i Neri hanno una struttura dei pedini moderatamente forte" + +#: pgn.cpp:1224 +msgid " White has a very strong pawn structure" +msgstr " i Bianchi hanno una struttura dei pedini veramente forte" + +#: pgn.cpp:1227 +msgid " Black has a very strong pawn structure" +msgstr " i Neri hanno una struttura dei pedini veramente forte" + +#: pgn.cpp:1230 +msgid " White has poor knight placement" +msgstr " i Bianchi hanno posizionato il Rè in maniera povera" + +#: pgn.cpp:1233 +msgid " Black has poor knight placement" +msgstr " i Neri hanno posizionato il Rè in maniera povera" + +#: pgn.cpp:1236 +msgid " White has good knight placement" +msgstr " i Bianchi hanno posizionato il Rè in maniera buona" + +#: pgn.cpp:1239 +msgid " Black has good knight placement" +msgstr " i Neri hanno posizionato il Rè in maniera buona" + +#: pgn.cpp:1242 +msgid " White has poor bishop placement" +msgstr " i Bianchi hanno posizionato l'Alfiere in maniera povera" + +#: pgn.cpp:1245 +msgid " Black has poor bishop placement" +msgstr " i Neri hanno posizionato l'Alfiere in maniera povera" + +#: pgn.cpp:1248 +msgid " White has good bishop placement" +msgstr " i Bianchi hanno posizionato l'Alfiere in maniera buona" + +#: pgn.cpp:1251 +msgid " Black has good bishop placement" +msgstr " i Neri hanno posizionato l'Alfiere in maniera buona" + +#: pgn.cpp:1254 +msgid " White has poor rook placement" +msgstr " i Bianchi hanno posizionato la Torre in maniera debole" + +#: pgn.cpp:1257 +msgid " Black has poor rook placement" +msgstr " i Neri hanno posizionato la Torre in maniera debole" + +#: pgn.cpp:1260 +msgid " White has good rook placement" +msgstr " i Bianchi hanno posizionato la Torre in maniera buona" + +#: pgn.cpp:1263 +msgid " Black has good rook placement" +msgstr " i Neri hanno posizionato la Torre in maniera buona" + +#: pgn.cpp:1266 +msgid " White has poor queen placement" +msgstr " i Bianchi hanno posizionato la Regina in maniera debole" + +#: pgn.cpp:1269 +msgid " Black has poor queen placement" +msgstr " i Neri hanno posizionato la Regina in maniera debole" + +#: pgn.cpp:1272 +msgid " White has good queen placement" +msgstr " i Bianchi hanno posizionato la Regina in maniera buona" + +#: pgn.cpp:1275 +msgid " Black has good queen placement" +msgstr " i Neri hanno posizionato la Regina in maniera buona" + +#: pgn.cpp:1278 +msgid " White has poor piece coordination" +msgstr " i Bianchi hanno una debole coordinazione del pezzo" + +#: pgn.cpp:1281 +msgid " Black has poor piece coordination" +msgstr " i Neri hanno una debole coordinazione del pezzo" + +#: pgn.cpp:1284 +msgid " White has good piece coordination" +msgstr " i Bianchi hanno una buona coordinazione del pezzo" + +#: pgn.cpp:1287 +msgid " Black has good piece coordination" +msgstr " i Neri hanno una buona coordinazione del pezzo" + +#: pgn.cpp:1290 +msgid " White has played the opening very poorly" +msgstr " i Bianchi hanno giocato molto male nell'apertura" + +#: pgn.cpp:1293 +msgid " Black has played the opening very poorly" +msgstr " i Neri hanno giocato molto male nell'apertura" + +#: pgn.cpp:1296 +msgid " White has played the opening poorly" +msgstr " i Bianchi hanno giocato male nell'apertura" + +#: pgn.cpp:1299 +msgid " Black has played the opening poorly" +msgstr " i Neri hanno giocato male nell'apertura" + +#: pgn.cpp:1302 +msgid " White has played the opening well" +msgstr " i Bianchi hanno giocato bene nell'apertura" + +#: pgn.cpp:1305 +msgid " Black has played the opening well" +msgstr " i Neri hanno giocato bene nell'apertura" + +#: pgn.cpp:1308 +msgid " White has played the opening very well" +msgstr " i Bianchi hanno giocato molto bene nell'apertura" + +#: pgn.cpp:1311 +msgid " Black has played the opening very well" +msgstr " i Neri hanno giocato molto bene nell'apertura" + +#: pgn.cpp:1314 +msgid " White has played the middlegame very poorly" +msgstr " i Bianchi hanno giocato molto male nel medio gioco" + +#: pgn.cpp:1317 +msgid " Black has played the middlegame very poorly" +msgstr " i Neri hanno giocato molto male nel medio gioco" + +#: pgn.cpp:1320 +msgid " White has played the middlegame poorly" +msgstr " i Bianchi hanno giocato male nel medio gioco" + +#: pgn.cpp:1323 +msgid " Black has played the middlegame poorly" +msgstr " i Neri hanno giocato male nel medio gioco" + +#: pgn.cpp:1326 +msgid " White has played the middlegame well" +msgstr " i Bianchi hanno giocato bene nel medio gioco" + +#: pgn.cpp:1329 +msgid " Black has played the middlegame well" +msgstr " i Neri hanno giocato bene nel medio gioco" + +#: pgn.cpp:1332 +msgid " White has played the middlegame very well" +msgstr " i Bianchi hanno giocato molto bene nel medio gioco" + +#: pgn.cpp:1335 +msgid " Black has played the middlegame very well" +msgstr " i Neri hanno giocato molto bene nel medio gioco" + +#: pgn.cpp:1338 +msgid " White has played the ending very poorly" +msgstr " i Bianchi hanno giocato molto male verso la fine" + +#: pgn.cpp:1341 +msgid " Black has played the ending very poorly" +msgstr " i Neri hanno giocato molto male verso la fine" + +#: pgn.cpp:1344 +msgid " White has played the ending poorly" +msgstr " i Bianchi hanno giocato male verso la fine" + +#: pgn.cpp:1347 +msgid " Black has played the ending poorly" +msgstr " i Neri hanno giocato male verso la fine" + +#: pgn.cpp:1350 +msgid " White has played the ending well" +msgstr " i Bianchi hanno giocato bene verso la fine" + +#: pgn.cpp:1353 +msgid " Black has played the ending well" +msgstr " i Neri hanno giocato bene verso la fine" + +#: pgn.cpp:1356 +msgid " White has played the ending very well" +msgstr " i Bianchi hanno giocato molto bene verso la fine" + +#: pgn.cpp:1359 +msgid " Black has played the ending very well" +msgstr " i Neri hanno giocato molto bene verso la fine" + +#: pgn.cpp:1362 +msgid " White has slight counterplay" +msgstr " i Bianchi hanno un esiguo contrattacco" + +#: pgn.cpp:1365 +msgid " Black has slight counterplay" +msgstr " i Neri hanno un esiguo contrattacco" + +#: pgn.cpp:1368 +msgid " White has moderate counterplay" +msgstr " i Bianchi hanno un moderato contrattacco" + +#: pgn.cpp:1371 +msgid " Black has moderate counterplay" +msgstr " i Neri hanno un moderato contrattacco" + +#: pgn.cpp:1374 +msgid " White has decisive counterplay" +msgstr " i Bianchi hanno un decisivo contrattacco" + +#: pgn.cpp:1377 +msgid " Black has decisive counterplay" +msgstr " i Neri hanno un decisivo contrattacco" + +#: pgn.cpp:1380 +msgid " White has moderate time control pressure" +msgstr "" + +#: pgn.cpp:1383 +msgid " Black has moderate time control pressure" +msgstr "" + +#: pgn.cpp:1386 +msgid " White has severe time control pressure" +msgstr "" + +#: pgn.cpp:1389 +msgid " Black has severe time control pressure" +msgstr "" + +#: pgn.cpp:1391 +msgid " With the idea..." +msgstr " Con l'idea..." + +#: pgn.cpp:1394 +msgid " Aimed against..." +msgstr " Puntato contro..." + +#: pgn.cpp:1397 +msgid " Better Move" +msgstr " Mossa migliore" + +#: pgn.cpp:1400 +msgid " Worse Move" +msgstr " Pessima mossa" + +#: pgn.cpp:1403 +msgid " Equivalent move" +msgstr " Mossa equivalente" + +#: pgn.cpp:1406 +msgid " Editor's Remark" +msgstr "Osservazione dell'editore" + +#: pgn.cpp:1409 +msgid " Novelty" +msgstr " Novità" + +#: pgn.cpp:1412 +msgid " Weak point" +msgstr " Punto debole" + +#: pgn.cpp:1415 +msgid " Endgame" +msgstr " Fine gioco" + +#: pgn.cpp:1418 +msgid " Line" +msgstr " Linea" + +#: pgn.cpp:1421 +msgid " Diagonal" +msgstr " Diagonale" + +#: pgn.cpp:1424 +msgid " White has a pair of Bishops" +msgstr " i Bianchi hanno una coppia di Alfieri" + +#: pgn.cpp:1427 +msgid " Black has a pair of Bishops" +msgstr " i Neri hanno una coppia di Alfieri" + +#: pgn.cpp:1430 +msgid " Bishops of opposite color" +msgstr " Alfieri del colore opposto" + +#: pgn.cpp:1433 +msgid " Bishops of same color" +msgstr "Alfieri dello stesso colore" + +#: pgn.cpp:1436 +msgid " Etc." +msgstr " Ecc." + +#: pgn.cpp:1439 +msgid " Doubled pawns" +msgstr " Pedini doppi" + +#: pgn.cpp:1442 +msgid " Isolated pawn" +msgstr " Pedino isolato" + +#: pgn.cpp:1445 +msgid " Connected pawns" +msgstr " Pedini collegati" + +#: pgn.cpp:1448 +msgid " Hanging pawns" +msgstr " Pedini sospesi" + +#: pgn.cpp:1451 +msgid " Backwards pawn" +msgstr " Pedino arretrato" + +#: setpageaudio.cpp:28 +msgid "enable Audio" +msgstr "Attiva l'audio" + +#: setpageaudio.cpp:36 +msgid "Audio Themes" +msgstr "Temi sonori" + +#: setpageaudio.cpp:47 +msgid "Volume" +msgstr "Volume" + +#: setpageaudio.cpp:48 +msgid "Maximum" +msgstr "Massimo" + +#: setpageaudio.cpp:52 +msgid "Minimum" +msgstr "Minimo" + +#: setpageaudio.cpp:55 +msgid "For Current Match Only" +msgstr "Unicamente per la partita corrente" + +#: setpagedisplay.cpp:74 +msgid "Board Themes" +msgstr "Temi della scacchiera" + +#: setpagedisplay.cpp:79 +msgid "Chessman Themes" +msgstr "Tema degli scacchi" + +#: setpagedisplay.cpp:85 +msgid "Theme Size" +msgstr "Dimensione tema" + +#: setpagedisplay.cpp:88 +msgid "Small" +msgstr "Piccolo" + +#: setpagedisplay.cpp:95 +msgid "Large" +msgstr "Grande" + +#: setpagedisplay.cpp:99 +msgid "Other Display Options" +msgstr "Ulteriori opzioni relative all'aspetto" + +#: setpagedisplay.cpp:102 +msgid "Reverse Board Orientation" +msgstr "Inverti la scacchiera" + +#: setpagedisplay.cpp:107 +msgid "Display Startup Logo" +msgstr "Mostra logo all'avvio" + +#: setpagedisplay.cpp:112 +msgid "Automatic Preview" +msgstr "Anteprima automatica" + +#: setpagedisplay.cpp:117 +msgid "Show Last Move" +msgstr "Mostra l'ultima mossa" + +#: setpagedisplay.cpp:122 +msgid "Animate Moves" +msgstr "Anima le mosse" + +#: setpagedisplay.cpp:127 +msgid "Show Coordinates" +msgstr "Mostra le coordinate" + +#: setpagedisplay.cpp:161 +msgid "Restore Defaults" +msgstr "Ripristina valori predefiniti" + +#: setpagedisplay.cpp:165 +msgid "Standard Font..." +msgstr "Carattere predefinito..." + +#: setpagedisplay.cpp:174 +msgid "Private Font..." +msgstr "Carattere privato..." + +#: setpagedisplay.cpp:183 +msgid "Channel Font..." +msgstr "Carattere canale..." + +#: setpagedisplay.cpp:192 +msgid "Shout Font..." +msgstr "Carattere dell'urlo..." + +#: setpagedisplay.cpp:201 +msgid "Whisper Font..." +msgstr "Carattere del bisbiglio..." + +#: setpagedisplay.cpp:210 +msgid "Notification Font..." +msgstr "Carattere notifica..." + +#: setpagedisplay.cpp:225 +msgid "Console" +msgstr "Console" + +#: setpagedisplay.cpp:519 +msgid "Standard" +msgstr "Standard" + +#: setpagedisplay.cpp:520 +msgid "Private Tell" +msgstr "Comunicazione privata" + +#: setpagedisplay.cpp:521 +msgid "Channel Tell" +msgstr "Comunicazione in canale" + +#: setpagedisplay.cpp:522 +msgid "Shout" +msgstr "Urlo" + +#: setpagedisplay.cpp:524 +msgid "Notification" +msgstr "Notifica" + +#: setpageengines.cpp:33 +msgid "Engines to Play White" +msgstr "Motori per giocare come Bianchi" + +#: setpageengines.cpp:36 setpageengines.cpp:48 +msgid "enable Book Engine" +msgstr "Attiva libri di sistema" + +#: setpageengines.cpp:45 +msgid "Engines to Play Black" +msgstr "Motori per giocare come Neri" + +#: setpageengines.cpp:57 +msgid "Chess Engines" +msgstr "Motori scacchistici" + +#: setpageengines.cpp:62 setpageservers.cpp:69 tab_seeklist.cpp:27 +msgid "Name" +msgstr "Nome" + +#: setpageengines.cpp:64 +msgid "Wins" +msgstr "Vinte" + +#: setpageengines.cpp:65 +msgid "Losses" +msgstr "Perse" + +#: setpageengines.cpp:66 +msgid "Draws" +msgstr "Ritiri" + +#: setpageengines.cpp:73 setpageservers.cpp:77 +msgid "&Add..." +msgstr "&Aggiungi..." + +#: setpageengines.cpp:74 setpageservers.cpp:78 +msgid "&Modify..." +msgstr "&Modifica..." + +#: setpageengines.cpp:75 setpageservers.cpp:79 +msgid "&Delete..." +msgstr "&Elimina..." + +#: setpagegeneral.cpp:29 +msgid "Your Name:" +msgstr "Il vostro nome:" + +#: setpagegeneral.cpp:36 +msgid "When Knights Begins It Should:" +msgstr "Quando Knights è avviato:" + +#: setpagegeneral.cpp:38 +msgid "Do Nothing" +msgstr "Non far nulla" + +#: setpagegeneral.cpp:39 +msgid "Start a Match vs. PC" +msgstr "Avvia una partita contro il PC" + +#: setpagegeneral.cpp:40 +msgid "Connect to ICS" +msgstr "Collegati a ICS" + +#: setpagegeneral.cpp:48 +msgid "Save Match on Close?" +msgstr "Salvare le partite in chiusura?" + +#: setpagegeneral.cpp:52 +msgid "Ask" +msgstr "Chiedi" + +#: setpagegeneral.cpp:62 +msgid "Append to Save File:" +msgstr "Aggiungere informazioni al file:" + +#: setpagegeneral.cpp:65 +msgid "Append to Save File" +msgstr "Aggiungere al file" + +#: setpagegeneral.cpp:79 +msgid "Pause on Minimize" +msgstr "Metti in pausa quando minimizzato" + +#: setpagegeneral.cpp:85 +msgid "Always Promote to Queen" +msgstr "Promuovi sempre la regina" + +#: setpagegeneral.cpp:91 +msgid "Call Flag Automatically" +msgstr "Chiama bandiera automaticamente" + +#: setpageservers.cpp:56 +msgid "Current Server" +msgstr "Server corrente" + +#: setpageservers.cpp:70 +msgid "URL" +msgstr "URL" + +#: setpageservers.cpp:90 +msgid "Servers" +msgstr "Server" + +#: setpageservers.cpp:106 +msgid "Profanity Filter" +msgstr "Filtro di profanity" + +#: setpageservers.cpp:110 +msgid "Filter Everything" +msgstr "Filtra qualsiasi cosa" + +#: setpageservers.cpp:110 +msgid "No Filtering" +msgstr "Nessun filtro" + +#: setpageservers.cpp:115 +msgid "Automatically Close Previous ICS Match" +msgstr "Chiudi automaticamente la precedente partita ICS" + +#: setpageservers.cpp:120 +msgid "Private Matches" +msgstr "Partite private" + +#: setpageservers.cpp:124 +msgid "enable Premove" +msgstr "Mosse anticipate" + +#: setpageservers.cpp:128 +msgid "enable Kibitzes" +msgstr "Attiva Kibitzes" + +#: setpageservers.cpp:132 +msgid "enable Unregistered Tells" +msgstr "Attiva commenti non registrati" + +#: setpageservers.cpp:136 +msgid "enable Shouts" +msgstr "Attiva urli" + +#: setpageservers.cpp:140 +msgid "enable Seeks" +msgstr "Attiva ricerche" + +#: setpageservers.cpp:150 +msgid "Seconds Between Seek Updates" +msgstr "Secondi tra gli aggiornamenti della ricerca" + +#: tab_seeklist.cpp:29 +msgid "Match Type" +msgstr "Tipo di partita" + +#: tab_seeklist.cpp:30 +msgid "Is Rated?" +msgstr "E' classificato?" + +#: tabbox.cpp:163 +msgid "%1 - Knights" +msgstr "%1 - Knights" + +#: wiz_setup.cpp:51 +msgid "Knights Setup Wizard" +msgstr "Configurazione guidata di Knights" + +#: wiz_setup.cpp:74 +msgid "" +"Thank you for installing Knights, the graphical chess interface for KDE. To " +"help you get started quickly, there are a few things Knights will need to " +"setup. You should click 'Next' to see what they are." +msgstr "" +"Vi ringraziamo per aver installato Knights, l'applicazione per giocare a " +"scacchi per KDE. Per aiutarvi in una partenza rapida, ci sono alcune cose " +"che Knights deve configurare. Premete il pulsante 'Successivo' per inserire " +"le informazioni richieste. Se preferite configurare da soli Knights, premete " +"il pulsante 'Annulla'." + +#: wiz_setup.cpp:77 +msgid "Welcome to Knights v%1!" +msgstr "Benvenuto in Knights v%1!" + +#: wiz_setup.cpp:97 +#, fuzzy +msgid "" +"When Knights saves a match to disk, it uses Portable Game Notation (PGN) to " +"store the match. Several other computer chess games use PGN too. If you " +"like, Knights can be the default PGN viewer on this system." +msgstr "" +"Quando Knights un gioco sul disco, utilizza il formato Portable Game " +"Notation (PGN). Moltissimi altri programmi di scacchi per computer " +"utilizzano PGN. Se desideri,Knights può essere il visualizzatore predefinito " +"su questo sistema per PGN." + +#: wiz_setup.cpp:100 +msgid "Let Knights handle PGN files?" +msgstr "Lasciate gestire a Knights i file PGN?" + +#: wiz_setup.cpp:106 +msgid "Let Knights handle your .pgn files?" +msgstr "Lascia che Knights gestisca i tuoi file .pgn?" + +#: wiz_setup.cpp:125 +#, fuzzy +msgid "" +"Knights can not play a chess match against you without help. Known as Chess " +"Engines, these helpers can be found on the Internet and are often included " +"with your distribution. Knights can look for Chess Engines that you may " +"already have. If found, Knights will configure itself to use them." +msgstr "" +"Knights non può giocare un gioco di scacchi contro te senza aiuto. " +"Conosciuti come motori scacchistici, questi aiuti possono essere trovati su " +"Internet e sono spesso inclusi con la tua distribuzione. Knights può cercare " +"automaticamente se li hai installati. Una volta trovati, Knights li " +"configurerà per l'utilizzo." + +#: wiz_setup.cpp:128 wiz_setup.cpp:134 +msgid "Let Knights search for chess engines?" +msgstr "Ricerca automatica di sistemi scacchistici?" + +#: wiz_setup.cpp:153 +msgid "" +"In order for you to play chess online, Knights will have to connect to a " +"chess server. Knights has a list of several of these servers. If you like, " +"this list can be used to automatically configure Knights." +msgstr "" +"Per giocare a scacchi online, Knights deve collegarsi ad un server per gli " +"scacchi. Knights ha una lista con alcuni di questi. Se desideri, questa " +"lista può essere utilizzata per configurare automaticamente Knights." + +#: wiz_setup.cpp:156 wiz_setup.cpp:162 +msgid "Let Knights configure chess servers?" +msgstr "Configurazione automatica dei server?" + +#: wiz_setup.cpp:181 +msgid "" +"Knights has now configured itself according to your choices. We strongly " +"recommend that you read the documentation to make full use of all that " +"Knights has to offer. You can access it by pressing F1." +msgstr "" +"Knights è stato configurato secondo le tue preferenze. Ti raccomandiamo di " +"leggere la documentazione per poter utilizzare a pieno ciò che Knights " +"offre. Puoi visualizzarla ora premento il tasto F1." + +#: wiz_setup.cpp:184 +msgid "Setup Complete" +msgstr "Impostazioni completate" + +#: wiz_setup.cpp:213 +msgid "Do you accept the terms of our license?" +msgstr "Accetti i termini della nostra licenza?" + +#: wiz_setup.cpp:218 +msgid "Please read and accept our license:" +msgstr "Per piacere, leggi e accetta la nostra licenza:" + +#: wiz_setup.cpp:269 +msgid "Free Internet Chess Server" +msgstr "Free Internet Chess Server" + +#: wiz_setup.cpp:269 +msgid "Internet Chess Club" +msgstr "Internet Chess Club" + +#: wiz_setup.cpp:269 +msgid "Global Chess Server" +msgstr "Global Chess Server" + +#: wiz_setup.cpp:269 +msgid "Chess.Net" +msgstr "Chess.Net" + +#: wiz_setup.cpp:270 +msgid "Chess-Square.Com" +msgstr "Chess-Square.Com" + +#: wiz_setup.cpp:270 +msgid "Australian FICS" +msgstr "FICS Australiano" + +#: wiz_setup.cpp:270 +msgid "Brazilian FICS" +msgstr "FICS Brasiliano" + +#: wiz_setup.cpp:270 +msgid "Chilean FICS" +msgstr "FICS Cileno" + +#: wiz_setup.cpp:271 +msgid "Croatian FICS" +msgstr "FICS Croato" + +#: wiz_setup.cpp:271 +msgid "Dutch FICS" +msgstr "FICS Olandese" + +#: wiz_setup.cpp:271 +msgid "French FICS" +msgstr "FICS Francese" + +#: wiz_setup.cpp:271 +msgid "German FICS" +msgstr "FICS Tedesco" + +#: wiz_setup.cpp:271 +msgid "Swedish FICS" +msgstr "FICS Svedese" + +#: proto_xboard.cpp:443 +msgid "" +"%1 suggests this move:\n" +"%2" +msgstr "" +"%1 suggerisce questa mossa:\n" +"%2" + +#: proto_xboard.cpp:465 proto_xboard.cpp:472 proto_xboard.cpp:479 +msgid "" +"%1 tells you:\n" +"%2" +msgstr "" +"%1 dice:\n" +"%2" + +#~ msgid "Save Game?" +#~ msgstr "Salva gioco?" + +#~ msgid "Save Game..." +#~ msgstr "Salva gioco..." + +#~ msgid " Game paused" +#~ msgstr " Gioco in pausa" + +#~ msgid "Hint:" +#~ msgstr "Suggerimento:" + +#~ msgid "Server Login Failed" +#~ msgstr "Autenticazione al server fallita" + +#~ msgid "White's Time Controls" +#~ msgstr "Controlli dei tempi per i Bianchi" + +#~ msgid "Black's Time Controls" +#~ msgstr "Controlli dei tempi per i Neri" + +#~ msgid "" +#~ "Knights can not find %1.\n" +#~ "Please make sure the address was entered correctly and that you are " +#~ "connected to the internet." +#~ msgstr "" +#~ "Knights non può trovare %1.\n" +#~ "Per piacere, assicurati che l'indirizzo era stato inserito correttamente " +#~ "e che sei attualmente collegato a Internet." + +#~ msgid "&Solitaire Chess" +#~ msgstr "Scacchi &solitari" + +#~ msgid "&Computer vs. Computer" +#~ msgstr "&Computer contro computer" + +#~ msgid "&Save Game" +#~ msgstr "&Salva partita" + +#~ msgid "Console - Knights" +#~ msgstr "Console - Knights" + +#~ msgid "Red Hat Binary RPMs" +#~ msgstr "Pacchetti RPM per Red Hat" + +#~ msgid "Early Beta Testing" +#~ msgstr "Iniziali fase di beta test" + +#~ msgid "Would you like to email this move?" +#~ msgstr "Desideri inviare tramite posta elettronica questa mossa?" + +#~ msgid "Send Email?" +#~ msgstr "Invia posta elettronica?" + +#~ msgid "High Quality" +#~ msgstr "Alta qualità" + +#~ msgid "Console Orientation" +#~ msgstr "Orientamento console" + +#~ msgid "GNUChess" +#~ msgstr "GNUChess" + +#~ msgid "Crafty" +#~ msgstr "Crafty" + +#~ msgid "BabyChess" +#~ msgstr "BabyChess" + +#~ msgid "pgn" +#~ msgstr "pgn" diff --git a/po/knights.pot b/po/knights.pot new file mode 100644 index 0000000..29f36d3 --- /dev/null +++ b/po/knights.pot @@ -0,0 +1,2048 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2003-03-02 12:02-0600\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: setpageengines.cpp:33 +msgid "Engines to Play White" +msgstr "" + +#: setpageengines.cpp:36 setpageengines.cpp:48 +msgid "Enable Book Engine" +msgstr "" + +#: setpageengines.cpp:45 +msgid "Engines to Play Black" +msgstr "" + +#: setpageengines.cpp:57 +msgid "Chess Engines" +msgstr "" + +#: setpageengines.cpp:62 setpageservers.cpp:69 tab_seeklist.cpp:27 +msgid "Name" +msgstr "" + +#: setpageengines.cpp:63 dlg_engine.cpp:43 +msgid "Protocol" +msgstr "" + +#: setpageengines.cpp:64 +msgid "Wins" +msgstr "" + +#: setpageengines.cpp:65 +msgid "Losses" +msgstr "" + +#: setpageengines.cpp:66 +msgid "Draws" +msgstr "" + +#: setpageengines.cpp:73 setpageservers.cpp:77 +msgid "&Add..." +msgstr "" + +#: setpageengines.cpp:74 setpageservers.cpp:78 +msgid "&Modify..." +msgstr "" + +#: setpageengines.cpp:75 setpageservers.cpp:79 +msgid "&Delete..." +msgstr "" + +#: setpageservers.cpp:56 +msgid "Current Server" +msgstr "" + +#: setpageservers.cpp:65 dlg_settings.cpp:76 +msgid "Chess Servers" +msgstr "" + +#: setpageservers.cpp:70 +msgid "URL" +msgstr "" + +#: setpageservers.cpp:90 +msgid "Servers" +msgstr "" + +#: setpageservers.cpp:106 +msgid "Profanity Filter" +msgstr "" + +#: setpageservers.cpp:110 +msgid "Filter Everything" +msgstr "" + +#: setpageservers.cpp:110 +msgid "No Filtering" +msgstr "" + +#: setpageservers.cpp:115 +msgid "Automatically Close Previous ICS Match" +msgstr "" + +#: setpageservers.cpp:120 +msgid "Private Matches" +msgstr "" + +#: setpageservers.cpp:124 +msgid "Enable Premove" +msgstr "" + +#: setpageservers.cpp:128 +msgid "Enable Kibitzes" +msgstr "" + +#: setpageservers.cpp:132 +msgid "Enable Unregistered Tells" +msgstr "" + +#: setpageservers.cpp:136 +msgid "Enable Shouts" +msgstr "" + +#: setpageservers.cpp:140 +msgid "Enable Seeks" +msgstr "" + +#: setpageservers.cpp:146 dlg_newmatch.cpp:97 dlg_newmatch.cpp:114 +#: tab_seeklist.cpp:102 dlg_challenge.cpp:61 dlg_challenge.cpp:70 +msgid " sec." +msgstr "" + +#: setpageservers.cpp:150 +msgid "Seconds Between Seek Updates" +msgstr "" + +#: wiz_setup.cpp:51 +msgid "Knights Setup Wizard" +msgstr "" + +#: wiz_setup.cpp:74 +msgid "" +"Thank you for installing Knights, the graphical chess interface for KDE. To " +"help you get started quickly, there are a few things Knights will need to " +"setup. You should click 'Next' to see what they are." +msgstr "" + +#: wiz_setup.cpp:77 +msgid "Welcome to Knights v%1!" +msgstr "" + +#: wiz_setup.cpp:97 +msgid "" +"When Knights saves a match to disk, it uses Portable Game Notation (PGN) to " +"store the match. Several other computer chess games use PGN too. If you " +"like, Knights can be the default PGN viewer on this system." +msgstr "" + +#: wiz_setup.cpp:100 +msgid "Let Knights handle PGN files?" +msgstr "" + +#: wiz_setup.cpp:106 +msgid "Let Knights handle your .pgn files?" +msgstr "" + +#: wiz_setup.cpp:125 +msgid "" +"Knights can not play a chess match against you without help. Known as Chess " +"Engines, these helpers can be found on the Internet and are often included " +"with your distribution. Knights can look for Chess Engines that you may " +"already have. If found, Knights will configure itself to use them." +msgstr "" + +#: wiz_setup.cpp:128 wiz_setup.cpp:134 +msgid "Let Knights search for chess engines?" +msgstr "" + +#: wiz_setup.cpp:153 +msgid "" +"In order for you to play chess online, Knights will have to connect to a " +"chess server. Knights has a list of several of these servers. If you like, " +"this list can be used to automatically configure Knights." +msgstr "" + +#: wiz_setup.cpp:156 wiz_setup.cpp:162 +msgid "Let Knights configure chess servers?" +msgstr "" + +#: wiz_setup.cpp:181 +msgid "" +"Knights has now configured itself according to your choices. We strongly " +"recommend that you read the documentation to make full use of all that " +"Knights has to offer. You can access it by pressing F1." +msgstr "" + +#: wiz_setup.cpp:184 +msgid "Setup Complete" +msgstr "" + +#: wiz_setup.cpp:213 +msgid "Do you accept the terms of our license?" +msgstr "" + +#: wiz_setup.cpp:218 +msgid "Please read and accept our license:" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Free Internet Chess Server" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Internet Chess Club" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Global Chess Server" +msgstr "" + +#: wiz_setup.cpp:269 +msgid "Chess.Net" +msgstr "" + +#: wiz_setup.cpp:270 +msgid "Chess-Square.Com" +msgstr "" + +#: wiz_setup.cpp:270 +msgid "Australian FICS" +msgstr "" + +#: wiz_setup.cpp:270 +msgid "Brazilian FICS" +msgstr "" + +#: wiz_setup.cpp:270 +msgid "Chilean FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "Croatian FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "Dutch FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "French FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "German FICS" +msgstr "" + +#: wiz_setup.cpp:271 +msgid "Swedish FICS" +msgstr "" + +#: knights.cpp:70 main.cpp:34 +msgid "Knights" +msgstr "" + +#: knights.cpp:247 +msgid "&Draw" +msgstr "" + +#: knights.cpp:251 +msgid "&Retract Move" +msgstr "" + +#: knights.cpp:253 +msgid "Select this to retract your last move." +msgstr "" + +#: knights.cpp:255 +msgid "Resign" +msgstr "" + +#: knights.cpp:257 +msgid "Use this to concede the match to your opponent." +msgstr "" + +#: knights.cpp:259 +msgid "&Call Flag" +msgstr "" + +#: knights.cpp:261 +msgid "" +"Use this to declare the match over, due to your opponent being out of time." +msgstr "" + +#: knights.cpp:263 +msgid "&Hint" +msgstr "" + +#: knights.cpp:265 +msgid "This will ask your opponent for a hint." +msgstr "" + +#: knights.cpp:267 +msgid "Move &Now" +msgstr "" + +#: knights.cpp:269 +msgid "Clicking this option will force your opponent to move immediately." +msgstr "" + +#: knights.cpp:271 +msgid "&Flip View" +msgstr "" + +#: knights.cpp:273 +msgid "This will reverse the chessboard's orientation by 180 degrees." +msgstr "" + +#: knights.cpp:275 +msgid "&Ponder" +msgstr "" + +#: knights.cpp:278 +msgid "This toggles your opponent's ability to think while it's your turn." +msgstr "" + +#: knights.cpp:282 knights.cpp:918 +msgid "Pause" +msgstr "" + +#: knights.cpp:284 +msgid "Select this to pause the clock for this match." +msgstr "" + +#: knights.cpp:289 +msgid "&Offer Draw" +msgstr "" + +#: knights.cpp:290 +msgid "" +"Clicking this will inform your opponent that you are willing draw the match." +msgstr "" + +#: knights.cpp:292 +msgid "&Accept Draw" +msgstr "" + +#: knights.cpp:293 +msgid "Clicking this will accept a draw offered by your opponent." +msgstr "" + +#: knights.cpp:295 +msgid "&Reject Draw" +msgstr "" + +#: knights.cpp:296 +msgid "Clicking this will reject a draw offered by your opponent." +msgstr "" + +#: knights.cpp:298 +msgid "&Ignore Draw" +msgstr "" + +#: knights.cpp:299 +msgid "Clicking this will ignore future draw offers from your opponent." +msgstr "" + +#: knights.cpp:305 +msgid "&New Match..." +msgstr "" + +#: knights.cpp:306 +msgid "This allows you to begin a new match." +msgstr "" + +#: knights.cpp:309 +msgid "&Load Match..." +msgstr "" + +#: knights.cpp:310 +msgid "" +"The Load command will allow you to select a previously saved match and play " +"it again." +msgstr "" + +#: knights.cpp:314 thinbuttons.cpp:32 +msgid "&Save Match" +msgstr "" + +#: knights.cpp:316 knights.cpp:321 +msgid "" +"The Save command will allow you to store a copy of your current match for " +"later use." +msgstr "" + +#: knights.cpp:319 thinbuttons.cpp:34 +msgid "Save Match &As..." +msgstr "" + +#: knights.cpp:325 knights.cpp:841 +msgid "Connect to Server" +msgstr "" + +#: knights.cpp:326 +msgid "Clicking this will connect Knights with an internet chess server." +msgstr "" + +#: knights.cpp:330 thinbuttons.cpp:37 +msgid "&Print Notation..." +msgstr "" + +#: knights.cpp:332 +msgid "" +"The Print command will allow you to print this game's notation on your " +"printer." +msgstr "" + +#: knights.cpp:336 thinbuttons.cpp:40 +msgid "&Close Match" +msgstr "" + +#: knights.cpp:338 +msgid "This command removes the current match." +msgstr "" + +#: knights.cpp:340 +msgid "Close All" +msgstr "" + +#: knights.cpp:342 +msgid "This command will remove all matches that are currently loaded." +msgstr "" + +#: knights.cpp:347 +msgid "The Quit command will stop all matches and exit Knights." +msgstr "" + +#: knights.cpp:352 +msgid "&Install Themes" +msgstr "" + +#: knights.cpp:353 +msgid "This lets you install downloaded themes into Knights." +msgstr "" + +#: knights.cpp:357 +msgid "" +"Click this if you want to change the keyboard shortcuts that Knights uses." +msgstr "" + +#: knights.cpp:360 +msgid "&Configure Knights..." +msgstr "" + +#: knights.cpp:361 +msgid "" +"This opens a new window which allows you to customize Knights to your " +"particular tastes." +msgstr "" + +#: knights.cpp:367 +msgid "Begin a Tutorial" +msgstr "" + +#: knights.cpp:373 +msgid "&Match" +msgstr "" + +#: knights.cpp:562 +msgid "Error with white engine" +msgstr "" + +#: knights.cpp:564 +msgid "" +"You selected %1 to play white,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play white." +msgstr "" + +#: knights.cpp:565 +msgid "White Engine Problem" +msgstr "" + +#: knights.cpp:568 +msgid "Error with white book engine" +msgstr "" + +#: knights.cpp:570 +msgid "" +"You selected %1 to play white's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play white's book." +msgstr "" + +#: knights.cpp:571 +msgid "White Book Engine Problem" +msgstr "" + +#: knights.cpp:574 +msgid "Error with black engine" +msgstr "" + +#: knights.cpp:576 +msgid "" +"You selected %1 to play black,\n" +"but it can only be used as a book engine.\n" +"Please select another engine to play black." +msgstr "" + +#: knights.cpp:577 +msgid "Black Engine Problem" +msgstr "" + +#: knights.cpp:580 +msgid "Error with black book engine" +msgstr "" + +#: knights.cpp:582 +msgid "" +"You selected %1 to play black's book,\n" +"but it can only be used as a regular engine.\n" +"Please select another engine to play black's book." +msgstr "" + +#: knights.cpp:583 +msgid "Black Book Engine Problem" +msgstr "" + +#: knights.cpp:586 +msgid "The computer opponent assigned to play %1 has crashed" +msgstr "" + +#: knights.cpp:589 +msgid "There was an error while loading the file" +msgstr "" + +#: knights.cpp:592 +msgid "There was an error while saving the file" +msgstr "" + +#: knights.cpp:596 +msgid "Loading complete" +msgstr "" + +#: knights.cpp:599 +msgid "Saving complete" +msgstr "" + +#: knights.cpp:602 +msgid "Reading File" +msgstr "" + +#: knights.cpp:605 +msgid "Can not move a chessman while reviewing the match" +msgstr "" + +#: knights.cpp:608 +msgid "Illegal Move" +msgstr "" + +#: knights.cpp:611 +msgid "White's turn" +msgstr "" + +#: knights.cpp:614 +msgid "Black's turn" +msgstr "" + +#: knights.cpp:617 +msgid "White wins" +msgstr "" + +#: knights.cpp:620 +msgid "Black wins" +msgstr "" + +#: knights.cpp:623 +msgid "Checkmate, White wins" +msgstr "" + +#: knights.cpp:626 +msgid "Checkmate, Black wins" +msgstr "" + +#: knights.cpp:629 +msgid "White resigns" +msgstr "" + +#: knights.cpp:632 +msgid "Black resigns" +msgstr "" + +#: knights.cpp:635 +msgid "White's flag fell" +msgstr "" + +#: knights.cpp:638 +msgid "Black's flag fell" +msgstr "" + +#: knights.cpp:641 +msgid "Black's flag was called, White wins" +msgstr "" + +#: knights.cpp:644 +msgid "White's flag was called, Black wins" +msgstr "" + +#: knights.cpp:647 +msgid "Draw match" +msgstr "" + +#: knights.cpp:650 +msgid "50 moves rule, draw match" +msgstr "" + +#: knights.cpp:653 +msgid "Starting computer players, please wait" +msgstr "" + +#: knights.cpp:656 +msgid "Match paused" +msgstr "" + +#: knights.cpp:659 +msgid "White has offered a draw" +msgstr "" + +#: knights.cpp:662 +msgid "Black has offered a draw" +msgstr "" + +#: knights.cpp:665 +msgid "Lost contact with opponent" +msgstr "" + +#: knights.cpp:668 +msgid "Ready" +msgstr "" + +#: knights.cpp:848 +msgid "Disconnect from Server" +msgstr "" + +#: knights.cpp:924 +msgid "Resume" +msgstr "" + +#: knights.cpp:983 +msgid "Knights Themes" +msgstr "" + +#: knights.cpp:984 +msgid "Install Theme..." +msgstr "" + +#: knights.cpp:1014 +msgid "" +"You do not have permission to install this theme systemwide, so Knights " +"installed it locally." +msgstr "" + +#: knights.cpp:1015 +msgid "Installed theme locally" +msgstr "" + +#: knights.cpp:1020 +msgid "" +"The theme could not be installed:\n" +"%1" +msgstr "" + +#: knights.cpp:1021 +msgid "Can not install theme" +msgstr "" + +#: io_internet.cpp:135 +msgid "" +"There are no servers configured.\n" +"Please make sure you have at least one server configured." +msgstr "" + +#: io_internet.cpp:135 +msgid "Cannot find a server." +msgstr "" + +#: io_internet.cpp:154 io_internet.cpp:172 +msgid "" +"Knights can not start Timeseal.\n" +"Please make sure you have the correct path and filename configured." +msgstr "" + +#: io_internet.cpp:154 io_internet.cpp:172 +msgid "Cannot find Timeseal." +msgstr "" + +#: io_internet.cpp:182 io_internet.cpp:195 +msgid "" +"Knights is unable to connect to the server.\n" +" Please make sure your internet connection is working and try again." +msgstr "" + +#: io_internet.cpp:182 +msgid "Cannot connect to server(timeseal)." +msgstr "" + +#: io_internet.cpp:195 +msgid "Cannot connect to server." +msgstr "" + +#: io_internet.cpp:226 +msgid "%1 Console" +msgstr "" + +#: io_internet.cpp:232 +msgid "Sought Matches List" +msgstr "" + +#: io_internet.cpp:238 +msgid "Sought Matches Graph" +msgstr "" + +#: tabbox.cpp:163 +msgid "%1 - Knights" +msgstr "" + +#: dlg_promote.cpp:94 +msgid "Promote your pawn to..." +msgstr "" + +#: dlg_promote.cpp:101 +msgid "Pawn Promotion" +msgstr "" + +#: dlg_newmatch.cpp:38 +msgid "Start a New Match" +msgstr "" + +#: dlg_newmatch.cpp:45 list_pgn.cpp:30 list_pgn.cpp:50 +msgid "White" +msgstr "" + +#: dlg_newmatch.cpp:46 list_pgn.cpp:31 list_pgn.cpp:51 +msgid "Black" +msgstr "" + +#: dlg_newmatch.cpp:59 dlg_newmatch.cpp:66 +msgid "Human" +msgstr "" + +#: dlg_newmatch.cpp:60 dlg_newmatch.cpp:67 +msgid "Computer" +msgstr "" + +#: dlg_newmatch.cpp:61 dlg_newmatch.cpp:68 +msgid "Email" +msgstr "" + +#: dlg_newmatch.cpp:85 dlg_newmatch.cpp:102 +msgid "Base Time:" +msgstr "" + +#: dlg_newmatch.cpp:87 dlg_newmatch.cpp:104 tab_seeklist.cpp:101 +#: dlg_challenge.cpp:60 dlg_challenge.cpp:69 +msgid " min." +msgstr "" + +#: dlg_newmatch.cpp:90 dlg_newmatch.cpp:107 +msgid "Moves Per Base Time" +msgstr "" + +#: dlg_newmatch.cpp:92 dlg_newmatch.cpp:109 +msgid " moves" +msgstr "" + +#: dlg_newmatch.cpp:95 dlg_newmatch.cpp:112 +msgid "Increment Per Move" +msgstr "" + +#: knightstextview.cpp:45 +msgid "Select &All" +msgstr "" + +#: knightstextview.cpp:48 +msgid "&Print" +msgstr "" + +#: knightstextview.cpp:56 +msgid "Zoom &In" +msgstr "" + +#: knightstextview.cpp:58 +msgid "Zoom &Out" +msgstr "" + +#: knightstextview.cpp:218 +msgid "Page %1 of %2" +msgstr "" + +#: dlg_selectemail.cpp:27 +msgid "Select Email Address" +msgstr "" + +#: accel.cpp:23 +msgid "Previous Move" +msgstr "" + +#: accel.cpp:24 +msgid "Next Move" +msgstr "" + +#: accel.cpp:25 +msgid "Enter Text" +msgstr "" + +#: accel.cpp:26 +msgid "Page Up" +msgstr "" + +#: accel.cpp:27 +msgid "Page Down" +msgstr "" + +#: accel.cpp:28 +msgid "Increase Board Size" +msgstr "" + +#: accel.cpp:29 +msgid "Decrease Board Size" +msgstr "" + +#: accel.cpp:30 +msgid "Last History Item" +msgstr "" + +#: accel.cpp:31 +msgid "Next History Item" +msgstr "" + +#: accel.cpp:32 +msgid "Reply to the Last Tell" +msgstr "" + +#: accel.cpp:33 +msgid "Reply to the Channel" +msgstr "" + +#: accel.cpp:34 +msgid "Kibitz" +msgstr "" + +#: accel.cpp:35 setpagedisplay.cpp:531 +msgid "Whisper" +msgstr "" + +#: _translatorinfo.cpp:1 main.cpp:67 +msgid "" +"_: NAME OF TRANSLATORS\n" +"Your names" +msgstr "" + +#: _translatorinfo.cpp:3 main.cpp:68 +msgid "" +"_: EMAIL OF TRANSLATORS\n" +"Your emails" +msgstr "" + +#: challenge_graph_view.cpp:105 +msgid " Name: %1 Rating: %2 Match Type: %3 %4 Base Time: %5 Increment: %6" +msgstr "" + +#: list_pgn.cpp:29 list_pgn.cpp:49 +msgid "Result" +msgstr "" + +#: list_pgn.cpp:32 list_pgn.cpp:52 +msgid "Round" +msgstr "" + +#: list_pgn.cpp:33 list_pgn.cpp:53 +msgid "Site" +msgstr "" + +#: list_pgn.cpp:34 list_pgn.cpp:54 +msgid "Date" +msgstr "" + +#: list_pgn.cpp:83 +msgid "Can not open %1" +msgstr "" + +#: main.cpp:26 +msgid "Specify the location of your Knights data directory." +msgstr "" + +#: main.cpp:27 +msgid "A .pgn file to be loaded." +msgstr "" + +#: main.cpp:36 +msgid "" +"The Knights Chess Interface\n" +"\n" +"Knights is a chess interface\n" +"for the K Desktop Environment." +msgstr "" + +#: main.cpp:44 +msgid "Project Manager and Programmer" +msgstr "" + +#: main.cpp:48 +msgid "Communications Programmer" +msgstr "" + +#: main.cpp:52 +msgid "Qtopia port and patches" +msgstr "" + +#: main.cpp:56 +msgid "Patches and suggestions" +msgstr "" + +#: main.cpp:60 +msgid "KDE3 Compatability Patch" +msgstr "" + +#: main.cpp:64 +msgid "XBoard protocol" +msgstr "" + +#: setpagegeneral.cpp:29 +msgid "Your Name:" +msgstr "" + +#: setpagegeneral.cpp:39 +msgid "When Knights Begins It Should:" +msgstr "" + +#: setpagegeneral.cpp:40 +msgid "Do Nothing" +msgstr "" + +#: setpagegeneral.cpp:41 +msgid "Start a Match vs. PC" +msgstr "" + +#: setpagegeneral.cpp:42 +msgid "Connect to ICS" +msgstr "" + +#: setpagegeneral.cpp:50 +msgid "Save Match on Close?" +msgstr "" + +#: setpagegeneral.cpp:53 +msgid "Ask" +msgstr "" + +#: setpagegeneral.cpp:63 +msgid "Append to Save File:" +msgstr "" + +#: setpagegeneral.cpp:66 +msgid "Append to Save File" +msgstr "" + +#: setpagegeneral.cpp:81 +msgid "Pause on Minimize" +msgstr "" + +#: setpagegeneral.cpp:87 +msgid "Always Promote to Queen" +msgstr "" + +#: setpagegeneral.cpp:93 +msgid "Call Flag Automatically" +msgstr "" + +#: setpagegeneral.cpp:218 +msgid "Find PGN..." +msgstr "" + +#: dlg_settings.cpp:48 setpagedisplay.cpp:150 +msgid "General" +msgstr "" + +#: dlg_settings.cpp:49 +msgid "Various aspects of Knights get configured here." +msgstr "" + +#: dlg_settings.cpp:55 +msgid "Display" +msgstr "" + +#: dlg_settings.cpp:56 +msgid "These settings determine how Knights displays itself to you." +msgstr "" + +#: dlg_settings.cpp:62 +msgid "Audio" +msgstr "" + +#: dlg_settings.cpp:63 +msgid "These settings determine what Knights sounds like." +msgstr "" + +#: dlg_settings.cpp:69 +msgid "Computer Opponents" +msgstr "" + +#: dlg_settings.cpp:70 +msgid "Configure your chess engines here." +msgstr "" + +#: dlg_settings.cpp:77 +msgid "Configure your internet chess servers here." +msgstr "" + +#: match_param.cpp:108 +msgid "Unknown" +msgstr "" + +#: core.cpp:385 +msgid "Hint" +msgstr "" + +#: core.cpp:388 +msgid "Tell User" +msgstr "" + +#: core.cpp:391 +msgid "Tell User Error" +msgstr "" + +#: core.cpp:397 +msgid "Tell Opponent" +msgstr "" + +#: core.cpp:411 +msgid "Tell All" +msgstr "" + +#: core.cpp:617 +msgid "Load PGN..." +msgstr "" + +#: core.cpp:661 +msgid "Would you like to save this match?" +msgstr "" + +#: core.cpp:662 +msgid "Save Match?" +msgstr "" + +#: core.cpp:681 +msgid "Save Match..." +msgstr "" + +#: dlg_server.cpp:25 +msgid "Configure Server" +msgstr "" + +#: dlg_server.cpp:37 +msgid "Server Name" +msgstr "" + +#: dlg_server.cpp:44 +msgid "Server URL" +msgstr "" + +#: dlg_server.cpp:49 +msgid "Server Port" +msgstr "" + +#: dlg_server.cpp:56 +msgid "Username" +msgstr "" + +#: dlg_server.cpp:59 +msgid "Remember My Password" +msgstr "" + +#: dlg_server.cpp:64 +msgid "Password" +msgstr "" + +#: dlg_server.cpp:71 +msgid "Confirm Password" +msgstr "" + +#: dlg_server.cpp:79 +msgid "Timeseal" +msgstr "" + +#: dlg_server.cpp:88 dlg_engine.cpp:59 +msgid "Log File" +msgstr "" + +#: setpageaudio.cpp:28 +msgid "Enable Audio" +msgstr "" + +#: setpageaudio.cpp:36 +msgid "Audio Themes" +msgstr "" + +#: setpageaudio.cpp:47 +msgid "Volume" +msgstr "" + +#: setpageaudio.cpp:48 +msgid "Maximum" +msgstr "" + +#: setpageaudio.cpp:52 +msgid "Minimum" +msgstr "" + +#: setpageaudio.cpp:55 +msgid "For Current Match Only" +msgstr "" + +#: dlg_engine.cpp:26 +msgid "Configure Engine" +msgstr "" + +#: dlg_engine.cpp:38 +msgid "Engine Name" +msgstr "" + +#: dlg_engine.cpp:48 +msgid "Engine Filename" +msgstr "" + +#: dlg_engine.cpp:54 +msgid "Command Line Arguments" +msgstr "" + +#: tab_seeklist.cpp:28 challenge_graph.cpp:304 +msgid "Rating" +msgstr "" + +#: tab_seeklist.cpp:29 +msgid "Match Type" +msgstr "" + +#: tab_seeklist.cpp:30 +msgid "Is Rated?" +msgstr "" + +#: tab_seeklist.cpp:31 dlg_challenge.cpp:62 dlg_challenge.cpp:71 +msgid "Base Time" +msgstr "" + +#: tab_seeklist.cpp:32 dlg_challenge.cpp:63 dlg_challenge.cpp:72 +msgid "Increment" +msgstr "" + +#: tab_seeklist.cpp:40 challenge_graph.cpp:75 +msgid "Seek Matches" +msgstr "" + +#: tab_seeklist.cpp:42 challenge_graph.cpp:77 +msgid "Accept This Match" +msgstr "" + +#: tab_seeklist.cpp:43 challenge_graph.cpp:78 +msgid "Tell..." +msgstr "" + +#: tab_seeklist.cpp:44 challenge_graph.cpp:79 +msgid "Assess..." +msgstr "" + +#: tab_seeklist.cpp:45 challenge_graph.cpp:80 +msgid "Player Info" +msgstr "" + +#: tab_seeklist.cpp:47 challenge_graph.cpp:82 +msgid "Player History" +msgstr "" + +#: tab_seeklist.cpp:49 challenge_graph.cpp:84 +msgid "Add to Friends" +msgstr "" + +#: tab_seeklist.cpp:50 challenge_graph.cpp:85 +msgid "Ignore This Player" +msgstr "" + +#: tabpage.cpp:55 +msgid "Close This Tab" +msgstr "" + +#: dlg_login.cpp:21 +msgid "Login Prompt" +msgstr "" + +#: dlg_login.cpp:32 +msgid "Select Server" +msgstr "" + +#: dlg_login.cpp:51 +msgid "User info" +msgstr "" + +#: dlg_login.cpp:57 +msgid "Login:" +msgstr "" + +#: dlg_login.cpp:58 +msgid "Password:" +msgstr "" + +#: dlg_login.cpp:64 +msgid "Log in as guest" +msgstr "" + +#: dlg_login.cpp:78 +msgid "Login" +msgstr "" + +#: dlg_login.cpp:78 +msgid "Log in to the chess server using this name and password." +msgstr "" + +#: dlg_login.cpp:79 +msgid "Abort logging into the server" +msgstr "" + +#: challenge_graph.cpp:311 +msgid "Time" +msgstr "" + +#: dlg_challenge.cpp:25 +msgid "You've Been Challenged:" +msgstr "" + +#: dlg_challenge.cpp:29 +msgid "Accept" +msgstr "" + +#: dlg_challenge.cpp:30 +msgid "Decline" +msgstr "" + +#: dlg_challenge.cpp:49 +msgid "Time Odds Match" +msgstr "" + +#: dlg_challenge.cpp:53 +msgid "Unrated" +msgstr "" + +#: dlg_challenge.cpp:54 +msgid "Rated" +msgstr "" + +#: dlg_challenge.cpp:109 +msgid "" +"%1 %2 vs. %3 %4\n" +"in a %5 match." +msgstr "" + +#: dlg_challenge.cpp:123 dlg_challenge.cpp:124 +msgid "Time Controls" +msgstr "" + +#: dlg_challenge.cpp:153 +msgid "Counter Offer" +msgstr "" + +#: pgn.cpp:207 pgn.cpp:390 pgn.cpp:953 +msgid "%1 vs. %2" +msgstr "" + +#: pgn.cpp:980 +msgid "Good move" +msgstr "" + +#: pgn.cpp:983 +msgid "Poor move" +msgstr "" + +#: pgn.cpp:986 +msgid "Very good move" +msgstr "" + +#: pgn.cpp:989 +msgid "Very poor move" +msgstr "" + +#: pgn.cpp:992 +msgid "Speculative move" +msgstr "" + +#: pgn.cpp:995 +msgid "Questionable move" +msgstr "" + +#: pgn.cpp:998 +msgid "Forced move" +msgstr "" + +#: pgn.cpp:1001 +msgid "Singular move" +msgstr "" + +#: pgn.cpp:1004 +msgid "Worst move" +msgstr "" + +#: pgn.cpp:1007 +msgid "Drawish position" +msgstr "" + +#: pgn.cpp:1010 +msgid "Equal chances, quiet position" +msgstr "" + +#: pgn.cpp:1013 +msgid "Equal chances, active position" +msgstr "" + +#: pgn.cpp:1016 +msgid "Unclear position" +msgstr "" + +#: pgn.cpp:1019 +msgid "White has a slight advantage" +msgstr "" + +#: pgn.cpp:1022 +msgid "Black has a slight advantage" +msgstr "" + +#: pgn.cpp:1025 +msgid "White has a moderate advantage" +msgstr "" + +#: pgn.cpp:1028 +msgid "Black has a moderate advantage" +msgstr "" + +#: pgn.cpp:1031 +msgid "White has a decisive advantage" +msgstr "" + +#: pgn.cpp:1034 +msgid "Black has a decisive advantage" +msgstr "" + +#: pgn.cpp:1037 +msgid "White has a crushing advantage ( Black should resign )" +msgstr "" + +#: pgn.cpp:1040 +msgid "Black has a crushing advantage ( White should resign )" +msgstr "" + +#: pgn.cpp:1043 +msgid "White is in zugzwang" +msgstr "" + +#: pgn.cpp:1046 +msgid "Black is in zugzwang" +msgstr "" + +#: pgn.cpp:1049 +msgid "White has a slight space advantage" +msgstr "" + +#: pgn.cpp:1052 +msgid "Black has a slight space advantage" +msgstr "" + +#: pgn.cpp:1055 +msgid "White has a moderate space advantage" +msgstr "" + +#: pgn.cpp:1058 +msgid "Black has a moderate space advantage" +msgstr "" + +#: pgn.cpp:1061 +msgid "White has a decisive space advantage" +msgstr "" + +#: pgn.cpp:1064 +msgid "Black has a decisive space advantage" +msgstr "" + +#: pgn.cpp:1067 +msgid "White has a slight time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1070 +msgid "Black has a slight time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1073 +msgid "White has a moderate time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1076 +msgid "Black has a moderate time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1079 +msgid "White has a decisive time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1082 +msgid "Black has a decisive time ( development ) advantage" +msgstr "" + +#: pgn.cpp:1085 +msgid "White has the initiative" +msgstr "" + +#: pgn.cpp:1088 +msgid "Black has the initiative" +msgstr "" + +#: pgn.cpp:1091 +msgid "White has a lasting initiative" +msgstr "" + +#: pgn.cpp:1094 +msgid "Black has a lasting initiative" +msgstr "" + +#: pgn.cpp:1097 +msgid "White has the attack" +msgstr "" + +#: pgn.cpp:1100 +msgid "Black has the attack" +msgstr "" + +#: pgn.cpp:1103 +msgid "White has insufficient compensation for material deficit" +msgstr "" + +#: pgn.cpp:1106 +msgid "Black has insufficient compensation for material deficit" +msgstr "" + +#: pgn.cpp:1109 +msgid "White has sufficient compensation for material deficit" +msgstr "" + +#: pgn.cpp:1112 +msgid "Black has sufficient compensation for material deficit" +msgstr "" + +#: pgn.cpp:1115 +msgid "White has more than adequate compensation for material deficit" +msgstr "" + +#: pgn.cpp:1118 +msgid "Black has more than adequate compensation for material deficit" +msgstr "" + +#: pgn.cpp:1121 +msgid "White has a slight center control advantage" +msgstr "" + +#: pgn.cpp:1124 +msgid "Black has a slight center control advantage" +msgstr "" + +#: pgn.cpp:1127 +msgid "White has a moderate center control advantage" +msgstr "" + +#: pgn.cpp:1130 +msgid "Black has a moderate center control advantage" +msgstr "" + +#: pgn.cpp:1133 +msgid "White has a decisive center control advantage" +msgstr "" + +#: pgn.cpp:1136 +msgid "Black has a decisive center control advantage" +msgstr "" + +#: pgn.cpp:1139 +msgid "White has a slight kingside control advantage" +msgstr "" + +#: pgn.cpp:1142 +msgid "Black has a slight kingside control advantage" +msgstr "" + +#: pgn.cpp:1145 +msgid "White has a moderate kingside control advantage" +msgstr "" + +#: pgn.cpp:1148 +msgid "Black has a moderate kingside control advantage" +msgstr "" + +#: pgn.cpp:1151 +msgid "White has a decisive kingside control advantage" +msgstr "" + +#: pgn.cpp:1154 +msgid "Black has a decisive kingside control advantage" +msgstr "" + +#: pgn.cpp:1157 +msgid "White has a slight queenside control advantage" +msgstr "" + +#: pgn.cpp:1160 +msgid "Black has a slight queenside control advantage" +msgstr "" + +#: pgn.cpp:1163 +msgid "White has a moderate queenside control advantage" +msgstr "" + +#: pgn.cpp:1166 +msgid "Black has a moderate queenside control advantage" +msgstr "" + +#: pgn.cpp:1169 +msgid "White has a decisive queenside control advantage" +msgstr "" + +#: pgn.cpp:1172 +msgid "Black has a decisive queenside control advantage" +msgstr "" + +#: pgn.cpp:1175 +msgid "White has a vulnerable first rank" +msgstr "" + +#: pgn.cpp:1178 +msgid "Black has a vulnerable first rank" +msgstr "" + +#: pgn.cpp:1181 +msgid "White has a well protected first rank" +msgstr "" + +#: pgn.cpp:1184 +msgid "Black has a well protected first rank" +msgstr "" + +#: pgn.cpp:1187 +msgid "White has a poorly protected king" +msgstr "" + +#: pgn.cpp:1190 +msgid "Black has a poorly protected king" +msgstr "" + +#: pgn.cpp:1193 +msgid "White has a well protected king" +msgstr "" + +#: pgn.cpp:1196 +msgid "Black has a well protected king" +msgstr "" + +#: pgn.cpp:1199 +msgid "White has a poorly placed king" +msgstr "" + +#: pgn.cpp:1202 +msgid "Black has a poorly placed king" +msgstr "" + +#: pgn.cpp:1205 +msgid "White has a well placed king" +msgstr "" + +#: pgn.cpp:1208 +msgid "Black has a well placed king" +msgstr "" + +#: pgn.cpp:1211 +msgid "White has a very weak pawn structure" +msgstr "" + +#: pgn.cpp:1214 +msgid "Black has a very weak pawn structure" +msgstr "" + +#: pgn.cpp:1217 +msgid "White has a moderately weak pawn structure" +msgstr "" + +#: pgn.cpp:1220 +msgid "Black has a moderately weak pawn structure" +msgstr "" + +#: pgn.cpp:1223 +msgid "White has a moderately strong pawn structure" +msgstr "" + +#: pgn.cpp:1226 +msgid "Black has a moderately strong pawn structure" +msgstr "" + +#: pgn.cpp:1229 +msgid "White has a very strong pawn structure" +msgstr "" + +#: pgn.cpp:1232 +msgid "Black has a very strong pawn structure" +msgstr "" + +#: pgn.cpp:1235 +msgid "White has poor knight placement" +msgstr "" + +#: pgn.cpp:1238 +msgid "Black has poor knight placement" +msgstr "" + +#: pgn.cpp:1241 +msgid "White has good knight placement" +msgstr "" + +#: pgn.cpp:1244 +msgid "Black has good knight placement" +msgstr "" + +#: pgn.cpp:1247 +msgid "White has poor bishop placement" +msgstr "" + +#: pgn.cpp:1250 +msgid "Black has poor bishop placement" +msgstr "" + +#: pgn.cpp:1253 +msgid "White has good bishop placement" +msgstr "" + +#: pgn.cpp:1256 +msgid "Black has good bishop placement" +msgstr "" + +#: pgn.cpp:1259 +msgid "White has poor rook placement" +msgstr "" + +#: pgn.cpp:1262 +msgid "Black has poor rook placement" +msgstr "" + +#: pgn.cpp:1265 +msgid "White has good rook placement" +msgstr "" + +#: pgn.cpp:1268 +msgid "Black has good rook placement" +msgstr "" + +#: pgn.cpp:1271 +msgid "White has poor queen placement" +msgstr "" + +#: pgn.cpp:1274 +msgid "Black has poor queen placement" +msgstr "" + +#: pgn.cpp:1277 +msgid "White has good queen placement" +msgstr "" + +#: pgn.cpp:1280 +msgid "Black has good queen placement" +msgstr "" + +#: pgn.cpp:1283 +msgid "White has poor piece coordination" +msgstr "" + +#: pgn.cpp:1286 +msgid "Black has poor piece coordination" +msgstr "" + +#: pgn.cpp:1289 +msgid "White has good piece coordination" +msgstr "" + +#: pgn.cpp:1292 +msgid "Black has good piece coordination" +msgstr "" + +#: pgn.cpp:1295 +msgid "White has played the opening very poorly" +msgstr "" + +#: pgn.cpp:1298 +msgid "Black has played the opening very poorly" +msgstr "" + +#: pgn.cpp:1301 +msgid "White has played the opening poorly" +msgstr "" + +#: pgn.cpp:1304 +msgid "Black has played the opening poorly" +msgstr "" + +#: pgn.cpp:1307 +msgid "White has played the opening well" +msgstr "" + +#: pgn.cpp:1310 +msgid "Black has played the opening well" +msgstr "" + +#: pgn.cpp:1313 +msgid "White has played the opening very well" +msgstr "" + +#: pgn.cpp:1316 +msgid "Black has played the opening very well" +msgstr "" + +#: pgn.cpp:1319 +msgid "White has played the middlegame very poorly" +msgstr "" + +#: pgn.cpp:1322 +msgid "Black has played the middlegame very poorly" +msgstr "" + +#: pgn.cpp:1325 +msgid "White has played the middlegame poorly" +msgstr "" + +#: pgn.cpp:1328 +msgid "Black has played the middlegame poorly" +msgstr "" + +#: pgn.cpp:1331 +msgid "White has played the middlegame well" +msgstr "" + +#: pgn.cpp:1334 +msgid "Black has played the middlegame well" +msgstr "" + +#: pgn.cpp:1337 +msgid "White has played the middlegame very well" +msgstr "" + +#: pgn.cpp:1340 +msgid "Black has played the middlegame very well" +msgstr "" + +#: pgn.cpp:1343 +msgid "White has played the ending very poorly" +msgstr "" + +#: pgn.cpp:1346 +msgid "Black has played the ending very poorly" +msgstr "" + +#: pgn.cpp:1349 +msgid "White has played the ending poorly" +msgstr "" + +#: pgn.cpp:1352 +msgid "Black has played the ending poorly" +msgstr "" + +#: pgn.cpp:1355 +msgid "White has played the ending well" +msgstr "" + +#: pgn.cpp:1358 +msgid "Black has played the ending well" +msgstr "" + +#: pgn.cpp:1361 +msgid "White has played the ending very well" +msgstr "" + +#: pgn.cpp:1364 +msgid "Black has played the ending very well" +msgstr "" + +#: pgn.cpp:1367 +msgid "White has slight counterplay" +msgstr "" + +#: pgn.cpp:1370 +msgid "Black has slight counterplay" +msgstr "" + +#: pgn.cpp:1373 +msgid "White has moderate counterplay" +msgstr "" + +#: pgn.cpp:1376 +msgid "Black has moderate counterplay" +msgstr "" + +#: pgn.cpp:1379 +msgid "White has decisive counterplay" +msgstr "" + +#: pgn.cpp:1382 +msgid "Black has decisive counterplay" +msgstr "" + +#: pgn.cpp:1385 +msgid "White has moderate time control pressure" +msgstr "" + +#: pgn.cpp:1388 +msgid "Black has moderate time control pressure" +msgstr "" + +#: pgn.cpp:1391 +msgid "White has severe time control pressure" +msgstr "" + +#: pgn.cpp:1394 +msgid "Black has severe time control pressure" +msgstr "" + +#: pgn.cpp:1396 +msgid "With the idea..." +msgstr "" + +#: pgn.cpp:1399 +msgid "Aimed against..." +msgstr "" + +#: pgn.cpp:1402 +msgid "Better Move" +msgstr "" + +#: pgn.cpp:1405 +msgid "Worse Move" +msgstr "" + +#: pgn.cpp:1408 +msgid "Equivalent move" +msgstr "" + +#: pgn.cpp:1411 +msgid "Editor's Remark" +msgstr "" + +#: pgn.cpp:1414 +msgid "Novelty" +msgstr "" + +#: pgn.cpp:1417 +msgid "Weak point" +msgstr "" + +#: pgn.cpp:1420 +msgid "Endgame" +msgstr "" + +#: pgn.cpp:1423 +msgid "Line" +msgstr "" + +#: pgn.cpp:1426 +msgid "Diagonal" +msgstr "" + +#: pgn.cpp:1429 +msgid "White has a pair of Bishops" +msgstr "" + +#: pgn.cpp:1432 +msgid "Black has a pair of Bishops" +msgstr "" + +#: pgn.cpp:1435 +msgid "Bishops of opposite color" +msgstr "" + +#: pgn.cpp:1438 +msgid "Bishops of same color" +msgstr "" + +#: pgn.cpp:1441 +msgid "Etc." +msgstr "" + +#: pgn.cpp:1444 +msgid "Doubled pawns" +msgstr "" + +#: pgn.cpp:1447 +msgid "Isolated pawn" +msgstr "" + +#: pgn.cpp:1450 +msgid "Connected pawns" +msgstr "" + +#: pgn.cpp:1453 +msgid "Hanging pawns" +msgstr "" + +#: pgn.cpp:1456 +msgid "Backwards pawn" +msgstr "" + +#: dlg_selectengine.cpp:30 +msgid "Select Computer Player" +msgstr "" + +#: dlg_selectengine.cpp:41 +msgid "Computer Players" +msgstr "" + +#: dlg_selectengine.cpp:61 +msgid "Player Strength" +msgstr "" + +#: dlg_selectengine.cpp:63 +msgid "Weak" +msgstr "" + +#: dlg_selectengine.cpp:70 +msgid "Strong" +msgstr "" + +#: proto_xboard.cpp:449 +msgid "" +"%1 suggests this move:\n" +"%2" +msgstr "" + +#: proto_xboard.cpp:471 proto_xboard.cpp:478 proto_xboard.cpp:485 +msgid "" +"%1 tells you:\n" +"%2" +msgstr "" + +#: setpagedisplay.cpp:74 +msgid "Board Themes" +msgstr "" + +#: setpagedisplay.cpp:79 +msgid "Chessman Themes" +msgstr "" + +#: setpagedisplay.cpp:85 +msgid "Theme Size" +msgstr "" + +#: setpagedisplay.cpp:88 +msgid "Small" +msgstr "" + +#: setpagedisplay.cpp:95 +msgid "Large" +msgstr "" + +#: setpagedisplay.cpp:97 +msgid "Player Images File:" +msgstr "" + +#: setpagedisplay.cpp:107 +msgid "Other Display Options" +msgstr "" + +#: setpagedisplay.cpp:110 +msgid "Reverse Board Orientation" +msgstr "" + +#: setpagedisplay.cpp:115 +msgid "Display Startup Logo" +msgstr "" + +#: setpagedisplay.cpp:120 +msgid "Automatic Preview" +msgstr "" + +#: setpagedisplay.cpp:125 +msgid "Show Last Move" +msgstr "" + +#: setpagedisplay.cpp:130 +msgid "Animate Moves" +msgstr "" + +#: setpagedisplay.cpp:135 +msgid "Show Coordinates" +msgstr "" + +#: setpagedisplay.cpp:169 +msgid "Restore Defaults" +msgstr "" + +#: setpagedisplay.cpp:173 +msgid "Standard Font..." +msgstr "" + +#: setpagedisplay.cpp:182 +msgid "Private Font..." +msgstr "" + +#: setpagedisplay.cpp:191 +msgid "Channel Font..." +msgstr "" + +#: setpagedisplay.cpp:200 +msgid "Shout Font..." +msgstr "" + +#: setpagedisplay.cpp:209 +msgid "Whisper Font..." +msgstr "" + +#: setpagedisplay.cpp:218 +msgid "Notification Font..." +msgstr "" + +#: setpagedisplay.cpp:233 +msgid "Console" +msgstr "" + +#: setpagedisplay.cpp:527 +msgid "Standard" +msgstr "" + +#: setpagedisplay.cpp:528 +msgid "Private Tell" +msgstr "" + +#: setpagedisplay.cpp:529 +msgid "Channel Tell" +msgstr "" + +#: setpagedisplay.cpp:530 +msgid "Shout" +msgstr "" + +#: setpagedisplay.cpp:532 +msgid "Notification" +msgstr "" + +#: setpagedisplay.cpp:556 +msgid "Find Player Images File..." +msgstr "" diff --git a/stamp-h.in b/stamp-h.in new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/subdirs b/subdirs new file mode 100644 index 0000000..bc39422 --- /dev/null +++ b/subdirs @@ -0,0 +1,5 @@ +admin +doc +knights +media +po