Mercurial > repos > clustalomega > clustalomega
changeset 0:ea6d0e588642 default tip
Migrated tool version 0.2 from old tool shed archive to new tool shed repository
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/README Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,20 @@ +Copy rgClustalOmega.xml and hide_stderr.py to galaxy_dist/tools/rgenetics + +Copy the files in test-data to galaxy_dist/test-data + +To install the Clustal Omega executable: + +$ cd clustal-omega-0.2.0 +$ ./configure +$ make +$ make install + +Clustal Omega uses Argtable to parse command line options. It may already be present on your system. If not, it can be found at: + + http://argtable.sourceforge.net/ + +or from many repositories e.g. to install on Debian/Ubuntu/etc.: + +$ sudo apt-get install libargtable2-dev + +Any questions, comments, or bug notifications should be directed to david.dineen@ucd.ie
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/AUTHORS Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,20 @@ +* Clustal Omega: +Fabian Sievers UCD Dublin, Ireland +Andreas Wilm UCD Dublin, Ireland +David Dineen UCD Dublin, Ireland +Johannes Söding Gene Center Munich, Germany +Michael Remmert Gene Center Munich, Germany + +* Clustal 2 +Mark Larkin UCD Dublin, Ireland + +* Clustal 1.X +Toby Gibson EMBL Heidelberg, Germany +Des Higgins UCC Cork, Ireland +Julie Thompson IGBMC Strasbourg, France + +* Contributors: +Chenna Ramu EMBL Heidelberg, Germany +Nigel Brown EMBL Heidelberg, Germany + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/COPYING Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/ChangeLog Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,15 @@ +2010-06-17 Release 0.0.1 (Dubliniensis) + + First "release" as program has been able for a while to perform + all basic tasks without problems. + + Non-standard features already built-in include: + HMM-iteration (using HMMER for building an HMM) and guide-tree + iteration. On top of that HMM input works fine and + background-frequencies are added to the HHalign process. + + Known issues: RNA/DNA alignment is considered buggy. Aligned + sequences have to be dealigned for HHalign to work properly. + + The HMMER version message can be ignored if no HMM-iteration + was used.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/Doxyfile Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1510 @@ +# Doxyfile 1.5.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "Clustal Omega" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.2.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./doc/doxygen/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, +# Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command <command> <input-file>, where <command> is the value of +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./src/clustal ./src/clustal-omega.h ./src/clustal-omega.c + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.h *.c + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = ./src/config.h + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = ./src/ + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to FRAME, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. Other possible values +# for this tag are: HIERARCHIES, which will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list; +# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which +# disables this behavior completely. For backwards compatibility with previous +# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE +# respectively. + +GENERATE_TREEVIEW = NONE + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Options related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/Doxyfile.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1510 @@ +# Doxyfile 1.5.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "@PACKAGE_NAME@" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @PACKAGE_VERSION@ + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./doc/doxygen/ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, +# Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command <command> <input-file>, where <command> is the value of +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./src/clustal ./src/clustal-omega.h ./src/clustal-omega.c + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.h *.c + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = ./src/config.h + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = ./src/ + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to FRAME, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. Other possible values +# for this tag are: HIERARCHIES, which will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list; +# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which +# disables this behavior completely. For backwards compatibility with previous +# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE +# respectively. + +GENERATE_TREEVIEW = NONE + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Options related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/INSTALL Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,398 @@ +The impatient can try: + +$ ./configure +$ make +$ make install + + +Clustal-Omega needs argtable2 (http://argtable.sourceforge.net/). If +argtable2 is installed in a non-standard directory you might have to +point configure to its installation directory. For example, if you are +on a Mac and have argtable installed via MacPorts then you should use +the following command line: + +$ ./configure CFLAGS='-I/opt/local/include' LDFLAGS='-L/opt/local/lib' + + +ClustalO will automatically support multi-threading if your compiler +supports OpenMP. For some reason automake's OpenMP detection for +Apple's gcc is broken. However, you can use gcc installed via MacPorts +by adding + +CC=/opt/local/bin/gcc-mp-4.5 + +to the configure call (you will to change the exact string to match +your gcc version) + + +See below for generic installation instructions: + +---------------------------------------------------------------------- + + + +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008, 2009 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `<wchar.h>' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/Makefile.am Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,25 @@ +# Some useful automake documentation: +# http://www.openismus.com/documents/linux/automake/automake.shtml +# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html + +# we do not use GNU-style files: NEWS README AUTHORS ChangeLog +#AUTOMAKE_OPTIONS = foreign + +ACLOCAL_AMFLAGS=-I m4 +SUBDIRS = src +# SUBDIRS = src tests + +dist_doc_DATA = README + +EXTRA_DIST = Doxyfile + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = clustalo.pc + + +bug-tests: all + cd bug-tests && $(SHELL) bug-tests.sh; + +#dist-hook: +# svnversion . > $(distdir)/src/svnversion.h 2>/dev/null +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/Makefile.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,804 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# Some useful automake documentation: +# http://www.openismus.com/documents/linux/automake/automake.shtml +# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html + +# we do not use GNU-style files: NEWS README AUTHORS ChangeLog +#AUTOMAKE_OPTIONS = foreign + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +DIST_COMMON = README $(am__configure_deps) $(dist_doc_DATA) \ + $(srcdir)/Doxyfile.in $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/clustalo.pc.in \ + $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ + TODO config.guess config.sub depcomp install-sh ltmain.sh \ + missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/ax_openmp.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = clustalo.pc Doxyfile +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)" +DATA = $(dist_doc_DATA) $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CODENAME = @PACKAGE_CODENAME@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = src +# SUBDIRS = src tests +dist_doc_DATA = README +EXTRA_DIST = Doxyfile +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = clustalo.pc +all: all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): +clustalo.pc: $(top_builddir)/config.status $(srcdir)/clustalo.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-dist_docDATA: $(dist_doc_DATA) + @$(NORMAL_INSTALL) + test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)" + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-dist_docDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(docdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(docdir)" && rm -f $$files +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-dist_docDATA install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-dist_docDATA uninstall-pkgconfigDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dist_docDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pkgconfigDATA install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am uninstall-dist_docDATA \ + uninstall-pkgconfigDATA + + +bug-tests: all + cd bug-tests && $(SHELL) bug-tests.sh; + +#dist-hook: +# svnversion . > $(distdir)/src/svnversion.h 2>/dev/null + +# 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:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/README Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,594 @@ + + +CLUSTAL-OMEGA is a general purpose multiple sequence alignment program +for proteins. + + + +INTRODUCTION + +Clustal-Omega is a general purpose multiple sequence alignment (MSA) +program for proteins. It produces high quality MSAs and is capable of +handling data-sets of hundreds of thousands of sequences in reasonable +time. + +In default mode, users give a file of sequences to be aligned and +these are clustered to produce a guide tree and this is used to guide +a "progressive alignment" of the sequences. There are also facilities +for aligning existing alignments to each other, aligning a sequence to +an alignment and for using a hidden Markov model (HMM) to help guide +an alignment of new sequences that are homologous to the sequences +used to make the HMM. This latter procedure is referred to as +"external profile alignment" or EPA. + +Clustal-Omega uses HMMs for the alignment engine, based on the HHalign +package from Johannes Soeding [1]. Guide trees are optionally made +using mBed [2] which can cluster very large numbers of sequences in +O(N*log(N)) time. Multiple alignment then proceeds by aligning larger +and larger alignments using HHalign, following the clustering given by +the guide tree. + +In its current form Clustal-Omega can only align protein sequences but +not DNA/RNA sequences. It is envisioned that DNA/RNA will become +available in a future version. + + + +SEQUENCE INPUT: + +-i, --in, --infile={<file>,-} + Multiple sequence input file (- for stdin) + +--hmm-in=<file> + HMM input files + +--dealign + Dealign input sequences + +--profile1, --p1=<file> + Pre-aligned multiple sequence file (aligned columns will be kept fixed) + +--profile2, --p2=<file> + Pre-aligned multiple sequence file (aligned columns will be kept fixed) + + +For sequence and profile input Clustal-Omega uses the Squid library +from Sean Eddy [3]. + + +Clustal-Omega accepts 3 types of sequence input: (i) a sequence file +with un-aligned or aligned sequences, (ii) profiles (a multiple +alignment in a file) of aligned sequences, (iii) a HMM. Valid +combinations of the above are: + +(a) one file with un-aligned or aligned sequences (i); the sequences + will be aligned, and the alignment will be written out. For this + mode use the -i flag. If the sequences are aligned (all sequences + have the same length and at least one sequence has at least one + gap), then the alignment is turned into a HMM, the sequences are + de-aligned and the now un-aligned sequences are aligned using the + HMM as an External Profile for External Profile Alignment (EPA). + If no EPA is desired use the --dealign flag. + + Use the above option to make a multiple alignment from a set of + sequences. A sequence file must contain more than one sequence (at + least two sequences). + +(b) two profiles (ii)+(ii); the columns in each profile will be kept + fixed and the alignment of the two profiles will be written + out. Use the --p1 and --p2 flags for this mode. + + Use this option to align two alignments (profiles) together. + +(c) one file with un/aligned sequences (i) and one profile (ii); the + profile is converted into a HMM and the un-aligned sequences will + be multiply aligned (using the HMM background information) to form + a profile; this constructed profile is aligned with the input + profile; the columns in each profile (the original one and the one + created from the un-aligned sequences) will be kept fixed and the + alignment of the two profiles will be written out. Use the -i flag + in conjunction with the --p1 flag for this mode. + The un/aligned sequences file (i) must contain at least two + sequences. If a single sequence has to be aligned with a profile + the profile-profile option (b) has to be used. + + Use the above option to add new sequences to an existing + alignment. + +(d) one file with un-aligned sequences (i) and one HMM (iii); the + un-aligned sequences will be aligned to form a profile, using the + HMM as an External Profile. So far only one HMM can be input and + only HMMer2 and HMMer3 formats are allowed. The alignment will be + written out; the HMM information is discarded. As, at the moment, + only one HMM can be used, no HMM is produced if the sequences are + already aligned. Use the -i flag in conjunction with the --hmm-in + flag for this mode. Multiple HMMs can be inputted, however, in the + current version all but the first HMM will be ignored. + + Use this option to make a new multiple alignment of sequences from + the input file and use the HMM as a guide (EPA). + + +Invalid combinations of the above are: + +(v) an un/aligned sequence file containing just one sequence (i) + +(w) an un/aligned sequence file containing just one sequence and a profile + (i)+(ii) + +(x) an un/aligned sequence file containing just one sequence and a HMM + (i)+(iii) + +(y) two or more HMMs (iii)+(iii)+... cannot be aligned to one another. + +(z) one profile (ii) cannot be aligned with a HMM (iii) + + +The following MSA file formats are allowed: + + a2m=fasta, (vienna) + clustal, + msf, + phylip, + selex, + stockholm + + +Prior to MSA, Clustal-Omega de-aligns all sequence input (i). However, +alignment information is automatically converted into a HMM and used +during MSA, unless the --dealign flag is specifically set. Profiles +(ii) are not de-aligned. + +The Clustal-Omega alignment engine can at the moment not process +DNA/RNA. If a sequence input file (i) or a profile (ii) is interpreted +as DNA/RNA the program will terminate during the file input stage. + + + +CLUSTERING: + + --distmat-in=<file> + Pairwise distance matrix input file (skips distance computation) + + --distmat-out=<file> + Pairwise distance matrix output file + + --guidetree-in=<file> + Guide tree input file + (skips distance computation and guide tree clustering step) + + --guidetree-out=<file> + Guide tree output file + + --mbed + Fast, Mbed-like clustering for guide tree calculation + + --mbed-iter + Use Mbed-like clustering also during iteration + + +In order to produce a multiple alignment Clustal-Omega requires a +guide tree which defines the order in which sequences/profiles are +aligned. A guide tree in turn is constructed, based on a distance +matrix. Conventionally, this distance matrix is comprised of all the +pair-wise distances of the sequences. The distance measure +Clustal-Omega uses for pair-wise distances of un-aligned sequences is +the k-tuple measure [4], which was also implemented in clustal1.83 and +clustalW2 [5,6]. If the sequences inputted via -i are aligned +Clustal-Omega uses the Kimura-corrected pairwise aligned identities +[7]. The computational effort (time/memory) to calculate and store a +full distance matrix grows quadratically with the number of +sequences. Clustal-Omega can improve this scalability to N*log(N) by +employing a fast clustering algorithm called mBed [2]; this option is +invoked by specifying the --mbed flag. + +Clustal-Omega uses Muscle's [8] fast UPGMA implementation to construct +its guide trees from the distance matrix. By default, the distance +matrix is used internally to construct the guide tree and is then +discarded. By specifying --distmat-out the internal distance matrix +can be written to file. The guide trees by default are used +internally to guide the multiple alignment and are then discarded. By +specifying the --guidetree-out option these internal guide trees can +be written out to file. Conversely, the distance calculation and/or +guide tree building stage can be skipped, by reading in a +pre-calculated distance matrix and/or pre-calculated guide tree. These +options are invoked by specifying the --distmat-in and/or +--guidetree-in flags, respectively. However, distance matrix reading +is disabled in the current version. By default, distance matrix and +guide tree files are not over-written, if a file with the specified +name already exists. In this case Clustal-Omega aborts during the +command-line processing stage. To force over-writing of already +existing files use the --force flag (see MISCELLANEOUS). + +Guide trees can be iterated to refine the alignment (see section +ITERATION). Clustal-Omega takes the alignment, that was produced +initially and constructs a new distance matrix from this +alignment. The distance measure used at this stage is the Kimura +distance [7]. By default, Clustal-Omega constructs a full distance +matrix at this stage, which will then be used to create an improved +(iterated) new guide tree. To use mBed like clustering at this stage +the --mbed-iter flag has to be set. While Kimura distances in general +are much faster to calculate than k-tuple distances, time and memory +requirements still scale quadratically with the number of sequences +and mBed-type clustering should be considered for large cases. + + + +ALIGNMENT OUTPUT: + + -o, --out, --outfile={file,-} Multiple sequence alignment output file (default: stdout) + + --outfmt={a2m=fa[sta],clu[stal],msf,phy[lip],selex,st[ockholm],vie[nna]} MSA output file format (default: fasta) + + +By default Clustal-Omega writes its results (alignments) to stdout. An +output file can be specified with the -o flag. Output to stdout is not +possible in verbose mode (-v, see MISCELLANEOUS) as verbose/debugging +messages would interfere with the alignment output. By default, +alignment files are not over-written, if a file with the specified +name already exists. In this case Clustal-Omega aborts during the +command-line processing stage. To force over-writing of already +existing files use the --force flag (see MISCELLANEOUS). + +Clustal-Omega can output alignments in various formats by setting the +--outfmt flag: + + * for Fasta format set: --outfmt=a2m or --outfmt=fa or --outfmt=fasta + + * for Clustal format set: --outfmt=clu or --outfmt=clustal + + * for Msf format: set --outfmt= msf + + * for Phylip format set: --outfmt=phy or --outfmt=phylip + + * for Selex format set: --outfmt=selex + + * for Stockholm format set: --outfmt=st or --outfmt=stockholm + + * for Vienna format set: --outfmt=vie or --outfmt=vienna + + +ITERATION: + + --iterations, --iter=<n> Number of (combined guide tree/HMM) iterations + + --max-guidetree-iterations=<n> Maximum guide tree iterations + + --max-hmm-iterations=<n> Maximum number of HMM iterations + + +By default, Clustal-Omega calculates (or reads in) a guide tree and +performs a multiple alignment in the order specified by this guide +tree. This alignment is then outputted. Clustal-Omega can 'iterate' +its guide tree. The hope is that the (Kimura) distances, that can be +derived from the initial alignment, will give rise to a better guide +tree, and by extension, to a better alignment. + +A similar rationale applies to HMM-iteration. MSAs in general are very +'vulnerable' at their early stages. Sequences that are aligned at an +early stage remain fixed for the rest of the MSA. Another way of +putting this is: 'once a gap, always a gap'. This behaviour can be +mitigated by HMM iteration. An initial alignment is created and turned +into a HMM. This HMM can help in a new round of MSA to 'anticipate' +where residues should align. This is using the HMM as an External +Profile and carrying out iterative EPA. In practice, individual +sequences and profiles are aligned to the External HMM, derived after +the initial alignment. Pseudo-count information is then transferred to +the (internal) HMM, corresponding to the individual +sequence/profile. The now somewhat 'softened' sequences/profiles are +then in turn aligned in the order specified by the guide +tree. Pseudo-count transfer is reduced with the size of the +profile. Individual sequences attain the greatest pseudo-count +transfer, larger profiles less so. Pseudo-count transfer to profiles +larger than, say, 10 is negligible. The effect of HMM iteration is +more pronounced in larger test sets (that is, with more sequences). + +Both, HMM- and guide tree-iteration come at a cost of increasing the +run-time. One round of guide tree iteration adds on (roughly) the time +it took to construct the initial alignment. If, for example, the +initial alignment took 1min, then it will take (roughly) 2min to +iterate the guide tree once, 3min to iterate the guide tree twice, and +so on. HMM-iteration is more costly, as each round of iteration adds +three times the time required for the alignment stage. For example, if +the initial alignment took 1min, then each additional round of HMM +iteration will add on 3min; so 4 iterations will take 13min +(=1min+4*3min). The factor of 3 stems from the fact that at every +stage both intermediate profiles have to be aligned with the +background HMM, and finally the (softened) HMMs have to be aligned as +well. All times are quoted for single processors. + +By default, guide tree iteration and HMM-iteration are coupled. This +means, at each iteration step both, guide tree and HMM, are +re-calculated. This is invoked by setting the --iter flag. For +example, if --iter=1, then first an initial alignment is produced +(without external HMM background information and using k-tuple +distances to calculate the guide tree). This initial alignment is then +used to re-calculate a new guide tree (using Kimura distances) and to +create a HMM. The new guide tree and the HMM are then used to produce +a new MSA. + +Iteration of guide tree and HMM can be de-coupled. This means that the +number of guide tree iterations and HMM iterations can be +different. This can be done by combining the --iter flag with the +--max-guidetree-iterations and/or the --max-hmm-iterations flag. The +number of guide tree iterations is the minimum of --iter and +--max-guidetree-iterations, while the number of HMM iterations is the +minimum of --iter and --max-hmm-iterations. If, for example, HMM +iteration should be performed 5 times but guide tree iteration should +be performed only 3 times, then one should set --iter=5 and +--max-guidetree-iterations=3. All three flags can be specified at the +same time (however, this makes no sense). It is not sufficient just to +specify --max-guidetree-iterations and --max-hmm-iterations but not +--iter. If any iteration is desired --iter has to be set. + + +LIMITS (will exit early, if exceeded): + + --maxnumseq=<n> Maximum allowed number of sequences + + --maxseqlen=<l> Maximum allowed sequence length + +Limits can be imposed on the number of sequences in the input file +and/or the lengths of the sequences. This cap can be set with the +--maxnumseq and --maxseqlen flags, respectively. Clustal-Omega will +exit early, if these limits are exceeded. + + +MISCELLANEOUS: + + --auto Set options automatically (might overwrite some of your options) + + --threads=<n> Number of processors to use + + -h, --help Print help and exit + + -v, --verbose Verbose output (increases if given multiple times) + + --version Print version information and exit + + --long-version Print long version information and exit + + --force Force file overwriting + + +Users may feel unsure which options are appropriate in certain +situations. The --auto flag tries to alleviate this problem and selects +accuracy/speed flags according to the number of sequences. For less +than 1,000 sequences mBed-clustering is unnecessary and the --mbed +flag is turned off. In this case the iteration is also turned off as +the effect of iteration is more noticeable for 'larger' problems. For +1,000 to 10,000 sequences full distance matrix calculation may become +to burdensome and the --mbed flag is turned on. Iterations are set to +1 as experience has shown that accuracy can be boosted in this +regime. However, for more than 10,000 sequences iterations are turned +off again. Improvement in accuracy may be substantial, however, the +computational overhead might be too costly for average users. In this +regime the --mbed flag remains turned on as full distance matrix +calculation may become prohibitive. Expert users may want to avoid +this flag and exercise more fine tuned control by selecting the +appropriate options manually. + +Certain parts of the MSA calculation have been parallelised. Most +noticeably, the distance matrix calculation, and certain aspects of +the HMM building stage. Clustal-Omega uses OpenMP. By default, +Clustal-Omega will attempt to use as many threads as possible. For +example, on a 4-core machine Clustal-Omega will attempt to use 4 +threads. The number of threads can be limited by setting the --threads +flag. This may be desirable, for example, in the case of +benchmarking/timing. + +Help is available by specifying the -h flag. + +By default Clustal-Omega does not print any information to stdout +(other than the final alignment, if no output file is +specified). Information concerning the progress of the alignment can +be obtained by specifying one verbosity flag (-v). This may be +desirable, to verify what Clustal-Omega is actually doing at the +moment. If two verbosity flags (-v -v) are specified, command-line +flags (explicitly and implicitly set) are printed in addition to the +progress report. Triple verbose level (-v -v -v) is the most verbose +level. In addition to single- and double-verbose information much more +information is displayed: input sequences and names, details of the +tree construction and intermediate alignments. Tree construction +information includes pairwise distances. The number of pairwise +distances scales with the square of the number of sequences, and +double verbose mode is probably only useful for a small number of +sequences. + +The current version number of Clustal-Omega can be displayed by +setting the --version flag. + +The current version number of Clustal-Omega as well as the code-name +and the build date can be displayed by setting the --long-version +flag. + +By default, Clustal-Omega does not over-write files. These can be (i) +alignment output, (ii) distance matrix and (iii) guide +tree. Overwriting can be forced by setting the --force flag. + + +EXAMPLES: + +./clustalo -i globin.fa + +Clustal-Omega reads the sequence file globin.fa, aligns the sequences +and prints the result to screen in fasta/a2m format. + + +./clustalo -i globin.fa -o globin.sto --outfmt=st + +If the file globin.sto does not exist, then Clustal-Omega reads the +sequence file globin.fa, aligns the sequences and prints the result to +globin.sto in Stockholm format. If the file globin.sto does exist +already, then Clustal-Omega terminates the alignment process before +reading globin.fa. + + +./clustalo -i globin.fa -o globin.aln --outfmt=clu --force + +Clustal-Omega reads the sequence file globin.fa, aligns the sequences +and prints the result to globin.aln in Clustal format, overwriting the +file globin.aln, if it already exists. + + +./clustalo -i globin.fa --distmat-out=globin.mat --guidetree-out=globin.dnd --force + +Clustal-Omega reads the sequence file globin.fa, aligns the sequences, +prints the result to screen in fasta/a2m format (default), the guide +tree to globin.dnd and the distance matrix to globin.mat, overwriting +those files if they already exist. + + +./clustalo -i globin.fa --guidetree-in=globin.dnd + +Clustal-Omega reads the files globin.fa and globin.dnd, skipping +distance calculation and guide tree creation, using instead the guide +tree specified in globin.dnd. + + +./clustalo -i globin.fa --hmm-in=PF00042.hmm + +Clustal-Omega reads the sequence file globin.fa and the HMM file +PF00042.hmm (in HMMer2 or HMMer3 format). It then performs the +alignment, transferring pseudo-count information contained in +PF00042.hmm to the sequences/profiles during the MSA. + + +./clustalo -i globin.sto + +Clustal-Omega reads the file globin.sto (of aligned sequences in +Stockholm format). It converts the alignment into a HMM, de-aligns the +sequences and re-aligns them, transferring pseudo-count information to +the sequences/profiles during the MSA. The guide tree is constructed +using a full distance matrix of Kimura distances. + + +./clustalo -i globin.sto --dealign + +Clustal-Omega reads the file globin.sto (of aligned sequences in +Stockholm format). It de-aligns the sequences and then re-aligns +them. No HMM is produced in the process, no pseudo-count information +is transferred. Consequently, the output must be the same as for +unaligned output (like in the first example ./clustalo -i globin.fa) + + +./clustalo -i globin.fa --iter=2 + +Clustal-Omega reads the file globin.fa, creates a UPGMA guide tree +built from k-tuple distances, and performs an initial alignment. This +initial alignment is converted into a HMM and a new guide tree is +built from the Kimura distances of the initial alignment. The +un-aligned sequences are then aligned (for the second time but this +time) using pseudo-count information from the HMM created after the +initial alignment (and using the new guide tree). This second +alignment is then again converted into a HMM and a new guide tree is +constructed. The un-aligned sequences are then aligned (for a third +time), again using pseudo-count information of the HMM from the +previous step and the most recent guide tree. The final alignment is +written to screen. + + +./clustalo -i globin.fa --iter=5 --max-guidetree-iterations=1 + +Clustal-Omega reads the file globin.fa, creates a UPGMA guide tree +built from k-tuple distances, and performs an initial alignment. This +initial alignment is converted into a HMM and a new guide tree is +built from the Kimura distances of the initial alignment. The +un-aligned sequences are then aligned (for the second time but this +time) using pseudo-count information from the HMM created after the +initial alignment (and using the new guide tree). For the last 4 +iterations the guide tree is left unchanged and only HMM iteration is +performed. This means that intermediate alignments are converted to +HMMs, and these intermediate HMMs are used to guide the MSA during +subsequent iteration stages. + + +./clustalo -i globin.fa -o globin.a2m -v + +In case the file globin.a2m does not exist, Clustal-Omega reads the +file globin.fa, prints a progress report to screen and writes the +alignment in (default) Fasta format to globin.a2m. The progress report +consists of the number of threads used, the number of sequences read, +the current progress in the k-tuple distance calculation, completion +of the guide tree computation and current progress of the MSA stage. +If the file globin.a2m already exists Clustal-Omega aborts before +reading the file globin.fa. Note that in verbose mode an output file +has to be specified, because progress/debugging information, which is +printed to screen, would interfere with the alignment being printed to +screen. + + +./clustalo -i PF00042_full.fa --dealign --mbed --outfmt=vie -o PF00042_full.vie --force + +Clustal-Omega reads the file PF00042_full.fa. This file contains +several thousand aligned sequences. --dealign tells Clustal-Omega to +erase all alignment information and re-align the sequences from +scratch. As there are several thousand sequences calculating a full +distance matrix may be slow. It may therefore be desirable to use the +--mbed option. Clustal-Omega now will calculate pairwise distances to +a small number of reference sequences only. This will give a +significant speed-up. The speed-up is greater for larger families +(more sequences). The alignment is then written out in Vienna format +(fasta format all on one line, no line breaks per sequence) to file +PF00042_full.vie. + + +./clustalo --p1=globin.sto --p2=PF00042_full.vie -o globin+pf00042.fa + +Clustal-Omega reads files globin.sto and PF00042_full.vie of aligned +sequences (profiles). Both profiles are then aligned. The relative +positions of residues in both profiles are not changed during this +alignment, however, columns of gaps may be inserted into the profiles, +respectively. The final alignment is written to file globin+pf00042.fa +in fasta format. + + +./clustalo -i globin.fa --p1=PF00042_full.vie -o pf00042+globin.fa + +Clustal-Omega reads file globin.fa of un-aligned sequences and the +profile (of aligned sequences) in file PF00042_full.vie. A HMM is +created from the profile. This HMM is used to guide the alignment of +the un-aligned sequences in globin.fa. The profile that was generated +during this alignment of un-aligned globin.fa sequences is then +aligned to the input profile PF00042_full.vie. The relative positions +of residues in profile PF00042_full.vie is not changed during this +alignment, however, columns of gaps may be inserted into the +profile. The final alignment is output to file pf00042+globin.fa in +fasta format. The alignment in this example may be slightly different +from the alignment in the previous example, because no HMM guidance +was used generate the profile globin.sto. In this example HMM guidance +was used to align the sequences in globin.fa; the hope being that this +intermediate alignment will have profited from the bigger profile. + + + +LITERATURE: + +[1] Johannes Soding (2005) Protein homology detection by HMM-HMM + comparison. Bioinformatics 21 (7): 951–960. + +[2] Blackshields G, Sievers F, Shi W, Wilm A, Higgins DG. Sequence + embedding for fast construction of guide trees for multiple + sequence alignment. Algorithms Mol Biol. 2010 May 14;5:21. + +[3] http://www.genetics.wustl.edu/eddy/software/#squid + +[4] Wilbur and Lipman, 1983; PMID 6572363 + +[5] Thompson JD, Higgins DG, Gibson TJ. (1994). CLUSTAL W: improving + the sensitivity of progressive multiple sequence alignment through + sequence weighting, position-specific gap penalties and weight + matrix choice. Nucleic Acids Res., 22, 4673-4680. + +[6] Larkin MA, Blackshields G, Brown NP, Chenna R, McGettigan PA, + McWilliam H, Valentin F, Wallace IM, Wilm A, Lopez R, Thompson JD, + Gibson TJ, Higgins DG. (2007). Clustal W and Clustal X version + 2.0. Bioinformatics, 23, 2947-2948. + +[7] Kimura M (1980). "A simple method for estimating evolutionary + rates of base substitutions through comparative studies of + nucleotide sequences". Journal of Molecular Evolution 16: 111–120. + +[8] Edgar, R.C. (2004) MUSCLE: multiple sequence alignment with high + accuracy and high throughput.Nucleic Acids Res. 32(5):1792-1797. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/TODO Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,45 @@ +IMPORTANT +--------- + +- consensus output (sto,aln) and compatibilety with bioperl/biopython + +- Split Homfam refs in two. Use one part as background HMM, the other parts + for benchmarking + +- Implement meta flags: + accurate: --iterations 3 + default: --mbed --iterations 1 + fast: --mbed + and for more than 10k sequences: --mbed --mbed-iter + +- SSE instructions for hhalign (little use in ClustalO frontend; DD) + / + Patch new code which already contains SSE instructions + + also fix automake/configure then + +- Multi-HMMs; also for Pfam+iteration (FS) + +- Show degradation of alignment quality when using x reference sequences + added to y random/false sequences + (Lio Pachter) + +- Seed pre-alignment with M-Coffee, MSAProbs, ... + +- GUI/API: + Will have to catch/override exits from source. + find . -name \*.c -or -name \*.cpp -or -name \*.h | xargs grep 'exit(' + Also best to allow for user override of + void Fatal(char *msg, ...); + void Error(char *msg, ...); + void Warn(char *msg, ...); + void Info(int level, char *msg, ...); + + +- Soeding: DNA/RNA alignment incl. reading of nucleotide HMMs + +- Automatic HMM-selection/search/download for input + +- Structure input: Psipred predictions are apparently part of their + hhms and should therefore be ready to use (part automatic + HMM-selection)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/aclocal.m4 Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,997 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, +[m4_warning([this file was generated for autoconf 2.65. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + + +# Copyright (C) 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +AC_DEFUN([AM_WITH_DMALLOC], +[AC_MSG_CHECKING([if malloc debugging is wanted]) +AC_ARG_WITH(dmalloc, +[ --with-dmalloc use dmalloc, as in + http://www.dmalloc.com/dmalloc.tar.gz], +[if test "$withval" = yes; then + AC_MSG_RESULT(yes) + AC_DEFINE(WITH_DMALLOC,1, + [Define if using the dmalloc debugging malloc package]) + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + AC_MSG_RESULT(no) +fi], [AC_MSG_RESULT(no)]) +]) + +AU_DEFUN([fp_WITH_DMALLOC], [AM_WITH_DMALLOC]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar <conftest.tar]) + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ax_prefix_config_h.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/clustalo.pc.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: clustal-omega +Description: @PACKAGE_NAME@ library. +Version: @PACKAGE_VERSION@ +Requires: +Libs: -L${libdir} -lclustalo +Cflags: -I${includedir}/clustalo/ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/config.guess Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1533 @@ +#! /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, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-06-10' + +# 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 <per@bothner.com>. +# Please send patches to <config-patches@gnu.org>. 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 <config-patches@gnu.org>." + +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, 2006, 2007, 2008 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 -q __ELF__ + 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 ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + 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.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-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 <stdio.h> /* 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 <sys/systemcfg.h> + + 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:*:[456]) + 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 <stdlib.h> + #include <unistd.h> + + 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 -q __LP64__ + 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 <unistd.h> + 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 | genuineintel) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-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 ;; + 8664:Windows_NT:*) + echo x86_64-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:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + 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:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #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 -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + 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 ${UNAME_MACHINE}-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" + ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #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.[02]*:*) + 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' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/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 i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-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; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + 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; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; 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.[02]*:*) + 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 <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # 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 ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + 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 ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + 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 <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#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 <sys/param.h> + 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 <sys/param.h> +# 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 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +and + http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> 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:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/config.sub Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1693 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# Free Software Foundation, Inc. + +timestamp='2009-06-11' + +# 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 <config-patches@gnu.org>. 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 <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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* | \ + kopensolaris*-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 + ;; + -bluegene*) + os=-cnk + ;; + -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 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | 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[24]aeb | 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 | z80) + 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-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | 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[24]aeb-* | 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-* | tile-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # 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 + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + 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 + ;; + cr16) + basic_machine=cr16-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 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + 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 + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + 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 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + 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 + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + 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 + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + 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 + ;; + z80-*-coff) + basic_machine=z80-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[24]aeb | 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* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -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* | -cegcc* \ + | -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 + ;; + -dicos*) + os=-dicos + ;; + -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 + ;; + -cnk*|-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:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/configure Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,19827 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.65 for Clustal Omega 0.2.0. +# +# Report bugs to <clustalw@ucd.ie>. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and clustalw@ucd.ie +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +ECHO=${lt_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 <<_LT_EOF +$* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { 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. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +test -n "$DJDIR" || exec 7<&0 </dev/null +exec 6>&1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='Clustal Omega' +PACKAGE_TARNAME='clustal-omega' +PACKAGE_VERSION='0.2.0' +PACKAGE_STRING='Clustal Omega 0.2.0' +PACKAGE_BUGREPORT='clustalw@ucd.ie' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +AM_LDFLAGS +AM_CFLAGS +AM_CXXFLAGS +OPENMP_CXXFLAGS +OPENMP_CFLAGS +CXXCPP +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +lt_ECHO +RANLIB +AR +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +LIBTOOL +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +PACKAGE_CODENAME +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +enable_libtool_lock +with_openmp +with_dmalloc +enable_debug +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures Clustal Omega 0.2.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/clustal-omega] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of Clustal Omega 0.2.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-debug Enable debugging (default=no) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --without-openmp Do not use OpenMP + --with-dmalloc use dmalloc, as in + http://www.dmalloc.com/dmalloc.tar.gz + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + LIBS libraries to pass to the linker, e.g. -l<library> + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if + you have headers in a nonstandard directory <include dir> + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to <clustalw@ucd.ie>. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +Clustal Omega configure 0.2.0 +generated by GNU Autoconf 2.65 + +Copyright (C) 2009 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( cat <<\_ASBOX +## ------------------------------ ## +## Report this to clustalw@ucd.ie ## +## ------------------------------ ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case <limits.h> declares $2. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_type + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include <stdio.h> +#include <stdlib.h> +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 <conftest.val; ac_retval=0 +else + ac_retval=1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f conftest.val + + fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_compute_int +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by Clustal Omega $as_me 0.2.0, which was +generated by GNU Autoconf 2.65. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +PACKAGE_CODENAME="IbiMeVidebunt" + +# The AC_INIT macro can take any source file as an argument. It just +# checks that the file is there, which should, in turn, mean that the +# source directory is there. AC_INIT generates the following m4 +# macros, output variables and preprocessor symbols: + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: + + Welcome to $PACKAGE_NAME - version $PACKAGE_VERSION ($PACKAGE_CODENAME) + + +NMMMMMMMMMS= + MMMMM? :MMMMM8 + IMMMMS MMMMM, + ~MMMMN ,MMMMM + =MMMMM MMMMM + ?MMMMM +MMMMM + MMMMMS MMMMM + MMMMM MMMMM: + MMMMM MMMMM+ + MMMMM MMMMM~ + MMMMM MMMMM + MMMMMZ MMMMM + MMMMM ,MMMMZ + MMMM8 MMMM+ + MMMMS MMMM, + MMMMO MMMM + ,N SMMM MMM8 +8 + ,M7 M+ M+ :M8 + ,MMMMMMMMMMMMI MMMMMMMMMMMM8 + ,MMMMMMMMMMMM8 MMMMMMMMMMMM8 + ,MMMMMMMMMMMMN MMMMMMMMMMMM8 + + " >&5 +$as_echo "$as_me: + + Welcome to $PACKAGE_NAME - version $PACKAGE_VERSION ($PACKAGE_CODENAME) + + +NMMMMMMMMMS= + MMMMM? :MMMMM8 + IMMMMS MMMMM, + ~MMMMN ,MMMMM + =MMMMM MMMMM + ?MMMMM +MMMMM + MMMMMS MMMMM + MMMMM MMMMM: + MMMMM MMMMM+ + MMMMM MMMMM~ + MMMMM MMMMM + MMMMMZ MMMMM + MMMMM ,MMMMZ + MMMM8 MMMM+ + MMMMS MMMM, + MMMMO MMMM + ,N SMMM MMM8 +8 + ,M7 M+ M+ :M8 + ,MMMMMMMMMMMMI MMMMMMMMMMMM8 + ,MMMMMMMMMMMM8 MMMMMMMMMMMM8 + ,MMMMMMMMMMMMN MMMMMMMMMMMM8 + + " >&6;} +# +# Created with http://www.glassgiant.com/ascii/ and Wikipedia's Omega +# Replaced all dollars with S's. +# +# +# ,MMMMMMMMMD: MMMMM +# NMMMMMMMMMMMMMM+ SMMMM +# DMMMMMMMMMMMMMMMMMM, +MMMM +# MMMMMMMMM8ZSO8MMMMMMMM +MMMM +# MMMMM7 SMMMM +MMMM +# MMMO MM? +MMMM +# ?MMI NMIIMMMM +# MMM MMMMMMM +# MM +# MN +# MD +# MM +# MM? ,~+ISON +# =MMI MMSOMMMM +# MMMZ MMS +MMMM +# MMMM8: :NMMM +MMMM +# MMMMMMMMMDOODMMMMMMMMM +MMMM +# MMMMMMMMMMMMMMMMMMMM +MMMM +# OMMMMMMMMMMMMMMZ SMMMM +# MMMMMMMMMM+ MMMMM +# + + +# AC_MSG_NOTICE([Configuring for your system...]) + + # 2.60 needed for AC_USE_SYSTEM_EXTENSIONS +# consider 2.64 which allows to define a URL as well + +# The AM_INIT_AUTOMAKE line adds several standard checks. +# This macro is always needed for automake +# Obsolete: It takes the program name and version number as arguments. +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done +done +if test -z "$ac_aux_dir"; then + as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# 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". + as_fn_error "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='clustal-omega' + VERSION='0.2.0' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +# config header: provides a way for people to customise the +# configuration for their platform, via #defines. config.h.in can be +# generated automatically with the autoheader tool. However, you need +# a stamp-h file in your project to ensure that automake regenerates +# config.h from config.h.in. Type 'touch stamp-h' to add this file to +# your project. +# +ac_config_headers="$ac_config_headers src/config.h" + + +# the following allows to install a copy config.h for libclustalo in a +# namespace like way, i.e. no name clash with your own config.h + +ac_config_commands="$ac_config_commands src/clustal-omega-config.h" + + +# This macro was introduced in Autoconf 2.60. If possible, enable +# extensions to C or Posix on hosts that normally disable the +# extensions. +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdio.h> +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = x""yes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + + +# for cross compilation +# +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +## AC_CANONICAL_BUILD +## AC_CANONICAL_TARGET + +# Set the @SET_MAKE@ variable=make if $(MAKE) not set +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + +# AC_PROG_RANLIB will allow you to build code in sub-directories into +# temporary libraries, which make will then link in with the rest of +# the code. +# Rendered obsolte by LT_INIT: AC_PROG_RANLIB +#AC_PROG_LIBTOOL +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.2.6b' +macro_revision='1.3017' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${ac_cv_path_SED+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if test "${ac_cv_path_FGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname 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 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + 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 variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test "${lt_cv_path_NM+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_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 + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + 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 + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$ac_tool_prefix"; then + for ac_prog in "dumpbin -symbols" "link -dump -symbols" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DUMPBIN+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in "dumpbin -symbols" "link -dump -symbols" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if test "${lt_cv_nm_interface+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:5341: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:5344: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:5347: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_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; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # 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"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # 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` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +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' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJDUMP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + 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 extended 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 +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + 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*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + 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|DragonFly)/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 + case $host_cpu in + ia64*) + 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 + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + 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 + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + 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=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + 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 + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +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 + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +# 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]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && 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 $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_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_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && 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" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf 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 + +fi + +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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + + + + + + + + + + + + + + + + + + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +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 { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; 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 6552 "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + 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 + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + 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" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + 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 + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_NMEDIT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_LIPO+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OTOOL64+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if test "${lt_cv_apple_cc_single_mod+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; 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 +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; 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 +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; 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 +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + 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 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + + + + + + + + + + + + + + +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. +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 delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + 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 + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + 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 <<_LT_EOF 1>&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 + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + 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 + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + 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 <<_LT_EOF 1>&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 + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$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(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## 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... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:7814: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:7818: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # 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_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + + + + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8153: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:8157: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker 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>&5 + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8258: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:8262: \$? = $ac_status" >&5 + if (exit $ac_status) && 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 + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:8313: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:8317: \$? = $ac_status" >&5 + if (exit $ac_status) && 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 + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + 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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp 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'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # 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. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # 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 + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&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. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$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)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&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. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$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. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + 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 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + 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. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + 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 + : + else + # We have old collect2 + hardcode_direct=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 + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + 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='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + 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. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# 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 "$lt_aix_libpath_sed"` +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# 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 "$lt_aix_libpath_sed"` +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${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. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$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)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=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*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$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' + else + archive_cmds='$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' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo(void) {} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$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' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='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' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=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. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds 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. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +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" +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}${shared_ext}$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}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + 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<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + 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}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + 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' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-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 + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $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 + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$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 + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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 + case $host_cpu in + ia64*) + shrext_cmds='.so' + 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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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 + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + 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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + 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}" + hardcode_into_libs=yes + ;; + +# 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* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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 + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # 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' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_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}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$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' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $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}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + 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" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${shared_ext}$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.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=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${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = 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 + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != 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_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; 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 + + + + + + + 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 + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = x""yes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = x""yes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + 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" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line 10697 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#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 + +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); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line 10793 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#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 + +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); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + 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 + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +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" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + 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 + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# AC_PROG_INSTALL will generate an install target so that users may +# just type 'make install' to install the software. + + +# check for C++ preprocessor and compiler and the library compiler +# (might change the compiler flags) +# +# Determine a C compiler to use. If using the GNU C compiler, set +# shell variable GCC to `yes'. If output variable CFLAGS was not +# already set, set it to `-g -O2' for the GNU C compiler (`-O2' on +# systems where GCC does not accept `-g'), or `-g' for other +# compilers. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +# Set output variable CPP to a command that runs the C preprocessor. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +# +# Determine a C++ compiler to use. If output variable CXXFLAGS was not +# already set, set it to `-g -O2' for the GNU C++ compiler (`-O2' on +# systems where G++ does not accept `-g'), or `-g' for other +# compilers. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # 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. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + 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 + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +_lt_caught_CXX_error=yes; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # 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. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname 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 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + 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 variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${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" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + 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. + archive_cmds_CXX='$CC -shared -nostdlib $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 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + 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 + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + 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. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + 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 + : + else + # We have old collect2 + hardcode_direct_CXX=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 + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + 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='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + 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. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# 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 "$lt_aix_libpath_sed"` +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# 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 "$lt_aix_libpath_sed"` +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${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. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=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 + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$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' + # 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 "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$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' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + 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) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_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. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + 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. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.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$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5]* | *pgcpp\ [1-5]*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$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 + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # 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 "X$templist" | $Xsed -e "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 "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # 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. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | 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. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$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 "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # 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 "X$templist" | $Xsed -e "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 "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$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" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # 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 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # 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. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$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. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='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 $compiler_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 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='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 $compiler_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 | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## 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... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # 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_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--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_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14502: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:14506: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker 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>&5 + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14601: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:14605: \$? = $ac_status" >&5 + if (exit $ac_status) && 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 + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14653: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:14657: \$? = $ac_status" >&5 + if (exit $ac_status) && 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 + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + 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 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[4-9]*) + # 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 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + linux* | k*bsd*-gnu) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX 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. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +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" +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}${shared_ext}$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}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + 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<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + 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}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + 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' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-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 + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $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 + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$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 + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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 + case $host_cpu in + ia64*) + shrext_cmds='.so' + 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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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 + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + 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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + 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}" + hardcode_into_libs=yes + ;; + +# 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* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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 + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # 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' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_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}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$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' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $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}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + 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" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${shared_ext}$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.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=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${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = 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 + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != 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_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; 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 + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Set CXXCPP to a command that runs the C++ preprocessor +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +# +# reset compiler flags to initial flags +#CXXFLAGS=$OLD_CXXFLAGS + + + + +# safety check: AC_CONFIG_SRCDIR([src/clustal.h]) + +# Let source files know in which context they are being used + +$as_echo "#define CLUSTALO 1" >>confdefs.h + + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_CODENAME "$PACKAGE_CODENAME" +_ACEOF + + + +# Get svn revision +#AC_PATH_PROG(svnversioncommand, svnversion) +#if test "X$svnversioncommand" = "X" || test `$svnversioncommand -n '.'` = "exported"; then +#AC_DEFINE_UNQUOTED(SVN_VERSION, ["`cat saved_svn_version.txt`"], [repository svn version]) +#else +#AC_DEFINE_UNQUOTED(SVN_VERSION, ["`svnversion -n`"], [repository svn version]) +#`svnversion -n > saved_svn_version.txt` +#fi + + + + +# AW: we might need this in the future +# +case "$host_os" in +linux*) +# AC_DEFINE(LINUX,1,[This is a Linux system]) + +cat >>confdefs.h <<_ACEOF +#define LINUX 1 +_ACEOF + +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, false) +# XTRA_CPPLIBS=-lstdc++ +# LIBEXT=.so + ;; +freebsd*) + +cat >>confdefs.h <<_ACEOF +#define SOMEBSD 1 +_ACEOF + +# AC_CHECK_LIB(c_r, pthread_create) +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, true) +# XTRA_CPPLIBS=-lstdc++ +# LIBEXT=.so + ;; +openbsd*) + +cat >>confdefs.h <<_ACEOF +#define SOMEBSD 1 +_ACEOF + +# AC_CHECK_LIB(c_r, pthread_create) +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, true) +# XTRA_CPPLIBS=-lstdc++ +# LIBEXT=.so + ;; +netbsd*) + +cat >>confdefs.h <<_ACEOF +#define SOMEBSD 1 +_ACEOF + +# AC_CHECK_LIB(c_r, pthread_create) +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, true) +# XTRA_CPPLIBS=-lstdc++ +# LIBEXT=.so + ;; +*solaris*) + +cat >>confdefs.h <<_ACEOF +#define SOLARIS 1 +_ACEOF + +# AC_CHECK_LIB(resolv, res_init) +# XTRA_CPPLIBS=-lstdc++ +# AM_CONDITIONAL(HAVE_GNU_LD, false) +# AM_CONDITIONAL(SOMEBSD, false) +# CFLAGS="-D_POSIX_PTHREAD_SEMANTICS $CFLAGS" +# LIBEXT=.so + ;; +darwin*) + +cat >>confdefs.h <<_ACEOF +#define DARWIN 1 +_ACEOF + +# AM_CONDITIONAL(HAVE_GNU_LD, false) +# AM_CONDITIONAL(SOMEBSD, false) +# CFLAGS="-fno-common $CFLAGS" +# LIBEXT=.so + ;; +cygwin*) + +cat >>confdefs.h <<_ACEOF +#define CYGWIN 1 +_ACEOF + +# LDFLAGS="$LDFLAGS -no-undefined" +# AM_CONDITIONAL(SOMEBSD, false) +# AM_CONDITIONAL(HAVE_GNU_LD, false) +# LIBEXT=.dll + ;; +mingw*) + +cat >>confdefs.h <<_ACEOF +#define MINGW 1 +_ACEOF + +# AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system]) +# AC_CHECK_LIB(intl, gettext) +# AC_CHECK_LIB(ws2_32, _head_libws2_32_a,,[AC_MSG_ERROR([libextractor requires Winsock2])]) +# AC_CHECK_LIB(plibc, plibc_init,,[AC_MSG_ERROR([libextractor requires PlibC])]) +# LDFLAGS="$LDFLAGS -no-undefined -Wl,--export-all-symbols" +# LIBSOLD=$LIBS +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, false) +# LIBEXT=.dll + ;; +*) +# AC_MSG_RESULT(Unrecognised OS $host_os) + +cat >>confdefs.h <<_ACEOF +#define OTHEROS 1 +_ACEOF + +# AC_MSG_RESULT(otheros) +# AM_CONDITIONAL(HAVE_GNU_LD, false) +# AM_CONDITIONAL(SOMEBSD, false) +# LIBEXT=.so + ;; +esac + + + +# Checks for standard header files. +# obsolescent according to http://www.gnu.org/software/hello/manual/autoconf/Particular-Headers.html +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <ctype.h> +#include <stdlib.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# Guess the next one is obsolete as well then? +for ac_header in assert.h ctype.h float.h limits.h math.h memory.h stdarg.h stdio.h stdlib.h string.h time.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +# awk '/^#include *</ {print $2}' $(find src/ -name \*.[ch] -or -name \*.cpp) | grep -v argtable2.h | sort -u | tr -d '<>' + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + +# Checks for library functions. +# AC_CHECK_FUNCS(strdup strstr strchr erand48) +# AW is there an automatic way to extract library functions used in the program? + + +# explicit libm check +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for log in -lm" >&5 +$as_echo_n "checking for log in -lm... " >&6; } +if test "${ac_cv_lib_m_log+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char log (); +int +main () +{ +return log (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_log=yes +else + ac_cv_lib_m_log=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_log" >&5 +$as_echo "$ac_cv_lib_m_log" >&6; } +if test "x$ac_cv_lib_m_log" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBM 1 +_ACEOF + + LIBS="-lm $LIBS" + +else + as_fn_error "Could not find libm" "$LINENO" 5 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for log2 in -lm" >&5 +$as_echo_n "checking for log2 in -lm... " >&6; } +if test "${ac_cv_lib_m_log2+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char log2 (); +int +main () +{ +return log2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_log2=yes +else + ac_cv_lib_m_log2=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_log2" >&5 +$as_echo "$ac_cv_lib_m_log2" >&6; } +if test "x$ac_cv_lib_m_log2" = x""yes; then : + +$as_echo "#define HAVE_LOG2 1" >>confdefs.h + +fi + + + +# --- argtable header and library check +# +# +for ac_header in argtable2.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "argtable2.h" "ac_cv_header_argtable2_h" "$ac_includes_default" +if test "x$ac_cv_header_argtable2_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ARGTABLE2_H 1 +_ACEOF + +else + as_fn_error "Could not find argtable2.h. Try $ ./configure CFLAGS='-Iyour-argtable2-include-path" "$LINENO" 5 +fi + +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for arg_parse in -largtable2" >&5 +$as_echo_n "checking for arg_parse in -largtable2... " >&6; } +if test "${ac_cv_lib_argtable2_arg_parse+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-largtable2 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char arg_parse (); +int +main () +{ +return arg_parse (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_argtable2_arg_parse=yes +else + ac_cv_lib_argtable2_arg_parse=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_argtable2_arg_parse" >&5 +$as_echo "$ac_cv_lib_argtable2_arg_parse" >&6; } +if test "x$ac_cv_lib_argtable2_arg_parse" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBARGTABLE2 1 +_ACEOF + + LIBS="-largtable2 $LIBS" + +else + as_fn_error "Could not find libargtable2. Try $ ./configure LDFLAGS=\"-Lyour-argtable2-lib-path'" "$LINENO" 5 +fi + + + +# enable python if requested (--with-python) +# +#AC_ARG_WITH([python], +# [AS_HELP_STRING([--with-python], +# [Enable Python Interface])], +# [with_python=$withval], +# [with_python=no]) +#if test "$with_python" = "yes"; then +# AC_MSG_CHECKING([for python-config to get compiler flags]) +# AC_CHECK_PROG(python_config, 'python-config', yes) +# if test "${python_config}" != "yes"; then +# AC_MSG_ERROR("Could not run python-config.") +# fi +# PYTHON_CFLAGS=`python-config --cflags` +# PYTHON_LDFLAGS=`python-config --ldflags` +# AC_DEFINE([PYTHON_ENABLED], [1], [define for python usage]) +#fi +#AC_SUBST(PYTHON_CFLAGS) +#AC_SUBST(PYTHON_LDFLAGS) + + +# --- SSE support +# "One instruction to do the same operation on 4 packed elements simultaneously." +# +# http://www.codeproject.com/KB/recipes/sseintro.aspx?msg=568491 +# http://www.drdobbs.com/go-parallel/blog/archives/2010/03/getting_amazing.html +# http://software.intel.com/file/1000 +# +# AC_MSG_CHECKING(for SSE in current arch/CFLAGS) +# AC_LINK_IFELSE([ +# AC_LANG_PROGRAM([[ +# #include <xmmintrin.h> +# __m128 testfunc(float *a, float *b) { +# return _mm_add_ps(_mm_loadu_ps(a), _mm_loadu_ps(b)); +# } +# ]])], +# [has_sse=yes], [has_sse=no] +# ) +# AC_MSG_RESULT($has_sse) +# +# AC_ARG_ENABLE([sse], +# [AS_HELP_STRING([--enable-sse], +# [Enable SSE support])], +# [has_sse="$enableval"], +# [has_sse=no]) +# +# if test x"$has_sse" = x"yes"; then +# AC_DEFINE([USE_SSE], , [Enable SSE support]) +# CFLAGS="${CFLAGS} -msse" +# fi + + +# --- openmp +# + +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_openmp.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_OPENMP([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro tries to find out how to compile programs that use OpenMP a +# standard API and set of compiler directives for parallel programming +# (see http://www-unix.mcs/) +# +# On success, it sets the OPENMP_CFLAGS/OPENMP_CXXFLAGS/OPENMP_F77FLAGS +# output variable to the flag (e.g. -omp) used both to compile *and* link +# OpenMP programs in the current language. +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. +# +# If you want to compile everything with OpenMP, you should set: +# +# CFLAGS="$CFLAGS $OPENMP_CFLAGS" +# #OR# CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS" +# #OR# FFLAGS="$FFLAGS $OPENMP_FFLAGS" +# +# (depending on the selected language). +# +# The user can override the default choice by setting the corresponding +# environment variable (e.g. OPENMP_CFLAGS). +# +# ACTION-IF-FOUND is a list of shell commands to run if an OpenMP flag is +# found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it is +# not found. If ACTION-IF-FOUND is not specified, the default action will +# define HAVE_OPENMP. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <http://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 8 + + + +# Check whether --with-openmp was given. +if test "${with_openmp+set}" = set; then : + withval=$with_openmp; +fi + +if test "x$with_openmp" = "xno"; then : + +else + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenMP flag of C compiler" >&5 +$as_echo_n "checking for OpenMP flag of C compiler... " >&6; } +if test "${ax_cv_c_openmp+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + saveCFLAGS=$CFLAGS +ax_cv_c_openmp=unknown +# Flags to try: -fopenmp (gcc), -openmp (icc), -mp (SGI & PGI), +# -xopenmp (Sun), -omp (Tru64), -qsmp=omp (AIX), none +ax_openmp_flags="-fopenmp -openmp -mp -xopenmp -omp -qsmp=omp none" +if test "x$OPENMP_CFLAGS" != x; then + ax_openmp_flags="$OPENMP_CFLAGS $ax_openmp_flags" +fi +for ax_openmp_flag in $ax_openmp_flags; do + case $ax_openmp_flag in + none) CFLAGS=$saveC ;; + *) CFLAGS="$saveCFLAGS $ax_openmp_flag" ;; + esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char omp_set_num_threads (); +int +main () +{ +return omp_set_num_threads (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_c_openmp=$ax_openmp_flag; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +done +CFLAGS=$saveCFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_openmp" >&5 +$as_echo "$ax_cv_c_openmp" >&6; } +if test "x$ax_cv_c_openmp" = "xunknown"; then + : +else + if test "x$ax_cv_c_openmp" != "xnone"; then + OPENMP_CFLAGS=$ax_cv_c_openmp + fi + +$as_echo "#define HAVE_OPENMP 1" >>confdefs.h + + +fi + + +fi + +# according to http://beagle-lib.googlecode.com/svn-history/r824/trunk/configure.ac: +# "OpenMP checker only defines for C when compiling both C and C++" +OPENMP_CXXFLAGS=$OPENMP_CFLAGS + + +# version 2: enable openmp only if explicitely asked for it +#AC_ARG_ENABLE(openmp, AS_HELP_STRING([--enable-openmp], [Multi-threaded parallel version using OpenMP])) +#if test -n "${enable_openmp}" -a x"${enable_openmp}" != x"no"; then +# m4_include([m4/ax_openmp.m4]) +# AX_OPENMP(AC_DEFINE(HAVE_OPENMP, 1, [enable OpenMP support]), +# AC_MSG_ERROR([Compiler does not seem to support OpenMP])) +# AC_SUBST(OPENMP_CFLAGS) +# AC_SUBST(OPENMP_CXXFLAGS) +#fi + +# --- squid +# +# +# Extra checks for squid; see their configure, config.log, squidconf.h +# etc. For example, I'm not sure about USE_HOST_BYTESWAP_FUNCTIONS, +# SIZEOF_UNSIGNED_LONG, HAVE_STRTOUL and HAVE_STRTOULL +# +# Might not just have to set compiler flags but create use squidconf.h.in +# +# The following hopefully takes about byte ordering (big-endian...). +# My hope is that it will set WORDS_BIGENDIAN and +# USE_HOST_BYTESWAP_FUNCTIONS (as used by squid) if necessary: +# + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + #include <sys/param.h> + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <sys/types.h> + #include <sys/param.h> + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <limits.h> + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $PACKAGE_NAME hasn't been tested on Big-Endian machines...expecting trouble!" >&5 +$as_echo "$as_me: WARNING: $PACKAGE_NAME hasn't been tested on Big-Endian machines...expecting trouble!" >&2;};; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + +for ac_func in ntohs ntohl ntons ntonl +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +# +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned short" >&5 +$as_echo_n "checking size of unsigned short... " >&6; } +if test "${ac_cv_sizeof_unsigned_short+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned short))" "ac_cv_sizeof_unsigned_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_short" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (unsigned short) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_unsigned_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_short" >&5 +$as_echo "$ac_cv_sizeof_unsigned_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_SHORT $ac_cv_sizeof_unsigned_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned int" >&5 +$as_echo_n "checking size of unsigned int... " >&6; } +if test "${ac_cv_sizeof_unsigned_int+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned int))" "ac_cv_sizeof_unsigned_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (unsigned int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_unsigned_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_int" >&5 +$as_echo "$ac_cv_sizeof_unsigned_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5 +$as_echo_n "checking size of unsigned long... " >&6; } +if test "${ac_cv_sizeof_unsigned_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (unsigned long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_unsigned_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5 +$as_echo "$ac_cv_sizeof_unsigned_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5 +$as_echo_n "checking size of unsigned long long... " >&6; } +if test "${ac_cv_sizeof_unsigned_long_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (unsigned long long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_unsigned_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5 +$as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long +_ACEOF + + +# +for ac_func in stroul strtoull +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in ftello fseeko +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in ftello64 fseeko64 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in ftell64 fseek64 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +# +ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" +if test "x$ac_cv_type_off_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF + +fi + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fpos_t" >&5 +$as_echo_n "checking size of fpos_t... " >&6; } +if test "${ac_cv_sizeof_fpos_t+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fpos_t))" "ac_cv_sizeof_fpos_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_fpos_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (fpos_t) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_fpos_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_fpos_t" >&5 +$as_echo "$ac_cv_sizeof_fpos_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_FPOS_T $ac_cv_sizeof_fpos_t +_ACEOF + + +# +# struct stat64 and stat64 test: +# version 1: +#AC_CHECK_TYPE(struct stat64, +# [AC_CHECK_FUNC([stat64], +# AC_DEFINE([HAVE_STAT64], [1], [Define if you have the stat64 function]))]) +# version 2: +#AC_MSG_CHECKING(for struct stat64) +#AC_CACHE_VAL(sc_cv_type_stat64, +#[AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 s;], +#[sc_cv_type_stat64=yes], +#[sc_cv_type_stat64=no])]) +#if test $sc_cv_type_stat64 = yes; then +# AC_MSG_RESULT($sc_cv_type_stat64) +# AC_CHECK_FUNC([stat64], AC_DEFINE([HAVE_STAT64], [1], [Define if you have the stat64 function])) +# #AC_DEFINE(HAVE_STAT64, [1], [Define if you have the stat64 function]) +#fi +# +# +# Above fails on myosin because storage size of struct 64 is unknown: +# ssi.c:480: error: storage size of ‘s1’ isn’t known +# +# On my MacBook OS X 10.6 I get: +# ssi.c:481: warning: ‘stat64’ is deprecated (declared at /usr/include/sys/stat.h:465) +# +# So forget about it: we won't use stat64 or define HAVE_STAT64 and +# consequently do no tests here +# + + + +# Add support for the Dmalloc package. If the user runs configure with +# --with-dmalloc, then define WITH_DMALLOC and add -ldmalloc to LIBS. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if malloc debugging is wanted" >&5 +$as_echo_n "checking if malloc debugging is wanted... " >&6; } + +# Check whether --with-dmalloc was given. +if test "${with_dmalloc+set}" = set; then : + withval=$with_dmalloc; if test "$withval" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define WITH_DMALLOC 1" >>confdefs.h + + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Check if svnversion is installed +#AC_PATH_PROG([SVNVERSION_BIN], [svnversionFIXME], [no]) +## checking if we build in a subversion WC +#wc_found="no"; +#if test "$SVNVERSION_BIN" != "no"; then +# SVNVERSION=`$SVNVERSION_BIN -n $srcdir` +# if test $SVNVERSION != "exported"; +# then +# AC_MSG_NOTICE($SVNVERSION); +# fi +#fi + + +# --- debugging +# +# +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with debug information" >&5 +$as_echo_n "checking whether to build with debug information... " >&6; } +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; debugit="$enableval" +else + debugit=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $debugit" >&5 +$as_echo "$debugit" >&6; } + +if test x"$debugit" = x"yes"; then + # User variables CFLAGS/CXXFLAGS are used last during compilation and + # can therefore overwrite system settings. + # + # if debugging was requested, add debugging info at the end of + # C[XX]FLAGS, which makes sure previous optimisation flags are + # overwritten (normally C[XX]FLAGS should not be modified as they + # are user variables): + # switch off assert etc + # AC_DEFINE([DEBUG],[],[Debug Mode]) + CFLAGS="${CFLAGS} -g -ansi -Wall -O0" + CXXFLAGS="${CXXFLAGS} -g -ansi -Wall -O0" +else + # switch off assert etc + +$as_echo "#define NDEBUG /**/" >>confdefs.h + + # if no debugging is requested, we make optimisation explicit + AM_CXXFLAGS="${AM_CXXFLAGS} -O3" + AM_CFLAGS="${AM_CFLAGS} -O3" +fi + + + + + + + + +ac_config_files="$ac_config_files Makefile src/Makefile clustalo.pc Doxyfile src/clustal/Makefile src/hhalign/Makefile src/kmpp/Makefile src/squid/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by Clustal Omega $as_me 0.2.0, which was +generated by GNU Autoconf 2.65. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to <clustalw@ucd.ie>." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +Clustal Omega config.status 0.2.0 +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2009 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +PACKAGE="$PACKAGE" +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' +predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' +postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +AR \ +AR_FLAGS \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +SHELL \ +ECHO \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_wl \ +lt_prog_compiler_pic \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_flag_spec_ld \ +hardcode_libdir_separator \ +fix_srcfile_path \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +fix_srcfile_path_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` + ;; +esac + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + "src/clustal-omega-config.h") CONFIG_COMMANDS="$CONFIG_COMMANDS src/clustal-omega-config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "clustalo.pc") CONFIG_FILES="$CONFIG_FILES clustalo.pc" ;; + "Doxyfile") CONFIG_FILES="$CONFIG_FILES Doxyfile" ;; + "src/clustal/Makefile") CONFIG_FILES="$CONFIG_FILES src/clustal/Makefile" ;; + "src/hhalign/Makefile") CONFIG_FILES="$CONFIG_FILES src/hhalign/Makefile" ;; + "src/kmpp/Makefile") CONFIG_FILES="$CONFIG_FILES src/kmpp/Makefile" ;; + "src/squid/Makefile") CONFIG_FILES="$CONFIG_FILES src/squid/Makefile" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' <conf$$subs.awk | sed ' +/^[^""]/{ + N + s/\n// +} +' >>$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' <confdefs.h | sed ' +s/'"$ac_delim"'/"\\\ +"/g' >>$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "src/clustal-omega-config.h":C) ac_prefix_conf_OUT=`echo src/clustal-omega-config.h` +ac_prefix_conf_DEF=`echo _$ac_prefix_conf_OUT | sed -e "y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:" -e "s/[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g"` +ac_prefix_conf_PKG=`echo $PACKAGE` +ac_prefix_conf_LOW=`echo _$ac_prefix_conf_PKG | sed -e "y:ABCDEFGHIJKLMNOPQRSTUVWXYZ-:abcdefghijklmnopqrstuvwxyz_:"` +ac_prefix_conf_UPP=`echo $ac_prefix_conf_PKG | sed -e "y:abcdefghijklmnopqrstuvwxyz-:ABCDEFGHIJKLMNOPQRSTUVWXYZ_:" -e "/^[0123456789]/s/^/_/"` +ac_prefix_conf_INP=`echo "" | sed -e 's/ *//'` +if test ".$ac_prefix_conf_INP" = "."; then + for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue + case "$ac_file" in + *.h) ac_prefix_conf_INP=$ac_file ;; + *) + esac + test ".$ac_prefix_conf_INP" != "." && break + done +fi +if test ".$ac_prefix_conf_INP" = "."; then + case "$ac_prefix_conf_OUT" in + */*) ac_prefix_conf_INP=`basename "$ac_prefix_conf_OUT"` + ;; + *-*) ac_prefix_conf_INP=`echo "$ac_prefix_conf_OUT" | sed -e "s/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*-//"` + ;; + *) ac_prefix_conf_INP=config.h + ;; + esac +fi +if test -z "$ac_prefix_conf_PKG" ; then + as_fn_error "no prefix for _PREFIX_PKG_CONFIG_H" "$LINENO" 5 +else + if test ! -f "$ac_prefix_conf_INP" ; then if test -f "$srcdir/$ac_prefix_conf_INP" ; then + ac_prefix_conf_INP="$srcdir/$ac_prefix_conf_INP" + fi fi + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&5 +$as_echo "$as_me: creating $ac_prefix_conf_OUT - prefix $ac_prefix_conf_UPP for $ac_prefix_conf_INP defines" >&6;} + if test -f $ac_prefix_conf_INP ; then + $as_echo "s/^#undef *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_]\\)/#undef $ac_prefix_conf_UPP""_\\1/" > conftest.prefix + $as_echo "s/^#undef *\\([abcdefghijklmnopqrstuvwxyz]\\)/#undef $ac_prefix_conf_LOW""_\\1/" >> conftest.prefix + $as_echo "s/^#define *\\([ABCDEFGHIJKLMNOPQRSTUVWXYZ_][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_UPP""_\\1\\" >> conftest.prefix + $as_echo "#define $ac_prefix_conf_UPP""_\\1\\2\\" >> conftest.prefix + $as_echo "#endif/" >> conftest.prefix + $as_echo "s/^#define *\\([abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]*\\)\\(.*\\)/#ifndef $ac_prefix_conf_LOW""_\\1\\" >> conftest.prefix + $as_echo "#define $ac_prefix_conf_LOW""_\\1\\2\\" >> conftest.prefix + $as_echo "#endif/" >> conftest.prefix + # now executing _script on _DEF input to create _OUT output file + echo "#ifndef $ac_prefix_conf_DEF" >$tmp/pconfig.h + echo "#define $ac_prefix_conf_DEF 1" >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo /'*' $ac_prefix_conf_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h + + sed -f conftest.prefix $ac_prefix_conf_INP >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo '/* once:' $ac_prefix_conf_DEF '*/' >>$tmp/pconfig.h + echo "#endif" >>$tmp/pconfig.h + if cmp -s $ac_prefix_conf_OUT $tmp/pconfig.h 2>/dev/null; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_prefix_conf_OUT is unchanged" >&5 +$as_echo "$as_me: $ac_prefix_conf_OUT is unchanged" >&6;} + else + ac_dir=`$as_dirname -- "$ac_prefix_conf_OUT" || +$as_expr X"$ac_prefix_conf_OUT" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_prefix_conf_OUT" : 'X\(//\)[^/]' \| \ + X"$ac_prefix_conf_OUT" : 'X\(//\)$' \| \ + X"$ac_prefix_conf_OUT" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_prefix_conf_OUT" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + rm -f "$ac_prefix_conf_OUT" + mv $tmp/pconfig.h "$ac_prefix_conf_OUT" + fi + cp conftest.prefix _configs.sed + else + as_fn_error "input file $ac_prefix_conf_INP does not exist - skip generating $ac_prefix_conf_OUT" "$LINENO" 5 + fi + rm -f conftest.* +fi + ;; + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# 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 + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# 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 + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that does not interpret backslashes. +ECHO=$lt_ECHO + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# 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 + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# 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 + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# 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 + +# 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 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_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 +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[^=]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$@"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1+=\$2" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1=\$$1\$2" +} + +_LT_EOF + ;; + esac + + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/configure.ac Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,492 @@ +# configure.ac for Clustal Omega +# +# RCS $Id: configure.ac 238 2011-04-19 18:42:55Z fabian $ + + +# release +# +#AC_INIT([Clustal Omega], [0.1.1], [clustalw@ucd.ie]) +#PACKAGE_CODENAME="OppidumLeonis" +AC_INIT([Clustal Omega], [0.2.0], [clustalw@ucd.ie]) +PACKAGE_CODENAME="IbiMeVidebunt" + +# The AC_INIT macro can take any source file as an argument. It just +# checks that the file is there, which should, in turn, mean that the +# source directory is there. AC_INIT generates the following m4 +# macros, output variables and preprocessor symbols: +AC_SUBST(PACKAGE_NAME) +AC_SUBST(PACKAGE_TARNAME) +AC_SUBST(PACKAGE_VERSION) +AC_SUBST(PACKAGE_STRING) +AC_SUBST(PACKAGE_BUGREPORT) +AC_SUBST(PACKAGE_CODENAME) + +AC_MSG_NOTICE([ + + Welcome to $PACKAGE_NAME - version $PACKAGE_VERSION ($PACKAGE_CODENAME) + + +NMMMMMMMMMS= + MMMMM? :MMMMM8 + IMMMMS MMMMM, + ~MMMMN ,MMMMM + =MMMMM MMMMM + ?MMMMM +MMMMM + MMMMMS MMMMM + MMMMM MMMMM: + MMMMM MMMMM+ + MMMMM MMMMM~ + MMMMM MMMMM + MMMMMZ MMMMM + MMMMM ,MMMMZ + MMMM8 MMMM+ + MMMMS MMMM, + MMMMO MMMM + ,N SMMM MMM8 +8 + ,M7 M+ M+ :M8 + ,MMMMMMMMMMMMI MMMMMMMMMMMM8 + ,MMMMMMMMMMMM8 MMMMMMMMMMMM8 + ,MMMMMMMMMMMMN MMMMMMMMMMMM8 + + ]) +# +# Created with http://www.glassgiant.com/ascii/ and Wikipedia's Omega +# Replaced all dollars with S's. +# +# +# ,MMMMMMMMMD: MMMMM +# NMMMMMMMMMMMMMM+ SMMMM +# DMMMMMMMMMMMMMMMMMM, +MMMM +# MMMMMMMMM8ZSO8MMMMMMMM +MMMM +# MMMMM7 SMMMM +MMMM +# MMMO MM? +MMMM +# ?MMI NMIIMMMM +# MMM MMMMMMM +# MM +# MN +# MD +# MM +# MM? ,~+ISON +# =MMI MMSOMMMM +# MMMZ MMS +MMMM +# MMMM8: :NMMM +MMMM +# MMMMMMMMMDOODMMMMMMMMM +MMMM +# MMMMMMMMMMMMMMMMMMMM +MMMM +# OMMMMMMMMMMMMMMZ SMMMM +# MMMMMMMMMM+ MMMMM +# + + +# AC_MSG_NOTICE([Configuring for your system...]) + +AC_PREREQ(2.6) # 2.60 needed for AC_USE_SYSTEM_EXTENSIONS +# consider 2.64 which allows to define a URL as well + +# The AM_INIT_AUTOMAKE line adds several standard checks. +# This macro is always needed for automake +# Obsolete: It takes the program name and version number as arguments. +AM_INIT_AUTOMAKE + +# config header: provides a way for people to customise the +# configuration for their platform, via #defines. config.h.in can be +# generated automatically with the autoheader tool. However, you need +# a stamp-h file in your project to ensure that automake regenerates +# config.h from config.h.in. Type 'touch stamp-h' to add this file to +# your project. +# +AM_CONFIG_HEADER(src/config.h) + +# the following allows to install a copy config.h for libclustalo in a +# namespace like way, i.e. no name clash with your own config.h +AX_PREFIX_CONFIG_H(src/clustal-omega-config.h) + +# This macro was introduced in Autoconf 2.60. If possible, enable +# extensions to C or Posix on hosts that normally disable the +# extensions. +AC_USE_SYSTEM_EXTENSIONS + + +# for cross compilation +# +AC_CANONICAL_HOST +## AC_CANONICAL_BUILD +## AC_CANONICAL_TARGET + +# Set the @SET_MAKE@ variable=make if $(MAKE) not set +AC_PROG_MAKE_SET + +# AC_PROG_RANLIB will allow you to build code in sub-directories into +# temporary libraries, which make will then link in with the rest of +# the code. +# Rendered obsolte by LT_INIT: AC_PROG_RANLIB +#AC_PROG_LIBTOOL +LT_INIT + +# AC_PROG_INSTALL will generate an install target so that users may +# just type 'make install' to install the software. +AC_PROG_INSTALL + +# check for C++ preprocessor and compiler and the library compiler +# (might change the compiler flags) +# +# Determine a C compiler to use. If using the GNU C compiler, set +# shell variable GCC to `yes'. If output variable CFLAGS was not +# already set, set it to `-g -O2' for the GNU C compiler (`-O2' on +# systems where GCC does not accept `-g'), or `-g' for other +# compilers. +AC_PROG_CC +# Set output variable CPP to a command that runs the C preprocessor. +AC_PROG_CPP +# +# Determine a C++ compiler to use. If output variable CXXFLAGS was not +# already set, set it to `-g -O2' for the GNU C++ compiler (`-O2' on +# systems where G++ does not accept `-g'), or `-g' for other +# compilers. +AC_PROG_CXX +# Set CXXCPP to a command that runs the C++ preprocessor +AC_PROG_CXXCPP +# +# reset compiler flags to initial flags +#CXXFLAGS=$OLD_CXXFLAGS + + + + +# safety check: AC_CONFIG_SRCDIR([src/clustal.h]) + +# Let source files know in which context they are being used +AC_DEFINE([CLUSTALO], [1], + [Let all files know they are being used inside Clustal Omega]) + +AC_DEFINE_UNQUOTED(PACKAGE_CODENAME, "$PACKAGE_CODENAME", [The package code name]) + + +# Get svn revision +#AC_PATH_PROG(svnversioncommand, svnversion) +#if test "X$svnversioncommand" = "X" || test `$svnversioncommand -n '.'` = "exported"; then +#AC_DEFINE_UNQUOTED(SVN_VERSION, ["`cat saved_svn_version.txt`"], [repository svn version]) +#else +#AC_DEFINE_UNQUOTED(SVN_VERSION, ["`svnversion -n`"], [repository svn version]) +#`svnversion -n > saved_svn_version.txt` +#fi + + + + +# AW: we might need this in the future +# +case "$host_os" in +linux*) +# AC_DEFINE(LINUX,1,[This is a Linux system]) + AC_DEFINE_UNQUOTED(LINUX,1,[This is a LINUX system]) +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, false) +# XTRA_CPPLIBS=-lstdc++ +# LIBEXT=.so + ;; +freebsd*) + AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system]) +# AC_CHECK_LIB(c_r, pthread_create) +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, true) +# XTRA_CPPLIBS=-lstdc++ +# LIBEXT=.so + ;; +openbsd*) + AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system]) +# AC_CHECK_LIB(c_r, pthread_create) +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, true) +# XTRA_CPPLIBS=-lstdc++ +# LIBEXT=.so + ;; +netbsd*) + AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system]) +# AC_CHECK_LIB(c_r, pthread_create) +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, true) +# XTRA_CPPLIBS=-lstdc++ +# LIBEXT=.so + ;; +*solaris*) + AC_DEFINE_UNQUOTED(SOLARIS,1,[This is a Solaris system]) +# AC_CHECK_LIB(resolv, res_init) +# XTRA_CPPLIBS=-lstdc++ +# AM_CONDITIONAL(HAVE_GNU_LD, false) +# AM_CONDITIONAL(SOMEBSD, false) +# CFLAGS="-D_POSIX_PTHREAD_SEMANTICS $CFLAGS" +# LIBEXT=.so + ;; +darwin*) + AC_DEFINE_UNQUOTED(DARWIN,1,[This is a Darwin system]) +# AM_CONDITIONAL(HAVE_GNU_LD, false) +# AM_CONDITIONAL(SOMEBSD, false) +# CFLAGS="-fno-common $CFLAGS" +# LIBEXT=.so + ;; +cygwin*) + AC_DEFINE_UNQUOTED(CYGWIN,1,[This is a CYGWIN system]) +# LDFLAGS="$LDFLAGS -no-undefined" +# AM_CONDITIONAL(SOMEBSD, false) +# AM_CONDITIONAL(HAVE_GNU_LD, false) +# LIBEXT=.dll + ;; +mingw*) + AC_DEFINE_UNQUOTED(MINGW,1,[This is a MinGW system]) +# AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system]) +# AC_CHECK_LIB(intl, gettext) +# AC_CHECK_LIB(ws2_32, _head_libws2_32_a,,[AC_MSG_ERROR([libextractor requires Winsock2])]) +# AC_CHECK_LIB(plibc, plibc_init,,[AC_MSG_ERROR([libextractor requires PlibC])]) +# LDFLAGS="$LDFLAGS -no-undefined -Wl,--export-all-symbols" +# LIBSOLD=$LIBS +# AM_CONDITIONAL(HAVE_GNU_LD, true) +# AM_CONDITIONAL(SOMEBSD, false) +# LIBEXT=.dll + ;; +*) +# AC_MSG_RESULT(Unrecognised OS $host_os) + AC_DEFINE_UNQUOTED(OTHEROS,1,[Some strange OS]) +# AC_MSG_RESULT(otheros) +# AM_CONDITIONAL(HAVE_GNU_LD, false) +# AM_CONDITIONAL(SOMEBSD, false) +# LIBEXT=.so + ;; +esac + + + +# Checks for standard header files. +# obsolescent according to http://www.gnu.org/software/hello/manual/autoconf/Particular-Headers.html +AC_HEADER_STDC +# Guess the next one is obsolete as well then? +AC_CHECK_HEADERS(assert.h ctype.h float.h limits.h math.h memory.h stdarg.h stdio.h stdlib.h string.h time.h unistd.h) +# awk '/^#include *</ {print $2}' $(find src/ -name \*.[ch] -or -name \*.cpp) | grep -v argtable2.h | sort -u | tr -d '<>' + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T +AC_C_INLINE + +# Checks for library functions. +# AC_CHECK_FUNCS(strdup strstr strchr erand48) +# AW is there an automatic way to extract library functions used in the program? + + +# explicit libm check +AC_CHECK_LIB(m, log,, AC_MSG_ERROR([Could not find libm])) +AC_CHECK_LIB(m, log2, AC_DEFINE(HAVE_LOG2, 1, [Has log2()])) + + +# --- argtable header and library check +# +# +AC_CHECK_HEADERS([argtable2.h], [], + AC_MSG_ERROR([Could not find argtable2.h. Try $ ./configure CFLAGS='-Iyour-argtable2-include-path])) +AC_CHECK_LIB(argtable2, arg_parse, [], + AC_MSG_ERROR([Could not find libargtable2. Try $ ./configure LDFLAGS="-Lyour-argtable2-lib-path'])) + + +# enable python if requested (--with-python) +# +#AC_ARG_WITH([python], +# [AS_HELP_STRING([--with-python], +# [Enable Python Interface])], +# [with_python=$withval], +# [with_python=no]) +#if test "$with_python" = "yes"; then +# AC_MSG_CHECKING([for python-config to get compiler flags]) +# AC_CHECK_PROG(python_config, 'python-config', yes) +# if test "${python_config}" != "yes"; then +# AC_MSG_ERROR("Could not run python-config.") +# fi +# PYTHON_CFLAGS=`python-config --cflags` +# PYTHON_LDFLAGS=`python-config --ldflags` +# AC_DEFINE([PYTHON_ENABLED], [1], [define for python usage]) +#fi +#AC_SUBST(PYTHON_CFLAGS) +#AC_SUBST(PYTHON_LDFLAGS) + + +# --- SSE support +# "One instruction to do the same operation on 4 packed elements simultaneously." +# +# http://www.codeproject.com/KB/recipes/sseintro.aspx?msg=568491 +# http://www.drdobbs.com/go-parallel/blog/archives/2010/03/getting_amazing.html +# http://software.intel.com/file/1000 +# +# AC_MSG_CHECKING(for SSE in current arch/CFLAGS) +# AC_LINK_IFELSE([ +# AC_LANG_PROGRAM([[ +# #include <xmmintrin.h> +# __m128 testfunc(float *a, float *b) { +# return _mm_add_ps(_mm_loadu_ps(a), _mm_loadu_ps(b)); +# } +# ]])], +# [has_sse=yes], [has_sse=no] +# ) +# AC_MSG_RESULT($has_sse) +# +# AC_ARG_ENABLE([sse], +# [AS_HELP_STRING([--enable-sse], +# [Enable SSE support])], +# [has_sse="$enableval"], +# [has_sse=no]) +# +# if test x"$has_sse" = x"yes"; then +# AC_DEFINE([USE_SSE], , [Enable SSE support]) +# CFLAGS="${CFLAGS} -msse" +# fi + + +# --- openmp +# +AC_CONFIG_MACRO_DIR([m4]) +m4_include([m4/ax_openmp.m4]) +AC_ARG_WITH([openmp], + AS_HELP_STRING([--without-openmp], [Do not use OpenMP])) +AS_IF([test "x$with_openmp" = "xno"], + [], + [AX_OPENMP( + AC_DEFINE([HAVE_OPENMP],[1],[Defined if OpenMP should and can be used]) + )] + ) +AC_SUBST(OPENMP_CFLAGS) +# according to http://beagle-lib.googlecode.com/svn-history/r824/trunk/configure.ac: +# "OpenMP checker only defines for C when compiling both C and C++" +OPENMP_CXXFLAGS=$OPENMP_CFLAGS +AC_SUBST(OPENMP_CXXFLAGS) + +# version 2: enable openmp only if explicitely asked for it +#AC_ARG_ENABLE(openmp, AS_HELP_STRING([--enable-openmp], [Multi-threaded parallel version using OpenMP])) +#if test -n "${enable_openmp}" -a x"${enable_openmp}" != x"no"; then +# m4_include([m4/ax_openmp.m4]) +# AX_OPENMP(AC_DEFINE(HAVE_OPENMP, 1, [enable OpenMP support]), +# AC_MSG_ERROR([Compiler does not seem to support OpenMP])) +# AC_SUBST(OPENMP_CFLAGS) +# AC_SUBST(OPENMP_CXXFLAGS) +#fi + +# --- squid +# +# +# Extra checks for squid; see their configure, config.log, squidconf.h +# etc. For example, I'm not sure about USE_HOST_BYTESWAP_FUNCTIONS, +# SIZEOF_UNSIGNED_LONG, HAVE_STRTOUL and HAVE_STRTOULL +# +# Might not just have to set compiler flags but create use squidconf.h.in +# +# The following hopefully takes about byte ordering (big-endian...). +# My hope is that it will set WORDS_BIGENDIAN and +# USE_HOST_BYTESWAP_FUNCTIONS (as used by squid) if necessary: +# +AC_C_BIGENDIAN(AC_MSG_WARN([$PACKAGE_NAME hasn't been tested on Big-Endian machines...expecting trouble!])) +AC_CHECK_FUNCS([ntohs ntohl ntons ntonl]) +# +AC_CHECK_SIZEOF(unsigned short) +AC_CHECK_SIZEOF(unsigned int) +AC_CHECK_SIZEOF(unsigned long) +AC_CHECK_SIZEOF(unsigned long long) +# +AC_CHECK_FUNCS([stroul strtoull]) +AC_CHECK_FUNCS([ftello fseeko]) +AC_CHECK_FUNCS([ftello64 fseeko64]) +AC_CHECK_FUNCS([ftell64 fseek64]) +# +AC_TYPE_OFF_T +AC_CHECK_SIZEOF(fpos_t) +# +# struct stat64 and stat64 test: +# version 1: +#AC_CHECK_TYPE(struct stat64, +# [AC_CHECK_FUNC([stat64], +# AC_DEFINE([HAVE_STAT64], [1], [Define if you have the stat64 function]))]) +# version 2: +#AC_MSG_CHECKING(for struct stat64) +#AC_CACHE_VAL(sc_cv_type_stat64, +#[AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 s;], +#[sc_cv_type_stat64=yes], +#[sc_cv_type_stat64=no])]) +#if test $sc_cv_type_stat64 = yes; then +# AC_MSG_RESULT($sc_cv_type_stat64) +# AC_CHECK_FUNC([stat64], AC_DEFINE([HAVE_STAT64], [1], [Define if you have the stat64 function])) +# #AC_DEFINE(HAVE_STAT64, [1], [Define if you have the stat64 function]) +#fi +# +# +# Above fails on myosin because storage size of struct 64 is unknown: +# ssi.c:480: error: storage size of ‘s1’ isn’t known +# +# On my MacBook OS X 10.6 I get: +# ssi.c:481: warning: ‘stat64’ is deprecated (declared at /usr/include/sys/stat.h:465) +# +# So forget about it: we won't use stat64 or define HAVE_STAT64 and +# consequently do no tests here +# + + + +# Add support for the Dmalloc package. If the user runs configure with +# --with-dmalloc, then define WITH_DMALLOC and add -ldmalloc to LIBS. +AM_WITH_DMALLOC + + +# Check if svnversion is installed +#AC_PATH_PROG([SVNVERSION_BIN], [svnversionFIXME], [no]) +## checking if we build in a subversion WC +#wc_found="no"; +#if test "$SVNVERSION_BIN" != "no"; then +# SVNVERSION=`$SVNVERSION_BIN -n $srcdir` +# if test $SVNVERSION != "exported"; +# then +# AC_MSG_NOTICE($SVNVERSION); +# fi +#fi + + +# --- debugging +# +# +# +AC_MSG_CHECKING([whether to build with debug information]) +AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug], + [Enable debugging (default=no)])], + [debugit="$enableval"], + [debugit=no]) +AC_MSG_RESULT([$debugit]) + +if test x"$debugit" = x"yes"; then + # User variables CFLAGS/CXXFLAGS are used last during compilation and + # can therefore overwrite system settings. + # + # if debugging was requested, add debugging info at the end of + # C[XX]FLAGS, which makes sure previous optimisation flags are + # overwritten (normally C[XX]FLAGS should not be modified as they + # are user variables): + # switch off assert etc + # AC_DEFINE([DEBUG],[],[Debug Mode]) + CFLAGS="${CFLAGS} -g -ansi -Wall -O0" + CXXFLAGS="${CXXFLAGS} -g -ansi -Wall -O0" +else + # switch off assert etc + AC_DEFINE([NDEBUG],[],[No-debug Mode]) + # if no debugging is requested, we make optimisation explicit + AM_CXXFLAGS="${AM_CXXFLAGS} -O3" + AM_CFLAGS="${AM_CFLAGS} -O3" +fi + + + +AC_SUBST([AM_CXXFLAGS]) +AC_SUBST([AM_CFLAGS]) +AC_SUBST([AM_LDFLAGS]) + + +AC_CONFIG_FILES(Makefile + src/Makefile + clustalo.pc + Doxyfile + src/clustal/Makefile + src/hhalign/Makefile + src/kmpp/Makefile + src/squid/Makefile) +AC_OUTPUT
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/depcomp Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free +# Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to <bug-automake@gnu.org>. +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u="sed s,\\\\\\\\,/,g" + depmode=msvisualcpp +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/install-sh Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/ltmain.sh Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,8413 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6b +# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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. + +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to <bug-libtool@gnu.org>. + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" +TIMESTAMP="" +package_revision=1.3017 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/bin/grep -E"} +: ${FGREP="/bin/grep -F"} +: ${GREP="/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/bin/sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname${mode+: }$mode: $*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "X$my_tmpdir" | $Xsed +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "X$1" | $Xsed \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + + + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $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, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<EOF +$* +EOF + exit $EXIT_SUCCESS +fi + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +# $mode is unset +nonopt= +execute_dlfiles= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +opt_dry_run=false +opt_duplicate_deps=false +opt_silent=false +opt_debug=: + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + $ECHO "host: $host" + if test "$build_libtool_libs" = yes; then + $ECHO "enable shared libraries" + else + $ECHO "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $ECHO "enable static libraries" + else + $ECHO "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 in + # Valid mode arguments: + clean) ;; + compile) ;; + execute) ;; + finish) ;; + install) ;; + link) ;; + relink) ;; + uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; + esac + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$mode' for more information." +} + + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <<EOF +# $write_libobj - a libtool object file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object=$write_lobj + +# Name of the non-PIC object +non_pic_object=$write_oldobj + +EOF + $MV "${write_libobj}T" "${write_libobj}" + } +} + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + pie_flag="$pie_flag $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_quote_for_eval "$arg" + lastarg="$lastarg $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_quote_for_eval "$lastarg" + base_compile="$base_compile $func_quote_for_eval_result" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.obj | *.sx) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command="$command -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { +test "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + $ECHO "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $ECHO "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + $ECHO + $ECHO "If you ever happen to want to link against installed libraries" + $ECHO "in a given directory, LIBDIR, you must either use libtool, and" + $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" + $ECHO "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" + $ECHO " during execution" + fi + if test -n "$runpath_var"; then + $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" + $ECHO " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $ECHO + + $ECHO "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" + $ECHO "pages." + ;; + *) + $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + $ECHO "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_prog $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 </dev/null >/dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + $ECHO >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +extern $lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +$lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + $ECHO >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags="$symtab_cflags $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} +# end: func_emit_wrapper_part2 + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # Unfortunately, winepath does not exit with a non-zero + # error code, so we are forced to check the contents of + # stdout. On the other hand, if the command is not + # found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both + # error code of zero AND non-empty stdout, which explains + # the odd construction: + func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# Path separators are also converted from $build format to +# $host format. If ARG begins or ends with a path separator +# character, it is preserved (but converted to $host format) +# on output. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat <<EOF + +/* $cwrappersource - temporary wrapper executable for $objdir/$outputname + Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION + + The $output program cannot be directly executed until all the libtool + libraries that it depends on are installed. + + This wrapper executable should never be moved out of the build directory. + If it is, it will not operate correctly. + + Currently, it simply execs the wrapper *script* "$SHELL $output", + but could eventually absorb all of the scripts functionality and + exec $objdir/$outputname directly. +*/ +EOF + cat <<"EOF" +#include <stdio.h> +#include <stdlib.h> +#ifdef _MSC_VER +# include <direct.h> +# include <process.h> +# include <io.h> +# define setmode _setmode +#else +# include <unistd.h> +# include <stdint.h> +# ifdef __CYGWIN__ +# include <io.h> +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include <malloc.h> +#include <stdarg.h> +#include <assert.h> +#include <string.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_fatal (const char *message, ...); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <<EOF + +static const char *script_text_part2 = +EOF + func_emit_wrapper_part2 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + + cat <<EOF +const char * MAGIC_EXE = "$magic_exe"; +const char * LIB_PATH_VARNAME = "$shlibpath_var"; +EOF + + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + func_to_host_pathlist "$temp_rpath" + cat <<EOF +const char * LIB_PATH_VALUE = "$func_to_host_pathlist_result"; +EOF + else + cat <<"EOF" +const char * LIB_PATH_VALUE = ""; +EOF + fi + + if test -n "$dllsearchpath"; then + func_to_host_pathlist "$dllsearchpath:" + cat <<EOF +const char * EXE_PATH_VARNAME = "PATH"; +const char * EXE_PATH_VALUE = "$func_to_host_pathlist_result"; +EOF + else + cat <<"EOF" +const char * EXE_PATH_VARNAME = ""; +const char * EXE_PATH_VALUE = ""; +EOF + fi + + if test "$fast_install" = yes; then + cat <<EOF +const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ +EOF + else + cat <<EOF +const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ +EOF + fi + + + cat <<"EOF" + +#define LTWRAPPER_OPTION_PREFIX "--lt-" +#define LTWRAPPER_OPTION_PREFIX_LENGTH 5 + +static const size_t opt_prefix_len = LTWRAPPER_OPTION_PREFIX_LENGTH; +static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; + +static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; + +static const size_t env_set_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 7; +static const char *env_set_opt = LTWRAPPER_OPTION_PREFIX "env-set"; + /* argument is putenv-style "foo=bar", value of foo is set to bar */ + +static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11; +static const char *env_prepend_opt = LTWRAPPER_OPTION_PREFIX "env-prepend"; + /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */ + +static const size_t env_append_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 10; +static const char *env_append_opt = LTWRAPPER_OPTION_PREFIX "env-append"; + /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */ + +int +main (int argc, char *argv[]) +{ + char **newargz; + int newargc; + char *tmp_pathspec; + char *actual_cwrapper_path; + char *actual_cwrapper_name; + char *target_name; + char *lt_argv_zero; + intptr_t rval = 127; + + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + LTWRAPPER_DEBUGPRINTF (("(main) argv[0] : %s\n", argv[0])); + LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name)); + + /* very simple arg parsing; don't want to rely on getopt */ + for (i = 1; i < argc; i++) + { + if (strcmp (argv[i], dumpscript_opt) == 0) + { +EOF + case "$host" in + *mingw* | *cygwin* ) + # make stdout use "unix" line endings + echo " setmode(1,_O_BINARY);" + ;; + esac + + cat <<"EOF" + printf ("%s", script_text_part1); + printf ("%s", script_text_part2); + return 0; + } + } + + newargz = XMALLOC (char *, argc + 1); + tmp_pathspec = find_executable (argv[0]); + if (tmp_pathspec == NULL) + lt_fatal ("Couldn't find %s", argv[0]); + LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n", + tmp_pathspec)); + + actual_cwrapper_path = chase_symlinks (tmp_pathspec); + LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n", + actual_cwrapper_path)); + XFREE (tmp_pathspec); + + actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path)); + strendzap (actual_cwrapper_path, actual_cwrapper_name); + + /* wrapper name transforms */ + strendzap (actual_cwrapper_name, ".exe"); + tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); + XFREE (actual_cwrapper_name); + actual_cwrapper_name = tmp_pathspec; + tmp_pathspec = 0; + + /* target_name transforms -- use actual target program name; might have lt- prefix */ + target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); + strendzap (target_name, ".exe"); + tmp_pathspec = lt_extend_str (target_name, ".exe", 1); + XFREE (target_name); + target_name = tmp_pathspec; + tmp_pathspec = 0; + + LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n", + target_name)); +EOF + + cat <<EOF + newargz[0] = + XMALLOC (char, (strlen (actual_cwrapper_path) + + strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); + strcpy (newargz[0], actual_cwrapper_path); + strcat (newargz[0], "$objdir"); + strcat (newargz[0], "/"); +EOF + + cat <<"EOF" + /* stop here, and copy so we don't have to do this twice */ + tmp_pathspec = xstrdup (newargz[0]); + + /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ + strcat (newargz[0], actual_cwrapper_name); + + /* DO want the lt- prefix here if it exists, so use target_name */ + lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); + XFREE (tmp_pathspec); + tmp_pathspec = NULL; +EOF + + case $host_os in + mingw*) + cat <<"EOF" + { + char* p; + while ((p = strchr (newargz[0], '\\')) != NULL) + { + *p = '/'; + } + while ((p = strchr (lt_argv_zero, '\\')) != NULL) + { + *p = '/'; + } + } +EOF + ;; + esac + + cat <<"EOF" + XFREE (target_name); + XFREE (actual_cwrapper_path); + XFREE (actual_cwrapper_name); + + lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ + lt_setenv ("DUALCASE", "1"); /* for MSK sh */ + lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); + lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); + + newargc=0; + for (i = 1; i < argc; i++) + { + if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0) + { + if (argv[i][env_set_opt_len] == '=') + { + const char *p = argv[i] + env_set_opt_len + 1; + lt_opt_process_env_set (p); + } + else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc) + { + lt_opt_process_env_set (argv[++i]); /* don't copy */ + } + else + lt_fatal ("%s missing required argument", env_set_opt); + continue; + } + if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0) + { + if (argv[i][env_prepend_opt_len] == '=') + { + const char *p = argv[i] + env_prepend_opt_len + 1; + lt_opt_process_env_prepend (p); + } + else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc) + { + lt_opt_process_env_prepend (argv[++i]); /* don't copy */ + } + else + lt_fatal ("%s missing required argument", env_prepend_opt); + continue; + } + if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0) + { + if (argv[i][env_append_opt_len] == '=') + { + const char *p = argv[i] + env_append_opt_len + 1; + lt_opt_process_env_append (p); + } + else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc) + { + lt_opt_process_env_append (argv[++i]); /* don't copy */ + } + else + lt_fatal ("%s missing required argument", env_append_opt); + continue; + } + if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0) + { + /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX + namespace, but it is not one of the ones we know about and + have already dealt with, above (inluding dump-script), then + report an error. Otherwise, targets might begin to believe + they are allowed to use options in the LTWRAPPER_OPTION_PREFIX + namespace. The first time any user complains about this, we'll + need to make LTWRAPPER_OPTION_PREFIX a configure-time option + or a configure.ac-settable value. + */ + lt_fatal ("Unrecognized option in %s namespace: '%s'", + ltwrapper_option_prefix, argv[i]); + } + /* otherwise ... */ + newargz[++newargc] = xstrdup (argv[i]); + } + newargz[++newargc] = NULL; + + LTWRAPPER_DEBUGPRINTF (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>"))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", + tmp_pathspec)); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("Could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : "<NULL>"), + (value ? value : "<NULL>"))); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : "<NULL>"), + (value ? value : "<NULL>"))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : "<NULL>"), + (value ? value : "<NULL>"))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + + +EOF +} +# end: func_emit_cwrapperexe_src + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs="$deplibs $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname '-L' '' "$arg" + dir=$func_stripname_result + if test -z "$dir"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$linker_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$deplibs $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $ECHO + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because the file extensions .$libext of this argument makes me believe" + $ECHO "*** that it is just a static archive that I should not use here." + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath="$temp_rpath$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + $ECHO + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $ECHO + $ECHO "*** And there doesn't seem to be a static archive available" + $ECHO "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $ECHO + $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $ECHO "*** But as you try to build a module library, libtool will still create " + $ECHO "*** a static module, that should work as long as the dlopening application" + $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_dirname "$deplib" "" "." + dir="$func_dirname_result" + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c <<EOF + int main() { return 0; } +EOF + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then + ldd_output=`ldd conftest` + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + newdeplibs="$newdeplibs $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + newdeplibs="$newdeplibs $i" + else + droppeddeps=yes + $ECHO + $ECHO "*** Warning: dynamic linker does not accept needed library $i." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which I believe you do not have" + $ECHO "*** because a test_compile did reveal that the linker did not use it for" + $ECHO "*** its dynamic dependency list that programs get resolved with at runtime." + fi + fi + ;; + *) + newdeplibs="$newdeplibs $i" + ;; + esac + done + else + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do + case $i in + -l*) + func_stripname -l '' "$i" + name=$func_stripname_result + $opt_dry_run || $RM conftest + if $LTCC $LTCFLAGS -o conftest conftest.c $i; then + ldd_output=`ldd conftest` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + newdeplibs="$newdeplibs $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` + set dummy $deplib_matches; shift + deplib_match=$1 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + newdeplibs="$newdeplibs $i" + else + droppeddeps=yes + $ECHO + $ECHO "*** Warning: dynamic linker does not accept needed library $i." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because a test_compile did reveal that the linker did not use this one" + $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime." + fi + fi + else + droppeddeps=yes + $ECHO + $ECHO "*** Warning! Library $i is needed by this library but I was not able to" + $ECHO "*** make it link in! You will probably need to install it or some" + $ECHO "*** library that it depends on before this library will be fully" + $ECHO "*** functional. Installing it before continuing would be even better." + fi + ;; + *) + newdeplibs="$newdeplibs $i" + ;; + esac + done + fi + ;; + file_magic*) + set dummy $deplibs_check_method; shift + file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $ECHO + $ECHO "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + $ECHO "*** a static module, that should work as long as the dlopening" + $ECHO "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $ECHO "*** The inter-library dependencies that have been dropped here will be" + $ECHO "*** automatically added whenever a program is linked with this library" + $ECHO "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $ECHO + $ECHO "*** Since this library must not contain undefined symbols," + $ECHO "*** because either the platform does not support them or" + $ECHO "*** it was explicitly requested with -no-undefined," + $ECHO "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles="$delfiles $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + $ECHO 'INPUT (' > $output + for obj in $save_libobjs + do + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$delfiles $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $ECHO "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$newdlfiles $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles="$newdlprefiles $libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$mode" = link || test "$mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles="$rmfiles $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/m4/ax_openmp.m4 Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,99 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_openmp.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_OPENMP([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro tries to find out how to compile programs that use OpenMP a +# standard API and set of compiler directives for parallel programming +# (see http://www-unix.mcs/) +# +# On success, it sets the OPENMP_CFLAGS/OPENMP_CXXFLAGS/OPENMP_F77FLAGS +# output variable to the flag (e.g. -omp) used both to compile *and* link +# OpenMP programs in the current language. +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. +# +# If you want to compile everything with OpenMP, you should set: +# +# CFLAGS="$CFLAGS $OPENMP_CFLAGS" +# #OR# CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS" +# #OR# FFLAGS="$FFLAGS $OPENMP_FFLAGS" +# +# (depending on the selected language). +# +# The user can override the default choice by setting the corresponding +# environment variable (e.g. OPENMP_CFLAGS). +# +# ACTION-IF-FOUND is a list of shell commands to run if an OpenMP flag is +# found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it is +# not found. If ACTION-IF-FOUND is not specified, the default action will +# define HAVE_OPENMP. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <http://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 8 + +AC_DEFUN([AX_OPENMP], [ +AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX + +AC_CACHE_CHECK([for OpenMP flag of _AC_LANG compiler], ax_cv_[]_AC_LANG_ABBREV[]_openmp, [save[]_AC_LANG_PREFIX[]FLAGS=$[]_AC_LANG_PREFIX[]FLAGS +ax_cv_[]_AC_LANG_ABBREV[]_openmp=unknown +# Flags to try: -fopenmp (gcc), -openmp (icc), -mp (SGI & PGI), +# -xopenmp (Sun), -omp (Tru64), -qsmp=omp (AIX), none +ax_openmp_flags="-fopenmp -openmp -mp -xopenmp -omp -qsmp=omp none" +if test "x$OPENMP_[]_AC_LANG_PREFIX[]FLAGS" != x; then + ax_openmp_flags="$OPENMP_[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flags" +fi +for ax_openmp_flag in $ax_openmp_flags; do + case $ax_openmp_flag in + none) []_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[] ;; + *) []_AC_LANG_PREFIX[]FLAGS="$save[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flag" ;; + esac + AC_TRY_LINK_FUNC(omp_set_num_threads, + [ax_cv_[]_AC_LANG_ABBREV[]_openmp=$ax_openmp_flag; break]) +done +[]_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[]FLAGS +]) +if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" = "xunknown"; then + m4_default([$2],:) +else + if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" != "xnone"; then + OPENMP_[]_AC_LANG_PREFIX[]FLAGS=$ax_cv_[]_AC_LANG_ABBREV[]_openmp + fi + m4_default([$1], [AC_DEFINE(HAVE_OPENMP,1,[Define if OpenMP is enabled])]) +fi +])dnl AX_OPENMP
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/m4/ax_prefix_config_h.m4 Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,209 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_prefix_config_h.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PREFIX_CONFIG_H [(OUTPUT-HEADER [,PREFIX [,ORIG-HEADER]])] +# +# DESCRIPTION +# +# This is a new variant from ac_prefix_config_ this one will use a +# lowercase-prefix if the config-define was starting with a +# lowercase-char, e.g. "#define const", "#define restrict", or "#define +# off_t", (and this one can live in another directory, e.g. +# testpkg/config.h therefore I decided to move the output-header to be the +# first arg) +# +# takes the usual config.h generated header file; looks for each of the +# generated "#define SOMEDEF" lines, and prefixes the defined name (ie. +# makes it "#define PREFIX_SOMEDEF". The result is written to the output +# config.header file. The PREFIX is converted to uppercase for the +# conversions. +# +# Defaults: +# +# OUTPUT-HEADER = $PACKAGE-config.h +# PREFIX = $PACKAGE +# ORIG-HEADER, from AM_CONFIG_HEADER(config.h) +# +# Your configure.ac script should contain both macros in this order, and +# unlike the earlier variations of this prefix-macro it is okay to place +# the AX_PREFIX_CONFIG_H call before the AC_OUTPUT invokation. +# +# Example: +# +# AC_INIT(config.h.in) # config.h.in as created by "autoheader" +# AM_INIT_AUTOMAKE(testpkg, 0.1.1) # makes #undef VERSION and PACKAGE +# AM_CONFIG_HEADER(config.h) # prep config.h from config.h.in +# AX_PREFIX_CONFIG_H(mylib/_config.h) # prep mylib/_config.h from it.. +# AC_MEMORY_H # makes "#undef NEED_MEMORY_H" +# AC_C_CONST_H # makes "#undef const" +# AC_OUTPUT(Makefile) # creates the "config.h" now +# # and also mylib/_config.h +# +# if the argument to AX_PREFIX_CONFIG_H would have been omitted then the +# default outputfile would have been called simply "testpkg-config.h", but +# even under the name "mylib/_config.h" it contains prefix-defines like +# +# #ifndef TESTPKG_VERSION +# #define TESTPKG_VERSION "0.1.1" +# #endif +# #ifndef TESTPKG_NEED_MEMORY_H +# #define TESTPKG_NEED_MEMORY_H 1 +# #endif +# #ifndef _testpkg_const +# #define _testpkg_const _const +# #endif +# +# and this "mylib/_config.h" can be installed along with other +# header-files, which is most convenient when creating a shared library +# (that has some headers) where some functionality is dependent on the +# OS-features detected at compile-time. No need to invent some +# "mylib-confdefs.h.in" manually. :-) +# +# Note that some AC_DEFINEs that end up in the config.h file are actually +# self-referential - e.g. AC_C_INLINE, AC_C_CONST, and the AC_TYPE_OFF_T +# say that they "will define inline|const|off_t if the system does not do +# it by itself". You might want to clean up about these - consider an +# extra mylib/conf.h that reads something like: +# +# #include <mylib/_config.h> +# #ifndef _testpkg_const +# #define _testpkg_const const +# #endif +# +# and then start using _testpkg_const in the header files. That is also a +# good thing to differentiate whether some library-user has starting to +# take up with a different compiler, so perhaps it could read something +# like this: +# +# #ifdef _MSC_VER +# #include <mylib/_msvc.h> +# #else +# #include <mylib/_config.h> +# #endif +# #ifndef _testpkg_const +# #define _testpkg_const const +# #endif +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> +# Copyright (c) 2008 Marten Svantesson +# Copyright (c) 2008 Gerald Point <Gerald.Point@labri.fr> +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <http://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 11 + +AC_DEFUN([AX_PREFIX_CONFIG_H],[dnl +AC_PREREQ([2.62]) +AC_BEFORE([AC_CONFIG_HEADERS],[$0])dnl +AC_CONFIG_COMMANDS([ifelse($1,,$PACKAGE-config.h,$1)],[dnl +AS_VAR_PUSHDEF([_OUT],[ac_prefix_conf_OUT])dnl +AS_VAR_PUSHDEF([_DEF],[ac_prefix_conf_DEF])dnl +AS_VAR_PUSHDEF([_PKG],[ac_prefix_conf_PKG])dnl +AS_VAR_PUSHDEF([_LOW],[ac_prefix_conf_LOW])dnl +AS_VAR_PUSHDEF([_UPP],[ac_prefix_conf_UPP])dnl +AS_VAR_PUSHDEF([_INP],[ac_prefix_conf_INP])dnl +m4_pushdef([_script],[conftest.prefix])dnl +m4_pushdef([_symbol],[m4_cr_Letters[]m4_cr_digits[]_])dnl +_OUT=`echo ifelse($1, , $PACKAGE-config.h, $1)` +_DEF=`echo _$_OUT | sed -e "y:m4_cr_letters:m4_cr_LETTERS[]:" -e "s/@<:@^m4_cr_Letters@:>@/_/g"` +_PKG=`echo ifelse($2, , $PACKAGE, $2)` +_LOW=`echo _$_PKG | sed -e "y:m4_cr_LETTERS-:m4_cr_letters[]_:"` +_UPP=`echo $_PKG | sed -e "y:m4_cr_letters-:m4_cr_LETTERS[]_:" -e "/^@<:@m4_cr_digits@:>@/s/^/_/"` +_INP=`echo "ifelse($3,,,$3)" | sed -e 's/ *//'` +if test ".$_INP" = "."; then + for ac_file in : $CONFIG_HEADERS; do test "_$ac_file" = _: && continue + case "$ac_file" in + *.h) _INP=$ac_file ;; + *) + esac + test ".$_INP" != "." && break + done +fi +if test ".$_INP" = "."; then + case "$_OUT" in + */*) _INP=`basename "$_OUT"` + ;; + *-*) _INP=`echo "$_OUT" | sed -e "s/@<:@_symbol@:>@*-//"` + ;; + *) _INP=config.h + ;; + esac +fi +if test -z "$_PKG" ; then + AC_MSG_ERROR([no prefix for _PREFIX_PKG_CONFIG_H]) +else + if test ! -f "$_INP" ; then if test -f "$srcdir/$_INP" ; then + _INP="$srcdir/$_INP" + fi fi + AC_MSG_NOTICE(creating $_OUT - prefix $_UPP for $_INP defines) + if test -f $_INP ; then + AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_LETTERS[]_@:>@\\)/@%:@undef $_UPP""_\\1/"]) > _script + AS_ECHO(["s/^@%:@undef *\\(@<:@m4_cr_letters@:>@\\)/@%:@undef $_LOW""_\\1/"]) >> _script + AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_LETTERS[]_@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_UPP""_\\1\\"]) >> _script + AS_ECHO(["@%:@def[]ine $_UPP""_\\1\\2\\"]) >> _script + AS_ECHO(["@%:@endif/"]) >> _script + AS_ECHO(["s/^@%:@def[]ine *\\(@<:@m4_cr_letters@:>@@<:@_symbol@:>@*\\)\\(.*\\)/@%:@ifndef $_LOW""_\\1\\"]) >> _script + AS_ECHO(["@%:@define $_LOW""_\\1\\2\\"]) >> _script + AS_ECHO(["@%:@endif/"]) >> _script + # now executing _script on _DEF input to create _OUT output file + echo "@%:@ifndef $_DEF" >$tmp/pconfig.h + echo "@%:@def[]ine $_DEF 1" >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo /'*' $_OUT. Generated automatically at end of configure. '*'/ >>$tmp/pconfig.h + + sed -f _script $_INP >>$tmp/pconfig.h + echo ' ' >>$tmp/pconfig.h + echo '/* once:' $_DEF '*/' >>$tmp/pconfig.h + echo "@%:@endif" >>$tmp/pconfig.h + if cmp -s $_OUT $tmp/pconfig.h 2>/dev/null; then + AC_MSG_NOTICE([$_OUT is unchanged]) + else + ac_dir=`AS_DIRNAME(["$_OUT"])` + AS_MKDIR_P(["$ac_dir"]) + rm -f "$_OUT" + mv $tmp/pconfig.h "$_OUT" + fi + cp _script _configs.sed + else + AC_MSG_ERROR([input file $_INP does not exist - skip generating $_OUT]) + fi + rm -f conftest.* +fi +m4_popdef([_symbol])dnl +m4_popdef([_script])dnl +AS_VAR_POPDEF([_INP])dnl +AS_VAR_POPDEF([_UPP])dnl +AS_VAR_POPDEF([_LOW])dnl +AS_VAR_POPDEF([_PKG])dnl +AS_VAR_POPDEF([_DEF])dnl +AS_VAR_POPDEF([_OUT])dnl +],[PACKAGE="$PACKAGE"])])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/m4/libtool.m4 Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,7377 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# 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. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 56 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl +_LT_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. +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 delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_INIT +]) + + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to <bug-libtool@gnu.org>." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +if test "$no_create" != yes; then + lt_cl_success=: + test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" + exec AS_MESSAGE_LOG_FD>/dev/null + $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false + exec AS_MESSAGE_LOG_FD>>config.log + $lt_cl_success || AS_EXIT(1) +fi +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_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 +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_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. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# 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 "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_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. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_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 <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { 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. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_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 + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + 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 + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # 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.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + 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_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[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 + ;; +sparc*-*solaris*) + # 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.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +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 linker 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 + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# 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 + teststring="ABCD" + + case $build_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; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # 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"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # 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` + fi + ;; + 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 +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_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 <<_LT_EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#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 + +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); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_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 + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + 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="-ldld"], + [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="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + 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" + wl=$lt_prog_compiler_wl 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_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 + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_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 +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && 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 + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_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 +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_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 +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_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_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; 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 +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +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 +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +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" +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}${shared_ext}$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}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + 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<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + 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}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + 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' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-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 + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $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 + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$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 + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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 + case $host_cpu in + ia64*) + shrext_cmds='.so' + 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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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 + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + 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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + 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}" + hardcode_into_libs=yes + ;; + +# 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* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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 + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # 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' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_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}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$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' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $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}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + 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" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${shared_ext}$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.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=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${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = 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 + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[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]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +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="m4_if([$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 <<_LT_EOF 1>&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 + +_LT_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 +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_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 + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_ARG_WITH([gnu-ld], + [AS_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])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 $CC]) + 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 pathname 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 variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$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]) +_LT_PATH_LD_GNU +AC_SUBST([LD]) + +_LT_TAGDECL([], [LD], [1], [The linker used to build libraries]) +])# LT_PATH_LD + +# Old names: +AU_ALIAS([AM_PROG_LD], [LT_PATH_LD]) +AU_ALIAS([AC_PROG_LD], [LT_PATH_LD]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_LD], []) +dnl AC_DEFUN([AC_PROG_LD], []) + + +# _LT_PATH_LD_GNU +#- -------------- +m4_defun([_LT_PATH_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 lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac]) +with_gnu_ld=$lt_cv_prog_gnu_ld +])# _LT_PATH_LD_GNU + + +# _LT_CMD_RELOAD +# -------------- +# find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +m4_defun([_LT_CMD_RELOAD], +[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' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac +_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl +_LT_DECL([], [reload_cmds], [2])dnl +])# _LT_CMD_RELOAD + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent 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 extended 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 +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + 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*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + 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|DragonFly)/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 + case $host_cpu in + ia64*) + 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 + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + 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 + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + 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=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + 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 + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + 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 + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method == "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_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 + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + 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 + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# 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]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \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\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $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 $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_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_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 -rf 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 + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_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_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_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_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_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_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_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_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # 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 | $GREP 'GNU' > /dev/null; then + _LT_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_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 + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + linux* | k*bsd*-gnu) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp 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_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # 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. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # 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 + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_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}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&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. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&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. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_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_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_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_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_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_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_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_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + 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 | $GREP 'GNU' > /dev/null; then + _LT_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_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 + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + 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_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + 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 + : + else + # We have old collect2 + _LT_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_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + 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='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + 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_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # 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_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_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_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_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' + else + _LT_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' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_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_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_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}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_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' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_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} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_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_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_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 "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +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_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(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## 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... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will 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 + ;; + + aix[[4-9]]*) + 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]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # 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_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_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" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_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_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $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 | $GREP "\-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_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + 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 + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + 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_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + 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 + : + else + # We have old collect2 + _LT_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_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + 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='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + 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_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_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_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_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' + # 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 "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_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' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_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' + ;; + 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) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_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' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_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_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_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + 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_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.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$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_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_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_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_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_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 "X$templist" | $Xsed -e "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 "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | 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_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$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 "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_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 "X$templist" | $Xsed -e "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 "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_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 "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_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" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_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 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_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} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # 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_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_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_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_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_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 $compiler_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 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_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 $compiler_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 | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## 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... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${F77-"f77"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + 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 + ;; + aix[[4-9]]*) + 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]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## 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... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${FC-"f95"} + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + 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 + ;; + aix[[4-9]]*) + 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]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## 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... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +## 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... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC="$lt_save_CC" +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC="$lt_save_CC" +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/m4/ltoptions.m4 Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,368 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_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=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_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=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_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=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_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=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/m4/ltsugar.m4 Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/m4/ltversion.m4 Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# 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. + +# Generated from ltversion.in. + +# serial 3017 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +m4_define([LT_PACKAGE_REVISION], [1.3017]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6b' +macro_revision='1.3017' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/m4/lt~obsolete.m4 Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,92 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 4 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/missing Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to <bug-automake@gnu.org>." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/Makefile.am Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,31 @@ +EXTRA_DIST = clustalo-api-test.c + +SUBDIRS = hhalign squid kmpp clustal + +AM_LDFLAGS = @AM_LDFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ @OPENMP_CXXFLAGS@ +AM_CFLAGS = @AM_CFLAGS@ @OPENMP_CFLAGS@ + + +# the following is the clustalo convenience library which wraps all +# the other noinst libraries + +lib_LTLIBRARIES = libclustalo.la + +libclustalo_la_SOURCES = clustal-omega.c +libclustalo_la_LIBADD = clustal/libclustal.la \ + hhalign/libhhalign.la \ + squid/libsquid.la \ + kmpp/libkmpp.la +libclustalo_la_LDFLAGS = -static +library_includedir=$(includedir)/clustalo/ +library_include_HEADERS = clustal-omega-config.h clustal-omega.h + + + +bin_PROGRAMS = clustalo + +clustalo_SOURCES = main.cpp \ + mymain.c mymain.h + +clustalo_LDADD = libclustalo.la
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/Makefile.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,832 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = clustalo$(EXEEXT) +subdir = src +DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/ax_openmp.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(library_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libclustalo_la_DEPENDENCIES = clustal/libclustal.la \ + hhalign/libhhalign.la squid/libsquid.la kmpp/libkmpp.la +am_libclustalo_la_OBJECTS = clustal-omega.lo +libclustalo_la_OBJECTS = $(am_libclustalo_la_OBJECTS) +libclustalo_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libclustalo_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(bin_PROGRAMS) +am_clustalo_OBJECTS = main.$(OBJEXT) mymain.$(OBJEXT) +clustalo_OBJECTS = $(am_clustalo_OBJECTS) +clustalo_DEPENDENCIES = libclustalo.la +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libclustalo_la_SOURCES) $(clustalo_SOURCES) +DIST_SOURCES = $(libclustalo_la_SOURCES) $(clustalo_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +HEADERS = $(library_include_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ @OPENMP_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ @OPENMP_CXXFLAGS@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CODENAME = @PACKAGE_CODENAME@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = clustalo-api-test.c +SUBDIRS = hhalign squid kmpp clustal + +# the following is the clustalo convenience library which wraps all +# the other noinst libraries +lib_LTLIBRARIES = libclustalo.la +libclustalo_la_SOURCES = clustal-omega.c +libclustalo_la_LIBADD = clustal/libclustal.la \ + hhalign/libhhalign.la \ + squid/libsquid.la \ + kmpp/libkmpp.la + +libclustalo_la_LDFLAGS = -static +library_includedir = $(includedir)/clustalo/ +library_include_HEADERS = clustal-omega-config.h clustal-omega.h +clustalo_SOURCES = main.cpp \ + mymain.c mymain.h + +clustalo_LDADD = libclustalo.la +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status src/config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libclustalo.la: $(libclustalo_la_OBJECTS) $(libclustalo_la_DEPENDENCIES) + $(libclustalo_la_LINK) -rpath $(libdir) $(libclustalo_la_OBJECTS) $(libclustalo_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +clustalo$(EXEEXT): $(clustalo_OBJECTS) $(clustalo_DEPENDENCIES) + @rm -f clustalo$(EXEEXT) + $(CXXLINK) $(clustalo_OBJECTS) $(clustalo_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clustal-omega.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mymain.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-library_includeHEADERS: $(library_include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(library_includedir)" || $(MKDIR_P) "$(DESTDIR)$(library_includedir)" + @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(library_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(library_includedir)" || exit $$?; \ + done + +uninstall-library_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(library_includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(library_includedir)" && rm -f $$files + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) config.h +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(library_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-library_includeHEADERS + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ + uninstall-library_includeHEADERS + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libLTLIBRARIES clean-libtool ctags \ + ctags-recursive distclean distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-library_includeHEADERS \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ + uninstall-library_includeHEADERS + + +# 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:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal-omega-config.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,353 @@ +#ifndef _SRC_CLUSTAL_OMEGA_CONFIG_H +#define _SRC_CLUSTAL_OMEGA_CONFIG_H 1 + +/* src/clustal-omega-config.h. Generated automatically at end of configure. */ +/* src/config.h. Generated from config.h.in by configure. */ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Let all files know they are being used inside Clustal Omega */ +#ifndef CLUSTAL_OMEGA_CLUSTALO +#define CLUSTAL_OMEGA_CLUSTALO 1 +#endif + +/* This is a CYGWIN system */ +/* #undef CYGWIN */ + +/* This is a Darwin system */ +/* #undef DARWIN */ + +/* Define to 1 if you have the <argtable2.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_ARGTABLE2_H +#define CLUSTAL_OMEGA_HAVE_ARGTABLE2_H 1 +#endif + +/* Define to 1 if you have the <assert.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_ASSERT_H +#define CLUSTAL_OMEGA_HAVE_ASSERT_H 1 +#endif + +/* Define to 1 if you have the <ctype.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_CTYPE_H +#define CLUSTAL_OMEGA_HAVE_CTYPE_H 1 +#endif + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_DLFCN_H +#define CLUSTAL_OMEGA_HAVE_DLFCN_H 1 +#endif + +/* Define to 1 if you have the <float.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_FLOAT_H +#define CLUSTAL_OMEGA_HAVE_FLOAT_H 1 +#endif + +/* Define to 1 if you have the `fseek64' function. */ +/* #undef HAVE_FSEEK64 */ + +/* Define to 1 if you have the `fseeko' function. */ +#ifndef CLUSTAL_OMEGA_HAVE_FSEEKO +#define CLUSTAL_OMEGA_HAVE_FSEEKO 1 +#endif + +/* Define to 1 if you have the `fseeko64' function. */ +#ifndef CLUSTAL_OMEGA_HAVE_FSEEKO64 +#define CLUSTAL_OMEGA_HAVE_FSEEKO64 1 +#endif + +/* Define to 1 if you have the `ftell64' function. */ +/* #undef HAVE_FTELL64 */ + +/* Define to 1 if you have the `ftello' function. */ +#ifndef CLUSTAL_OMEGA_HAVE_FTELLO +#define CLUSTAL_OMEGA_HAVE_FTELLO 1 +#endif + +/* Define to 1 if you have the `ftello64' function. */ +#ifndef CLUSTAL_OMEGA_HAVE_FTELLO64 +#define CLUSTAL_OMEGA_HAVE_FTELLO64 1 +#endif + +/* Define to 1 if you have the <inttypes.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_INTTYPES_H +#define CLUSTAL_OMEGA_HAVE_INTTYPES_H 1 +#endif + +/* Define to 1 if you have the `argtable2' library (-largtable2). */ +#ifndef CLUSTAL_OMEGA_HAVE_LIBARGTABLE2 +#define CLUSTAL_OMEGA_HAVE_LIBARGTABLE2 1 +#endif + +/* Define to 1 if you have the `m' library (-lm). */ +#ifndef CLUSTAL_OMEGA_HAVE_LIBM +#define CLUSTAL_OMEGA_HAVE_LIBM 1 +#endif + +/* Define to 1 if you have the <limits.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_LIMITS_H +#define CLUSTAL_OMEGA_HAVE_LIMITS_H 1 +#endif + +/* Has log2() */ +#ifndef CLUSTAL_OMEGA_HAVE_LOG2 +#define CLUSTAL_OMEGA_HAVE_LOG2 1 +#endif + +/* Define to 1 if you have the <math.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_MATH_H +#define CLUSTAL_OMEGA_HAVE_MATH_H 1 +#endif + +/* Define to 1 if you have the <memory.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_MEMORY_H +#define CLUSTAL_OMEGA_HAVE_MEMORY_H 1 +#endif + +/* Define to 1 if you have the `ntohl' function. */ +#ifndef CLUSTAL_OMEGA_HAVE_NTOHL +#define CLUSTAL_OMEGA_HAVE_NTOHL 1 +#endif + +/* Define to 1 if you have the `ntohs' function. */ +#ifndef CLUSTAL_OMEGA_HAVE_NTOHS +#define CLUSTAL_OMEGA_HAVE_NTOHS 1 +#endif + +/* Define to 1 if you have the `ntonl' function. */ +/* #undef HAVE_NTONL */ + +/* Define to 1 if you have the `ntons' function. */ +/* #undef HAVE_NTONS */ + +/* Defined if OpenMP should and can be used */ +#ifndef CLUSTAL_OMEGA_HAVE_OPENMP +#define CLUSTAL_OMEGA_HAVE_OPENMP 1 +#endif + +/* Define to 1 if you have the <stdarg.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_STDARG_H +#define CLUSTAL_OMEGA_HAVE_STDARG_H 1 +#endif + +/* Define to 1 if you have the <stdint.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_STDINT_H +#define CLUSTAL_OMEGA_HAVE_STDINT_H 1 +#endif + +/* Define to 1 if you have the <stdio.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_STDIO_H +#define CLUSTAL_OMEGA_HAVE_STDIO_H 1 +#endif + +/* Define to 1 if you have the <stdlib.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_STDLIB_H +#define CLUSTAL_OMEGA_HAVE_STDLIB_H 1 +#endif + +/* Define to 1 if you have the <strings.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_STRINGS_H +#define CLUSTAL_OMEGA_HAVE_STRINGS_H 1 +#endif + +/* Define to 1 if you have the <string.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_STRING_H +#define CLUSTAL_OMEGA_HAVE_STRING_H 1 +#endif + +/* Define to 1 if you have the `stroul' function. */ +/* #undef HAVE_STROUL */ + +/* Define to 1 if you have the `strtoull' function. */ +#ifndef CLUSTAL_OMEGA_HAVE_STRTOULL +#define CLUSTAL_OMEGA_HAVE_STRTOULL 1 +#endif + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_SYS_STAT_H +#define CLUSTAL_OMEGA_HAVE_SYS_STAT_H 1 +#endif + +/* Define to 1 if you have the <sys/types.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_SYS_TYPES_H +#define CLUSTAL_OMEGA_HAVE_SYS_TYPES_H 1 +#endif + +/* Define to 1 if you have the <time.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_TIME_H +#define CLUSTAL_OMEGA_HAVE_TIME_H 1 +#endif + +/* Define to 1 if you have the <unistd.h> header file. */ +#ifndef CLUSTAL_OMEGA_HAVE_UNISTD_H +#define CLUSTAL_OMEGA_HAVE_UNISTD_H 1 +#endif + +/* This is a LINUX system */ +#ifndef CLUSTAL_OMEGA_LINUX +#define CLUSTAL_OMEGA_LINUX 1 +#endif + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#ifndef CLUSTAL_OMEGA_LT_OBJDIR +#define CLUSTAL_OMEGA_LT_OBJDIR ".libs/" +#endif + +/* This is a MinGW system */ +/* #undef MINGW */ + +/* No-debug Mode */ +#ifndef CLUSTAL_OMEGA_NDEBUG +#define CLUSTAL_OMEGA_NDEBUG /**/ +#endif + +/* Some strange OS */ +/* #undef OTHEROS */ + +/* Name of package */ +#ifndef CLUSTAL_OMEGA_PACKAGE +#define CLUSTAL_OMEGA_PACKAGE "clustal-omega" +#endif + +/* Define to the address where bug reports for this package should be sent. */ +#ifndef CLUSTAL_OMEGA_PACKAGE_BUGREPORT +#define CLUSTAL_OMEGA_PACKAGE_BUGREPORT "clustalw@ucd.ie" +#endif + +/* The package code name */ +#ifndef CLUSTAL_OMEGA_PACKAGE_CODENAME +#define CLUSTAL_OMEGA_PACKAGE_CODENAME "IbiMeVidebunt" +#endif + +/* Define to the full name of this package. */ +#ifndef CLUSTAL_OMEGA_PACKAGE_NAME +#define CLUSTAL_OMEGA_PACKAGE_NAME "Clustal Omega" +#endif + +/* Define to the full name and version of this package. */ +#ifndef CLUSTAL_OMEGA_PACKAGE_STRING +#define CLUSTAL_OMEGA_PACKAGE_STRING "Clustal Omega 0.2.0" +#endif + +/* Define to the one symbol short name of this package. */ +#ifndef CLUSTAL_OMEGA_PACKAGE_TARNAME +#define CLUSTAL_OMEGA_PACKAGE_TARNAME "clustal-omega" +#endif + +/* Define to the home page for this package. */ +#ifndef CLUSTAL_OMEGA_PACKAGE_URL +#define CLUSTAL_OMEGA_PACKAGE_URL "" +#endif + +/* Define to the version of this package. */ +#ifndef CLUSTAL_OMEGA_PACKAGE_VERSION +#define CLUSTAL_OMEGA_PACKAGE_VERSION "0.2.0" +#endif + +/* The size of `fpos_t', as computed by sizeof. */ +#ifndef CLUSTAL_OMEGA_SIZEOF_FPOS_T +#define CLUSTAL_OMEGA_SIZEOF_FPOS_T 16 +#endif + +/* The size of `unsigned int', as computed by sizeof. */ +#ifndef CLUSTAL_OMEGA_SIZEOF_UNSIGNED_INT +#define CLUSTAL_OMEGA_SIZEOF_UNSIGNED_INT 4 +#endif + +/* The size of `unsigned long', as computed by sizeof. */ +#ifndef CLUSTAL_OMEGA_SIZEOF_UNSIGNED_LONG +#define CLUSTAL_OMEGA_SIZEOF_UNSIGNED_LONG 8 +#endif + +/* The size of `unsigned long long', as computed by sizeof. */ +#ifndef CLUSTAL_OMEGA_SIZEOF_UNSIGNED_LONG_LONG +#define CLUSTAL_OMEGA_SIZEOF_UNSIGNED_LONG_LONG 8 +#endif + +/* The size of `unsigned short', as computed by sizeof. */ +#ifndef CLUSTAL_OMEGA_SIZEOF_UNSIGNED_SHORT +#define CLUSTAL_OMEGA_SIZEOF_UNSIGNED_SHORT 2 +#endif + +/* This is a Solaris system */ +/* #undef SOLARIS */ + +/* This is a BSD system */ +/* #undef SOMEBSD */ + +/* Define to 1 if you have the ANSI C header files. */ +#ifndef CLUSTAL_OMEGA_STDC_HEADERS +#define CLUSTAL_OMEGA_STDC_HEADERS 1 +#endif + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# define _ALL_SOURCE 1 +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# define _TANDEM_SOURCE 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif + + +/* Version number of package */ +#ifndef CLUSTAL_OMEGA_VERSION +#define CLUSTAL_OMEGA_VERSION "0.2.0" +#endif + +/* Define if using the dmalloc debugging malloc package */ +/* #undef WITH_DMALLOC */ + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `long int' if <sys/types.h> does not define. */ +/* #undef off_t */ + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ + +/* once: _SRC_CLUSTAL_OMEGA_CONFIG_H */ +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal-omega.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1395 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: clustal-omega.c 241 2011-05-04 14:37:17Z fabian $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <assert.h> + +#include "clustal-omega.h" +#include "hhalign/general.h" + +/* The following comment block contains the frontpage/mainpage of the doxygen + * documentation. Please add some more info. FIXME add more + */ + +/** + * + * @mainpage Clustal-Omega Documentation + * + * @section intro_sec Introduction + * + * For more information see http://www.clustal.org/ + * + * @section api_section API + * + * @subsection example_prog_subsection An Example Program + * + * To use libclustalo you will have to include the clustal-omega.h header and + * link against libclustalo. For linking against libclustalo you will have to + * use a C++ compiler, no matter if your program was written in C or C++. + * + * First compile (no linking) your source (for an example see section "\ref + * example_src_subsubsec"): + * + * @code + * $ gcc -c -ansi -Wall clustalo-api-test.c + * @endcode + * + * Then link against libclustalo (we recommend the use of pkg-config as + * explained in \ref pkgconfig_subsubsec). Assuming Clustal Omega was installed + * in system-wide default directory (e.g. /usr) just type: + * + * @code + * $ g++ -ansi -Wall -o clustalo-api-test clustalo-api-test.o -lclustalo + * @endcode + * + * Voila! Now you have your own alignment program which can be run with + * + * @code + * $ ./clustalo-api-test <your-sequence-input> + * @endcode + * + * It's best to use the same compiler that you used for compiling libclustal. + * If libclustal was compiled with OpenMP support, you will have to use OpenMP + * flags for you program as well. + * + * + * @subsubsection pkgconfig_subsubsec Using pkg-config / Figuring out compiler flags + * + * Clustal Omega comes with support for <a + * href="http://pkg-config.freedesktop.org">pkg-config</a>, which means you + * can run + * + * @code + * $ pkg-config --cflags --libs clustalo + * @endcode + * + * to figure out cflags and library flags needed to compile and link against + * libclustalo. This is especially handy if Clustal Omega was installed to a + * non-standard directory. + * + * You might have to change PKG_CONFIG_PATH. For example, if you used the prefix $HOME/local/ for + * installation then you will first need to set PKG_CONFIG_PATH: + * + * @code + * $ export PKG_CONFIG_PATH=$HOME/local/lib/pkgconfig + * $ pkg-config --cflags --libs clustalo + * @endcode + * + * + * To compile your source use: + * + * @code + * $ export PKG_CONFIG_PATH=$HOME/local/lib/pkgconfig + * $ gcc -c -ansi -Wall clustalo-api-test.c $(pkg-config --cflags clustalo) + * $ g++ -ansi -Wall -o clustalo-api-test clustalo-api-test.o $(pkg-config --libs clustalo) + * @endcode + * + * + * @subsubsection example_src_subsubsec Example Source Code + * + * @include "clustalo-api-test.c" + * + * + */ + + + + +/* FIXME: doc */ +/* the following are temporary flags while the code is still under construction; + had problems internalising hhmake, so as temporary crutch + write alignment to file and get external hmmer/hhmake via system call + to read alignment and convert into HMM + All this will go, once hhmake is properly internalised */ +#define INDIRECT_HMM 0 /* temp flag: (1) write aln to file, use system(hmmer/hhmake), (0) internal hhmake */ +#define USEHMMER 1 /* temp flag: use system(hmmer) to build HMM */ +#define USEHHMAKE (!USEHMMER) /* temp flag: use system(hhmake) to build HMM */ + + +/* shuffle order of input sequences */ +#define SHUFFLE_INPUT_SEQ_ORDER 0 + +/* sort input sequences by length */ +#define SORT_INPUT_SEQS 0 + + +int iNumberOfThreads; + +/* broken, unused and lonely */ +static const int ITERATION_SCORE_IMPROVEMENT_THRESHOLD = 0.01; + + +/** + * @brief Print Long version information to pre-allocated char. + * + * @note short version + * information is equivalent to PACKAGE_VERSION + * + * @param[out] pcStr + * char pointer to write to preallocated to hold iSize chars. + * @param[in] iSize + * size of pcStr + */ +void +PrintLongVersion(char *pcStr, int iSize) +{ + snprintf(pcStr, iSize, "version %s; code-name '%s'; build date %s", + PACKAGE_VERSION, PACKAGE_CODENAME, __DATE__); +} +/* end of PrintLongVersion() */ + + + +/** + * @brief free aln opts members + * + */ +void +FreeAlnOpts(opts_t *prAlnOpts) { + if (NULL != prAlnOpts->pcGuidetreeInfile) { + CKFREE(prAlnOpts->pcGuidetreeInfile); + } + if (NULL != prAlnOpts->pcGuidetreeOutfile) { + CKFREE(prAlnOpts->pcGuidetreeOutfile); + } + if (NULL != prAlnOpts->pcDistmatOutfile) { + CKFREE(prAlnOpts->pcDistmatOutfile); + } + if (NULL != prAlnOpts->pcDistmatInfile) { + CKFREE(prAlnOpts->pcDistmatInfile); + } +} +/* end of FreeAlnOpts() */ + + + +/** + * @brief Sets members of given user opts struct to default values + * + * @param[out] prOpts + * User opt struct to initialise + * + */ +void +SetDefaultAlnOpts(opts_t *prOpts) { + prOpts->bAutoOptions = FALSE; + + prOpts->pcDistmatInfile = NULL; + prOpts->pcDistmatOutfile = NULL; + + prOpts->iClusteringType = CLUSTERING_UPGMA; + prOpts->iPairDistType = PAIRDIST_KTUPLE; + prOpts->bUseMbed = FALSE; + prOpts->bUseMbedForIteration = FALSE; + prOpts->pcGuidetreeOutfile = NULL; + prOpts->pcGuidetreeInfile = NULL; + + prOpts->ppcHMMInput = NULL; + prOpts->iHMMInputFiles = 0; + + prOpts->iNumIterations = 0; + prOpts->bIterationsAuto = FALSE; + prOpts->iMaxGuidetreeIterations = INT_MAX; + prOpts->iMaxHMMIterations = INT_MAX; + prOpts->iMacRam = 2048; /* give 2GB to MAC algorithm. FS, r240 -> r241 */ + } +/* end of SetDefaultAlnOpts() */ + + + +/** + * @brief Check logic of parsed user options. Will exit (call Log(&rLog, LOG_FATAL, )) + * on Fatal logic error + * + * @param[in] prOpts + * Already parsed user options + * + */ +void +AlnOptsLogicCheck(opts_t *prOpts) +{ + /* guide-tree & distmat + * + */ + if (prOpts->pcDistmatInfile && prOpts->pcGuidetreeInfile) { + Log(&rLog, LOG_FATAL, "Read distances *and* guide-tree from file doesn't make sense."); + } + + if (prOpts->pcDistmatOutfile && prOpts->pcGuidetreeInfile) { + Log(&rLog, LOG_FATAL, "Won't be able to save distances to file, because I got a guide-tree as input."); + } + + /* combination of options that don't make sense when not iterating + */ + if (prOpts->iNumIterations==0 && prOpts->bIterationsAuto != TRUE) { + + if (prOpts->pcGuidetreeInfile && prOpts->pcGuidetreeOutfile) { + Log(&rLog, LOG_FATAL, "Got a guide-tree as input and output which doesn't make sense when not iterating."); + } + /* + if (prOpts->pcGuidetreeInfile && prOpts->bUseMbed > 0) { + Log(&rLog, LOG_FATAL, "Got a guide-tree as input and was requested to cluster with mBed, which doesn't make sense when not iterating."); + } + */ + if (prOpts->bUseMbedForIteration > 0) { + Log(&rLog, LOG_FATAL, "No iteration requested, but mbed for iteration was set. Paranoia exit."); + } + } + + if (prOpts->iMacRam < 512) { + + Log(&rLog, LOG_INFO, "Memory for MAC Algorithm quite low, Viterbi Algorithm may be triggered."); + + if (prOpts->iMacRam < 1) { + + Log(&rLog, LOG_WARN, "Viterbi Algorithm always turned on, increase MAC-RAM to turn on MAC."); + } + } + + return; +} +/* end of AlnOptsLogicCheck() */ + + +/** + * @brief FIXME doc + */ +void +PrintAlnOpts(FILE *prFile, opts_t *prOpts) +{ + int iAux; + + + /* keep in same order as struct */ + fprintf(prFile, "option: auto-options = %d\n", prOpts->bAutoOptions); + fprintf(prFile, "option: distmat-infile = %s\n", + NULL != prOpts->pcDistmatInfile? prOpts->pcDistmatInfile: "(null)"); + fprintf(prFile, "option: distmat-outfile = %s\n", + NULL != prOpts->pcDistmatOutfile? prOpts->pcDistmatOutfile: "(null)"); + fprintf(prFile, "option: clustering-type = %d\n", prOpts->iClusteringType); + fprintf(prFile, "option: pair-dist-type = %d\n", prOpts->iPairDistType); + fprintf(prFile, "option: use-mbed = %d\n", prOpts->bUseMbed); + fprintf(prFile, "option: use-mbed-for-iteration = %d\n", prOpts->bUseMbedForIteration); + fprintf(prFile, "option: guidetree-outfile = %s\n", + NULL != prOpts->pcGuidetreeOutfile? prOpts->pcGuidetreeOutfile: "(null)"); + fprintf(prFile, "option: guidetree-infile = %s\n", + NULL != prOpts->pcGuidetreeInfile? prOpts->pcGuidetreeInfile: "(null)"); + for (iAux=0; iAux<prOpts->iHMMInputFiles; iAux++) { + fprintf(prFile, "option: hmm-input no %d = %s\n", iAux, prOpts->ppcHMMInput[iAux]); + } + fprintf(prFile, "option: hmm-input-files = %d\n", prOpts->iHMMInputFiles); + fprintf(prFile, "option: num-iterations = %d\n", prOpts->iNumIterations); + fprintf(prFile, "option: iterations-auto = %d\n", prOpts->bIterationsAuto); + fprintf(prFile, "option: max-hmm-iterations = %d\n", prOpts->iMaxHMMIterations); + fprintf(prFile, "option: max-guidetree-iterations = %d\n", prOpts->iMaxGuidetreeIterations); +} +/* end of PrintAlnOpts() */ + + + +/** + * @brief Returns major version of HMMER. Whichever hmmbuild version + * is found first in your PATH will be used + * + * @return -1 on error, major hmmer version otherwise + * + */ +int +HmmerVersion() +{ + char zcHmmerTestCall[] = "hmmbuild -h"; + FILE *fp = NULL; + int iMajorVersion = 0; + char zcLine[16384]; + + if (NULL == (fp = popen(zcHmmerTestCall, "r"))) { + Log(&rLog, LOG_ERROR, "Couldn't exec %s", zcHmmerTestCall); + return -1; + } + while (fgets(zcLine, sizeof(zcLine), fp)) { + char *pcLocate; + if ((pcLocate = strstr(zcLine, "HMMER "))) { + iMajorVersion = atoi(&pcLocate[6]); + break; + } + } + pclose(fp); + + return iMajorVersion; +} +/* end of HmmerVersion() */ + + + +/** + * @brief Create a HHM file from aligned sequences + * + * @warning Should be eliminated in the future + * as building routine should not create intermediate files + * + * @param[in] prMSeq + * Aligned mseq_t + * @param[in] pcHMMOut + * HMM output file name + * + * @return Non-zero on error + * + */ +int +AlnToHHMFile(mseq_t *prMSeq, char *pcHMMOut) +{ + char *tmp_aln = NULL; + int retcode = OK; + + assert(NULL!=prMSeq); + assert(NULL!=pcHMMOut); + + if (FALSE == prMSeq->aligned) { + Log(&rLog, LOG_ERROR, "Sequences need to be aligned to create an HMM"); + return FAILURE; + } + + /* Convert alignment to a2m, and call hhmake + * + * can't be static templates, or mktemp fails (at least on os x + * (with a bus error)) + * + * gcc says we should use mkstemp to avoid race conditions, + * but that returns a file descriptor, which is of no use to + * us + */ + /* NOTE: the following won't work on windows: missing /tmp/ */ + tmp_aln = CkStrdup("/tmp/clustalo_tmpaln_XXXXXX"); + if (NULL == mktemp(tmp_aln)) { + Log(&rLog, LOG_ERROR, "Could not create temporary alignment filename"); + retcode = FAILURE; + goto cleanup_and_return; + } + if (WriteAlignment(prMSeq, tmp_aln, MSAFILE_A2M)) { + Log(&rLog, LOG_ERROR, "Could not save alignment to %s", tmp_aln); + retcode = FAILURE; + goto cleanup_and_return; + } + + if (HHMake_Wrapper(tmp_aln, pcHMMOut)){ + Log(&rLog, LOG_ERROR, "Could not convert alignment %s into HHM", tmp_aln); + retcode = FAILURE; + goto cleanup_and_return; + } + + + cleanup_and_return: + + if (NULL != tmp_aln) { + if (FileExists(tmp_aln)) { + if (remove(tmp_aln)) { + Log(&rLog, LOG_WARN, "Removing %s failed. Continuing anyway", tmp_aln); + } + } + CKFREE(tmp_aln); + } + + return retcode; + +} /* end of AlnToHHMFile() */ + + + +/** + * @brief Create a HMM file from aligned sequences + * + * @warning Should be replaced in the future by some internal HMM + * building routine that does not call external programs + * + * @param[in] prMSeq + * Aligned mseq_t + * @param[in] pcHMMOut + * HMM output file name + * + * @return Non-zero on error + * + + */ +int +AlnToHMMFile(mseq_t *prMSeq, const char *pcHMMOut) +{ + char *tmp_aln = NULL; + char *tmp_hmm = NULL; /* only needed for hmmer3 to hmmer2 conversion */ + char cmdbuf[16384]; + int iHmmerVersion = 0; + int retcode = OK; + + assert(NULL!=prMSeq); + assert(NULL!=pcHMMOut); + + if (FALSE == prMSeq->aligned) { + Log(&rLog, LOG_ERROR, "Sequences need to be aligned to create an HMM"); + return FAILURE; + } + + iHmmerVersion = HmmerVersion(); + if (2 != iHmmerVersion && 3 != iHmmerVersion) { + Log(&rLog, LOG_ERROR, "Could not find suitable HMMER binaries"); + return FAILURE; + } + + /* Convert alignment to stockholm, call hmmbuild and then + * either hmmconvert (hmmer3) or hmmcalibrate (hmmer2) + * + * can't be static templates, or mktemp fails (at least on os x + * (with a bus error)) + * + * gcc says we should use mkstemp to avoid race conditions, + * but that returns a file descriptor, which is of no use to + * us + */ + /* NOTE: the following won't work on windows: missing /tmp/ */ + tmp_aln = CkStrdup("/tmp/clustalo_tmpaln_XXXXXX"); + if (NULL == mktemp(tmp_aln)) { + Log(&rLog, LOG_ERROR, "Could not create temporary alignment filename"); + retcode = FAILURE; + goto cleanup_and_return; + } + if (WriteAlignment(prMSeq, tmp_aln, MSAFILE_STOCKHOLM)) { + Log(&rLog, LOG_ERROR, "Could not save alignment to %s", tmp_aln); + retcode = FAILURE; + goto cleanup_and_return; + } + + if (2 == iHmmerVersion) { + sprintf(cmdbuf, "hmmbuild %s %s >/dev/null && hmmcalibrate %s >/dev/null", + pcHMMOut, tmp_aln, pcHMMOut); + if (system(cmdbuf)) { + Log(&rLog, LOG_ERROR, "Command '%s' failed", cmdbuf); + retcode = FAILURE; + goto cleanup_and_return; + } + } else if (3 == iHmmerVersion) { + /* NOTE: the following won't work on windows: missing /tmp/ */ + tmp_hmm = CkStrdup("/tmp/clustalo_tmphmm2_XXXXXX"); + if (NULL == mktemp(tmp_hmm)) { + Log(&rLog, LOG_ERROR, "Could not create temporary hmm filename"); + retcode = FAILURE; + goto cleanup_and_return; + } + sprintf(cmdbuf, "hmmbuild %s %s >/dev/null && hmmconvert -2 %s > %s", + tmp_hmm, tmp_aln, tmp_hmm, pcHMMOut); + if (system(cmdbuf)) { + Log(&rLog, LOG_ERROR, "Command '%s' failed", cmdbuf); + retcode = FAILURE; + goto cleanup_and_return; + } + } else { + CKFREE(tmp_aln); + Log(&rLog, LOG_FATAL, "Internal error: Unknown Hmmer version %d", iHmmerVersion); + } + + + cleanup_and_return: + + if (NULL != tmp_aln) { + if (FileExists(tmp_aln)) { + if (remove(tmp_aln)) { + Log(&rLog, LOG_WARN, "Removing %s failed. Continuing anyway", tmp_aln); + } + } + CKFREE(tmp_aln); + } + if (NULL != tmp_hmm) { + if (FileExists(tmp_hmm)) { + if (remove(tmp_hmm)) { + Log(&rLog, LOG_WARN, "Removing %s failed. Continuing anyway", tmp_hmm); + } + } + CKFREE(tmp_hmm); + } + + return retcode; +} +/* end of AlnToHMMFile() */ + + + +/** + * @brief Convert a multiple sequence structure into a HMM + * + * @param[out] prHMM + * Pointer to preallocted HMM which will be set here + * @param[in] prMSeq + * Pointer to an alignment + * + * @return 0 on error, non-0 otherwise + * + * @see AlnToHMMFile() + * + */ +int +AlnToHMM(hmm_light *prHMM, mseq_t *prMSeq) +{ + char *pcHMM; /* temp hmm file */ + + Log(&rLog, LOG_INFO, + "Using HMMER version %d to calculate a new HMM.", + HmmerVersion()); + /* FIXME replace all this with internal HMM computation (HHmake) */ + + /** + * @warning the following probably won't work on windows: missing + * /tmp/. Should be ok on Cygwin though + */ + pcHMM = CkStrdup("/tmp/clustalo-hmm-iter_XXXXXX"); + if (NULL == mktemp(pcHMM)) { + Log(&rLog, LOG_ERROR, "Could not create temporary hmm filename"); + CKFREE(pcHMM); + return FAILURE; + } + + /* Create a HMM representing the current alignment + */ +#if USEHMMER + if (AlnToHMMFile(prMSeq, pcHMM)) { + Log(&rLog, LOG_ERROR, "AlnToHMMFile() on %s failed.", pcHMM); + CKFREE(pcHMM); + return FAILURE; + } +#elif USEHHMAKE + if (AlnToHHMFile(prMSeq, pcHMM)) { + Log(&rLog, LOG_ERROR, "AlnToHHMFile() on %s failed.", pcHMM); + CKFREE(pcHMM); + return FAILURE; + } + /* Log(&rLog, LOG_FATAL, "Method to create HHM (HMM using hhmake) not installed yet"); */ +#else + Log(&rLog, LOG_FATAL, "Unknown method to create temporary HMM"); +#endif + + /* Read HMM information + */ + if (OK != readHMMWrapper(prHMM, pcHMM)){ + Log(&rLog, LOG_ERROR, "Processing of HMM file %s failed", pcHMM); + CKFREE(pcHMM); + return FAILURE; + } + + if (remove(pcHMM)) { + Log(&rLog, LOG_WARN, "Removing %s failed. Continuing anyway", pcHMM); + } + CKFREE(pcHMM); + + return OK; +} +/* end of AlnToHMM() */ + + + +/** + * @brief FIXME + * + */ +void +InitClustalOmega(int iNumThreadsRequested) +{ + +#ifdef HAVE_OPENMP + iNumberOfThreads = iNumThreadsRequested; + omp_set_num_threads(iNumberOfThreads); +#else + if (iNumThreadsRequested>1) { + Log(&rLog, LOG_FATAL, "Cannot change number of threads to %d. %s was build without OpenMP support.", + iNumThreadsRequested, PACKAGE_NAME); + } + iNumberOfThreads = 1; /* need to set this, even if build without support */ +#endif + + Log(&rLog, LOG_INFO, "Using %d threads", + iNumberOfThreads); + +} +/* end of InitClustalOmega() */ + + + +/** + * @brief Defines an alignment order, which adds sequences + * sequentially, i.e. one at a time starting with seq 1 & 2 + * + * @param[out] piOrderLR_p + * order in which nodes/profiles are to be merged/aligned + * @param[in] iNumSeq + * Number of sequences + * + * @see TraverseTree() + * + */ +void +SequentialAlignmentOrder(int **piOrderLR_p, int iNumSeq) +{ + unsigned int uNodes = iNumSeq*2-1; + unsigned int uNodeCounter = 0; + unsigned int uSeqCounter = 0; + + Log(&rLog, LOG_FATAL, "FIXME: Untested..."); + + (*piOrderLR_p) = (int *)CKCALLOC(DIFF_NODE * uNodes, sizeof(int)); + /* loop over merge nodes, which have per definition even indices + * and set up children which have odd indices + */ + uSeqCounter = 0; + for (uNodeCounter=iNumSeq; uNodeCounter<uNodes; uNodeCounter+=1) { + unsigned int uLeftChildNodeIndex = uNodeCounter-1; + unsigned int uRightChildNodeIndex = uNodeCounter-iNumSeq+1; + unsigned int uParentNodeIndex = uNodeCounter+1; + + /* merge node setup */ + (*piOrderLR_p)[DIFF_NODE*uNodeCounter+LEFT_NODE] = uLeftChildNodeIndex; + (*piOrderLR_p)[DIFF_NODE*uNodeCounter+RGHT_NODE] = uRightChildNodeIndex; + (*piOrderLR_p)[DIFF_NODE*uNodeCounter+PRNT_NODE] = uParentNodeIndex; + /* only setup left child if at first merge node, all other left childs + * should be merge nodes that are already set up. also correct + * left node number here. + */ + if (uNodeCounter==iNumSeq) { + (*piOrderLR_p)[DIFF_NODE*uNodeCounter+LEFT_NODE] = 0; + + (*piOrderLR_p)[0+LEFT_NODE] = 0; + (*piOrderLR_p)[0+RGHT_NODE] = 0; + (*piOrderLR_p)[0+PRNT_NODE] = uNodeCounter; + uSeqCounter++; + + Log(&rLog, LOG_FORCED_DEBUG, "Set up first leaf with node counter %d: left=%d right=%d parent=%d", + 0, + (*piOrderLR_p)[DIFF_NODE*uLeftChildNodeIndex+LEFT_NODE], + (*piOrderLR_p)[DIFF_NODE*uLeftChildNodeIndex+RGHT_NODE], + (*piOrderLR_p)[DIFF_NODE*uLeftChildNodeIndex+PRNT_NODE]); + } + Log(&rLog, LOG_FORCED_DEBUG, "Set up merge node with node counter %d: left=%d right=%d parent=%d", + uNodeCounter, (*piOrderLR_p)[DIFF_NODE*uNodeCounter+LEFT_NODE], + (*piOrderLR_p)[DIFF_NODE*uNodeCounter+RGHT_NODE], + (*piOrderLR_p)[DIFF_NODE*uNodeCounter+PRNT_NODE]); + + /* right child */ + (*piOrderLR_p)[DIFF_NODE*uRightChildNodeIndex+LEFT_NODE] = uSeqCounter; + (*piOrderLR_p)[DIFF_NODE*uRightChildNodeIndex+RGHT_NODE] = uSeqCounter; + (*piOrderLR_p)[DIFF_NODE*uRightChildNodeIndex+PRNT_NODE] = uNodeCounter; + uSeqCounter++; + + Log(&rLog, LOG_FORCED_DEBUG, "Set up leaf with node counter %d: left=%d right=%d parent=%d", + uRightChildNodeIndex, (*piOrderLR_p)[DIFF_NODE*uRightChildNodeIndex+LEFT_NODE], + (*piOrderLR_p)[DIFF_NODE*uRightChildNodeIndex+RGHT_NODE], + (*piOrderLR_p)[DIFF_NODE*uRightChildNodeIndex+PRNT_NODE]); + } +} +/* end of SequentialAlignmentOrder() */ + + + +/** + * @brief Defines the alignment order by calculating a guide tree. In + * a first-step pairwise distances will be calculated (or read from a + * file). In a second step those distances will be clustered and a + * guide-tree created. Steps 1 and 2 will be skipped if a guide-tree + * file was given, in which case the guide-tree will be just read from + * the file. + * + * @param[out] piOrderLR_p + * order in which nodes/profiles are to be merged/aligned + * @param[out] pdSeqWeights_p + * Sequence weights + * @param[out] pdSeqWeights_p + * Sequence weights + * @param[in] prMSeq + * The sequences from which the alignment order is to be calculated + * @param[in] iPairDistType + * Method of pairwise distance comparison + * @param[in] pcDistmatInfile + * If not NULL distances will be read from this file instead of being + * calculated + * @param[in] pcDistmatOutfile + * If not NULL computed pairwise distances will be written to this file + * @param[in] iClusteringType + * Clustering method to be used to cluster the pairwise distances + * @param[in] pcGuidetreeInfile + * If not NULL guidetree will be read from this file. Skips pairwise + * distance and guidetree computation + * @param[in] pcGuidetreeOutfile + * If not NULL computed guidetree will be written to this file + * @param[in] bUseMbed + * If TRUE, fast mBed guidetree computation will be employed + * + * @return Non-zero on error + * + */ +int +AlignmentOrder(int **piOrderLR_p, double **pdSeqWeights_p, mseq_t *prMSeq, + int iPairDistType, char *pcDistmatInfile, char *pcDistmatOutfile, + int iClusteringType, char *pcGuidetreeInfile, char *pcGuidetreeOutfile, + bool bUseMbed) +{ + /* pairwise distance matrix (tmat in 1.83) */ + symmatrix_t *distmat = NULL; + /* guide tree */ + tree_t *prTree = NULL; + int i = 0; + + + /* Shortcut for only two sequences: Do not compute k-tuple + * distances. Use the same logic as in TraverseTree() to setup + * piOrderLR_p. Changes there will have to be reflected here as + * well. */ + if (2==prMSeq->nseqs) { + Log(&rLog, LOG_VERBOSE, + "Have only two sequences: No need to compute pairwise score and compute a tree."); + + (*piOrderLR_p) = (int*) CKMALLOC(DIFF_NODE * 3 * sizeof(int)); + (*piOrderLR_p)[DIFF_NODE*0+LEFT_NODE] = 0; + (*piOrderLR_p)[DIFF_NODE*0+RGHT_NODE] = 0; + (*piOrderLR_p)[DIFF_NODE*0+PRNT_NODE] = 0; + + (*piOrderLR_p)[DIFF_NODE*1+LEFT_NODE] = 1; + (*piOrderLR_p)[DIFF_NODE*1+RGHT_NODE] = 1; + (*piOrderLR_p)[DIFF_NODE*1+PRNT_NODE] = 1; + + /* root */ + (*piOrderLR_p)[DIFF_NODE*2+LEFT_NODE] = 0; + (*piOrderLR_p)[DIFF_NODE*2+RGHT_NODE] = 1; + (*piOrderLR_p)[DIFF_NODE*2+PRNT_NODE] = 2; + + /* Same logic as CalcClustalWeights(). Changes there will + have to be reflected here as well. */ +#if USE_WEIGHTS + (*pdWeights_p) = (double *) CKMALLOC(uNodeCount * sizeof(double)); + (*pdWeights_p)[0] = 0.5; + (*pdWeights_p)[1] = 0.5; +#endif + + return OK; + } + + + /* compute distance & guide tree, alternatively read distances or + * guide tree from file + * + */ + if (NULL != pcGuidetreeInfile) { + Log(&rLog, LOG_INFO, "Reading guide-tree from %s", pcGuidetreeInfile); + if (GuideTreeFromFile(&prTree, prMSeq, pcGuidetreeInfile)) { + Log(&rLog, LOG_ERROR, "Reading of guide tree %s failed.", pcGuidetreeInfile); + return FAILURE; + } + + } else { + + if (bUseMbed) { + if (Mbed(&prTree, prMSeq, iPairDistType, pcGuidetreeOutfile)) { + Log(&rLog, LOG_ERROR, "mbed execution failed."); + return FAILURE; + } + Log(&rLog, LOG_INFO, "Guide-tree computation (mBed) done."); + if (NULL != pcDistmatOutfile) { + Log(&rLog, LOG_INFO, + "Ignoring request to write distance matrix (am in mBed mode)"); + } + } else { + + if (PairDistances(&distmat, prMSeq, iPairDistType, + 0, prMSeq->nseqs, 0, prMSeq->nseqs, + pcDistmatInfile, pcDistmatOutfile)) { + Log(&rLog, LOG_ERROR, "Couldn't compute pair distances"); + return FAILURE; + } + + /* clustering of distances to get guide tree + */ + if (CLUSTERING_UPGMA == iClusteringType) { + char **labels; + labels = (char**) CKMALLOC(prMSeq->nseqs * sizeof(char*)); + for (i=0; i<prMSeq->nseqs; i++) { + labels[i] = prMSeq->sqinfo[i].name; + } + + GuideTreeUpgma(&prTree, labels, distmat, pcGuidetreeOutfile); + Log(&rLog, LOG_INFO, "Guide-tree computation done."); + + CKFREE(labels); + } else { + Log(&rLog, LOG_FATAL, "INTERNAL ERROR %s", + "clustering method should have been checked before"); + } + } + } + +#if USE_WEIGHTS + /* derive sequence weights from tree + * + */ + Log(&rLog, LOG_INFO, "Calculating sequence weights"); + CalcClustalWeights(pdSeqWeights_p, prTree); + for (i = 0; i < GetLeafCount(prTree); i++) { + Log(&rLog, LOG_VERBOSE, + "Weight for seq no %d: %s = %f", + i, prMSeq->sqinfo[i].name, (*pdSeqWeights_p)[i]); + } +#else + Log(&rLog, LOG_DEBUG, "Not using weights"); +#endif + + + /* define traversing order of tree + * + */ + TraverseTree(piOrderLR_p, prTree, prMSeq); + if (rLog.iLogLevelEnabled <= LOG_DEBUG) { + /* FIXME: debug only, FS */ + uint uNodeIndex; + FILE *fp = LogGetFP(&rLog, LOG_INFO); + Log(&rLog, LOG_DEBUG, "left/right order after tree traversal"); + for (uNodeIndex = 0; uNodeIndex < GetNodeCount(prTree); uNodeIndex++) { + fprintf(fp, "%3d:\t%2d/%2d -> %d\n", i, + (*piOrderLR_p)[DIFF_NODE*uNodeIndex+LEFT_NODE], + (*piOrderLR_p)[DIFF_NODE*uNodeIndex+RGHT_NODE], + (*piOrderLR_p)[DIFF_NODE*uNodeIndex+PRNT_NODE]); + } + } + + FreeMuscleTree(prTree); + FreeSymMatrix(&distmat); + +#if 0 + Log(&rLog, LOG_FATAL, "DEBUG EXIT before leaving %s", __FUNCTION__); +#endif + return OK; +} +/* end of AlignmentOrder() */ + + + +/** + * @brief Set some options automatically based on number of sequences. Might + * overwrite some user-set options. + * + * @param[out] prOpts + * Pointer to alignment options structure + * @param[in] iNumSeq + * Number of sequences to align + */ +void +SetAutoOptions(opts_t *prOpts, int iNumSeq) { + + Log(&rLog, LOG_INFO, + "Setting options automatically based on input sequence characteristics (might overwrite some of your options)."); + + if (iNumSeq >= 10000) { + if (0 != prOpts->iNumIterations) { + Log(&rLog, LOG_INFO, "Auto settings: Disabling iterations."); + prOpts->iNumIterations = 0; + } + if (FALSE == prOpts->bUseMbed) { + Log(&rLog, LOG_INFO, "Auto settings: Enabling mBed."); + prOpts->bUseMbed = TRUE; + } + + } else if (iNumSeq >= 1000) { + if (1 != prOpts->iNumIterations) { + Log(&rLog, LOG_INFO, "Auto settings: Setting iteration to 1."); + prOpts->iNumIterations = 1; + } + if (FALSE == prOpts->bUseMbed) { + Log(&rLog, LOG_INFO, "Auto settings: Enabling mBed."); + prOpts->bUseMbed = TRUE; + } + + + } else { + if (0 != prOpts->iNumIterations) { + Log(&rLog, LOG_INFO, "Auto settings: Disabling iterations."); + prOpts->iNumIterations = 0; + } + if (TRUE == prOpts->bUseMbed) { + Log(&rLog, LOG_INFO, "Auto settings: Disabling mBed."); + prOpts->bUseMbed = FALSE; + } + } +} +/* end of */ + + + +/** + * @brief The main alignment function which wraps everything else. + * + * @param[out] prMSeq + * *the* multiple sequences structure + * @param[in] prMSeqProfile + * optional profile to align against + * @param[in] prOpts + * alignmemnt options to use + * + * @return 0 on success, -1 on failure + * + */ +int +Align(mseq_t *prMSeq, + mseq_t *prMSeqProfile, + opts_t *prOpts, + hhalign_para rHhalignPara) { + + /* HMM + */ + /* structs with pseudocounts etc; one for each HMM infile, i.e. + * index range: 0..iHMMInputFiles */ + hmm_light *prHMMs = NULL; + + /* MSA order in which nodes/profiles are to be merged/aligned + (order of nodes in guide tree (left/right)*/ + int *piOrderLR = NULL; + + /* weights per sequence */ + double *pdSeqWeights = NULL; + + /* Iteration + */ + int iIterationCounter = 0; + double dAlnScore; + /* last dAlnScore for iteration */ + double dLastAlnScore = -666.666; + + int i, j; /* aux */ + + assert(NULL != prMSeq); + if (NULL != prMSeqProfile) { + assert(TRUE == prMSeqProfile->aligned); + } + + + /* automatic setting of options + * + */ + if (prOpts->bAutoOptions) { + SetAutoOptions(prOpts, prMSeq->nseqs); + } + + +#if SHUFFLE_INPUT_SEQ_ORDER + /* + * shuffle input: only useful for testing/debugging + */ + Log(&rLog, LOG_WARN, "Shuffling input sequences! (Will also change output order)"); + ShuffleMSeq(prMSeq); +#endif + + +#if SORT_INPUT_SEQS + /* + * sort input: + * + * would ensure we *always* (unless we get into the mbed k-means stage) + * get the same answer. usually you don't, because most pairwise alignment + * scores are in theory not symmetric, therefore sequence ordering might + * have an effect on the guide-tree. Sorting by length should get rid of + * this (and takes no time even for 100k seqs). Benchmark results on + * Balibase show almost no difference after sorting. + */ + Log(&rLog, LOG_WARN, "Sorting input seq by length! This will also change the output order"); + SortMSeqByLength(prMSeq, 'd'); + +#endif + + + /* Read backgrounds HMMs and store in prHMMs + * + */ + if (0 < prOpts->iHMMInputFiles) { + int iHMMInfileIndex; + + /** + * @warning old structure used to be initialised like this: + * hmm_light rHMM = {0}; + */ + prHMMs = (hmm_light *) CKMALLOC(prOpts->iHMMInputFiles * sizeof(hmm_light)); + + for (iHMMInfileIndex=0; iHMMInfileIndex<prOpts->iHMMInputFiles; iHMMInfileIndex++) { + char *pcHMMInput = prOpts->ppcHMMInput[iHMMInfileIndex]; + if (OK != readHMMWrapper(&prHMMs[iHMMInfileIndex], pcHMMInput)){ + Log(&rLog, LOG_ERROR, "Processing of HMM file %s failed", pcHMMInput); + return -1; + } + +#if 0 + Log(&rLog, LOG_FORCED_DEBUG, "HMM length is %d", prHMMs[iHMMInfileIndex].L); + Log(&rLog, LOG_FORCED_DEBUG, "n-display is %d", prHMMs[iHMMInfileIndex].n_display); + for (i = 0; NULL != prHMMs[prOpts->iHMMInputFiles].seq[i]; i++){ + printf("seq[%d]: %s\n", i, prHMMs[iHMMInfileIndex].seq[i]); + } + Log(&rLog, LOG_FORCED_DEBUG, "Neff_HMM is %f", prHMMs[iHMMInfileIndex].Neff_HMM); +#endif + if (rLog.iLogLevelEnabled <= LOG_DEBUG){ + Log(&rLog, LOG_DEBUG, "print frequencies"); + for (i = 0; i < prHMMs[iHMMInfileIndex].L; i++){ +#define PRINT_TAIL 5 + if ( (PRINT_TAIL+1 == i) && (prHMMs[iHMMInfileIndex].L-PRINT_TAIL != i) ){ + printf("....\n"); + } + if ( (i > PRINT_TAIL) && (i < prHMMs[iHMMInfileIndex].L-PRINT_TAIL) ){ + continue; + } + printf("%3d:", i); + for (j = 0; j < 20; j++){ + printf("\t%1.3f", prHMMs[iHMMInfileIndex].f[i][j]); + } + printf("\n"); + } + } /* debug print block */ + + CKFREE(prOpts->ppcHMMInput[iHMMInfileIndex]); + } /* for each background HMM file */ + CKFREE(prOpts->ppcHMMInput); + } /* there were background HMM files */ + + + + /* If the input ("non-profile") sequences are aligned, then turn + * the alignment into a HMM and add to the list of background HMMs + * + */ + if (TRUE == prMSeq->aligned) { + /* FIXME: gcc warns about missing initialiser here (-Wall -Wextra -pedantic) */ + hmm_light rHMMLocal = {0}; + + Log(&rLog, LOG_INFO, + "Input sequences are aligned. Will turn alignment into HMM and add it to the user provided background HMMs."); + if (OK != +#if INDIRECT_HMM + AlnToHMM(&rHMMLocal, prMSeq) +#else + AlnToHMM2(&rHMMLocal, prMSeq->seq, prMSeq->nseqs) +#endif + ) { + Log(&rLog, LOG_ERROR, "Couldn't convert aligned input sequences to HMM. Will try to continue"); + } else { + prHMMs = (hmm_light *) CKREALLOC(prHMMs, ((prOpts->iHMMInputFiles+1) * sizeof(hmm_light))); + memcpy(&(prHMMs[prOpts->iHMMInputFiles]), &rHMMLocal, sizeof(hmm_light)); + prOpts->iHMMInputFiles++; + } + } + + + /* If we have a profile turn it into a HMM and add to + * the list of background HMMs. + * + */ + if (NULL != prMSeqProfile) { + /* FIXME: gcc warns about missing initialiser here (-Wall -Wextra -pedantic) */ + hmm_light rHMMLocal = {0}; + Log(&rLog, LOG_INFO, + "Turning profile1 into HMM and will use it during progressive alignment."); + if (OK != +#if INDIRECT_HMM + AlnToHMM(&rHMMLocal, prMSeqProfile) +#else + AlnToHMM2(&rHMMLocal, prMSeqProfile->seq, prMSeqProfile->nseqs) +#endif + ) { + Log(&rLog, LOG_ERROR, "Couldn't convert profile1 to HMM. Will try to continue"); + } else { + prHMMs = (hmm_light *) CKREALLOC(prHMMs, ((prOpts->iHMMInputFiles+1) * sizeof(hmm_light))); + memcpy(&(prHMMs[prOpts->iHMMInputFiles]), &rHMMLocal, sizeof(hmm_light)); + prOpts->iHMMInputFiles++; + } + } + + + /* Now do a first alignment of the input sequences (prMSeq) adding + * all collected background HMMs + * + */ + /* Determine progressive alignment order + */ + if (TRUE == prMSeq->aligned) { + Log(&rLog, LOG_INFO, "%s %s", + "Input sequences are aligned.", + "Will use Kimura distances of aligned sequences."); + prOpts->iPairDistType = PAIRDIST_SQUIDID_KIMURA; + } + +#if 0 + Log(&rLog, LOG_WARN, "Using a sequential alignment order."); + SequentialAlignmentOrder(&piOrderLR, prMSeq->nseqs); +#else + if (OK != AlignmentOrder(&piOrderLR, &pdSeqWeights, prMSeq, + prOpts->iPairDistType, + prOpts->pcDistmatInfile, prOpts->pcDistmatOutfile, + prOpts->iClusteringType, + prOpts->pcGuidetreeInfile, prOpts->pcGuidetreeOutfile, + prOpts->bUseMbed)) { + Log(&rLog, LOG_ERROR, "AlignmentOrder() failed. Cannot continue"); + return -1; + } +#endif + + /* Progressive alignment of input sequences. Order defined by + * branching of guide tree (piOrderLR). Use optional + * background HMM information (prHMMs[0..prOpts->iHMMInputFiles-1]) + * + */ + dAlnScore = HHalignWrapper(prMSeq, piOrderLR, pdSeqWeights, + 2*prMSeq->nseqs -1/* nodes */, + prHMMs, prOpts->iHMMInputFiles, -1, rHhalignPara); + dLastAlnScore = dAlnScore; + Log(&rLog, LOG_VERBOSE, + "Alignment score for first alignment = %f", dAlnScore); + + + + + /* ------------------------------------------------------------ + * + * prMSeq is aligned now. Now start iterations if requested and save the + * alignment at the very end. + * + * @note We discard the background HMM information at this point, + * because it was already used. Could consider to make this choice + * optional. FIXME + * + * ------------------------------------------------------------ */ + + + /* iteration after first alignment was computed (if not profile-profile + * alignment) + * + */ + for (iIterationCounter=0; + (iIterationCounter < prOpts->iNumIterations || prOpts->bIterationsAuto); + iIterationCounter++) { + + hmm_light rHMMLocal = {0}; + /* FIXME Keep copy of old alignment in case new one sucks? */ + + + if (iIterationCounter >= prOpts->iMaxHMMIterations + && + iIterationCounter >= prOpts->iMaxGuidetreeIterations) { + Log(&rLog, LOG_VERBOSE, "Reached maximum number of HMM and guide-tree iterations"); + break; + } + + if (! prOpts->bIterationsAuto) { + Log(&rLog, LOG_INFO, "Iteration step %d out of %d", + iIterationCounter+1, prOpts->iNumIterations); + } else { + Log(&rLog, LOG_INFO, "Iteration step %d out of <auto>", + iIterationCounter+1); + } +#if 0 + if (rLog.iLogLevelEnabled <= LOG_VERBOSE) { + char zcIntermediate[1000] = {0}; + char *pcFormat = "fasta"; + sprintf(zcIntermediate, "clustalo-aln-iter~%d~", iIterationCounter); + if (WriteAlignment(prMSeq, zcIntermediate, MSAFILE_A2M)) { + Log(&rLog, LOG_ERROR, "Could not save alignment to %s", zcIntermediate); + return -1; + } + } +#endif + + + /* new guide-tree + * + */ + if (iIterationCounter < prOpts->iMaxGuidetreeIterations) { + /* determine progressive alignment order + * + * few things are different now when calling AlignmentOrder: + * - we have to ignore prOpts->pcDistmatInfile and pcGuidetreeInfile + * as they were used before + * - the corresponding outfiles are still valid though + */ + /* Free stuff that has already been allocated by or further + * downstream of AlignmentOrder() + */ + if (NULL != piOrderLR) + CKFREE(piOrderLR); + if (NULL != pdSeqWeights) + CKFREE(pdSeqWeights); + if (AlignmentOrder(&piOrderLR, &pdSeqWeights, prMSeq, + PAIRDIST_SQUIDID_KIMURA /* override */, NULL, prOpts->pcDistmatOutfile, + prOpts->iClusteringType, NULL, prOpts->pcGuidetreeOutfile, + prOpts->bUseMbedForIteration)) { + Log(&rLog, LOG_ERROR, "AlignmentOrder() failed. Cannot continue"); + return -1; + } + } else { + Log(&rLog, LOG_INFO, "Skipping guide-tree iteration at iteration step %d (reached maximum)", + iIterationCounter); + } + + + /* new local hmm iteration + * + */ + if (iIterationCounter < prOpts->iMaxHMMIterations) { + if (OK != +#if INDIRECT_HMM + AlnToHMM(&rHMMLocal, prMSeq) +#else + AlnToHMM2(&rHMMLocal, prMSeq->seq, prMSeq->nseqs) +#endif + ) { + Log(&rLog, LOG_ERROR, "Couldn't convert alignment to HMM. Will stop iterating now..."); + break; + } + } else { + Log(&rLog, LOG_INFO, "Skipping HMM iteration at iteration step %d (reached maximum)", + iIterationCounter); + } + + + /* align the sequences (again) + */ + dAlnScore = HHalignWrapper(prMSeq, piOrderLR, pdSeqWeights, + 2*prMSeq->nseqs -1/* nodes */, &rHMMLocal, 1, -1, rHhalignPara); + Log(&rLog, LOG_VERBOSE, + "Alignment score for alignmnent in hmm-iteration no %d = %f (last score = %f)", + iIterationCounter+1, dAlnScore, dLastAlnScore); + + + FreeHMMstruct(&rHMMLocal); + +#if 0 + /* FIXME: need a better score for automatic iteration */ + if (prOpts->bIterationsAuto) { + /* automatic iteration: break if score improvement was not + * big enough + */ + double dScoreImprovement = (dAlnScore-dLastAlnScore)/dLastAlnScore; + if (dScoreImprovement < ITERATION_SCORE_IMPROVEMENT_THRESHOLD) { + Log(&rLog, LOG_INFO, + "Stopping after %d guide-tree iterations. No further alignment score improvement achieved.", + iIterationCounter+1); + /* use previous alignment */ + FreeMSeq(&prMSeq); + Log(&rLog, LOG_FORCED_DEBUG, "FIXME: %s", "CopyMSeq breaks things in this context"); + CopyMSeq(&prMSeq, prMSeqCopy); + /* FIXME: prOpts->pcDistmatOutfile and pcGuidetreeOutfile + * might have been updated, but then discarded here? + */ + break; + } else { + Log(&rLog, LOG_INFO, + "Got a %d%% better score in iteration step %d", + (int)dScoreImprovement*100, iIterationCounter+1); + FreeMSeq(&prMSeqCopy); + } + } + dLastAlnScore = dAlnScore; +#endif + + } + /* end of iterations */ + + + + /* Last step: if a profile was also provided then align now-aligned mseq + * with this profile + * + * Don't use the backgrounds HMMs anymore and don't iterate. + * (which was done before). + * + */ + if (NULL != prMSeqProfile) { + if (AlignProfiles(prMSeq, prMSeqProfile, rHhalignPara)) { + Log(&rLog, LOG_ERROR, "An error occured during the profile/profile alignment"); + return -1; + } + } + + + if (NULL != piOrderLR) { + CKFREE(piOrderLR); + } + if (NULL != pdSeqWeights) { + CKFREE(pdSeqWeights); + } + if (0 < prOpts->iHMMInputFiles) { + for (i=0; i<prOpts->iHMMInputFiles; i++) { + FreeHMMstruct(&prHMMs[i]); + } + CKFREE(prHMMs); + } + + return 0; +} +/* end of Align() */ + + + + +/** + * @brief Align two profiles, ie two sets of prealigned sequences. Already + * aligned columns won't be changed. + * + * @param[out] prMSeqProfile1 + * First profile/aligned set of sequences. Merged alignment will be found in + * here. + * @param[in] prMSeqProfile2 + * First profile/aligned set of sequences + * + * @return 0 on success, -1 on failure + * + */ +int +AlignProfiles(mseq_t *prMSeqProfile1, + mseq_t *prMSeqProfile2, hhalign_para rHhalignPara) { + + double dAlnScore; + + /* number of seqs in first half of joined profile */ + int iProfProfSeparator = prMSeqProfile1->nseqs; + + assert(TRUE == prMSeqProfile1->aligned); + assert(TRUE == prMSeqProfile2->aligned); + + Log(&rLog, LOG_INFO, "Performing profile/profile alignment"); + + /* Combine the available mseqs into prMSeq + * which will be aligned afterwards. + */ + JoinMSeqs(&prMSeqProfile1, prMSeqProfile2); + + + /* set alignment flag explicitly to FALSE */ + prMSeqProfile1->aligned = FALSE; + + dAlnScore = HHalignWrapper(prMSeqProfile1, + NULL, /* no order */ + NULL, /* no weights */ + 3, /* nodes: root+2profiles */ + NULL, 0 /* no bg-hmms */, + iProfProfSeparator, rHhalignPara); + + Log(&rLog, LOG_VERBOSE, "Alignment score is = %f", dAlnScore); + + return 0; +} +/* end of AlignProfiles() */ + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal-omega.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,167 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: clustal-omega.h 212 2011-03-10 15:09:46Z andreas $ + */ + +#ifndef CLUSTALO_H +#define CLUSTALO_H + + + +#ifdef HAVE_OPENMP +#include <omp.h> +#endif + +#include "clustal-omega-config.h" + +/* the following needs to be kept in sync with library_include_HEADERS of all + * subdir Makefile.am's + */ + +/* hhalign */ +#include "hhalign/general.h" +#include "hhalign/hhfunc.h" + + +/* clustal */ +#include "clustal/log.h" +#include "clustal/util.h" +#include "clustal/symmatrix.h" +#include "clustal/tree.h" +#include "clustal/seq.h" +#include "clustal/mbed.h" +#include "clustal/weights.h" +#include "clustal/pair_dist.h" +#include "clustal/hhalign_wrapper.h" + + + +#define CLUSTERING_UNKNOWN 0 +#define CLUSTERING_UPGMA 1 + +/* weights will be computed if 1. but are not really used for now and they + * might slow things down. also, mbed's screws up branch lengths which will + * have a negative effect on weights +*/ +#define USE_WEIGHTS 0 + +extern int iNumberOfThreads; + + +/** user/commandline options + * + * changes here will have to be reflected in ParseCommandLine() + * and during setup of the default opts + * + */ +typedef struct { + /* auto: Clustal (know what) is good for you + */ + bool bAutoOptions; + + /* Distance matrix + */ + /** distance matrix input file */ + char *pcDistmatInfile; + /** distance matrix output file */ + char *pcDistmatOutfile; + + /* Clustering / guide-tree + */ + /** clustering type (from cmdline arg) */ + int iClusteringType; + /** pairwise distance method */ + int iPairDistType; + /** use mbed-like clustering */ + bool bUseMbed; + /** use mbed-like clustering also during iteration */ + bool bUseMbedForIteration; + /** guidetree output file */ + char *pcGuidetreeOutfile; + /** guidetree input file */ + char *pcGuidetreeInfile; + + /* HMMs + */ + /** HMM input files. index range: 0..iHMMInputFiles */ + char **ppcHMMInput; + /** number of provided HMM input files. not really a user + option but need for ppcHMMInput */ + int iHMMInputFiles; + + /* Iteration + */ + /** number of iterations */ + int iNumIterations; + /** determine number of iterations automatically */ + bool bIterationsAuto; + /** maximum number of hmm iterations */ + int iMaxHMMIterations; + /** max number of guidetree iterations */ + int iMaxGuidetreeIterations; + + /** max MAC RAM (maximum amount of RAM set aside for MAC algorithm) */ + int iMacRam; /* FS, r240 -> */ + + /* changes here will have to be reflected in FreeAlnOpts(), + * SetDefaultAlnOpts(), AlnOptsLogicCheck() etc + */ +} opts_t; + + + + + +extern void +PrintLongVersion(char *pcStr, int iSize); + +extern void +SetDefaultAlnOpts(opts_t *opts); + +extern void +FreeAlnOpts(opts_t *aln_opts); + +extern void +AlnOptsLogicCheck(opts_t *opts); + +extern void +PrintAlnOpts(FILE *prFile, opts_t *opts); + +extern void +InitClustalOmega(int iNumThreadsToUse); + +extern void +SequentialAlignmentOrder(int **piOrderLR_p, int iNumSeq); + +extern int +AlignmentOrder(int **piOrderLR_p, double **pdSeqWeights_p, mseq_t *prMSeq, + int iPairDistType, char *pcDistmatInfile, char *pcDistmatOutfile, + int iClusteringType, char *pcGuidetreeInfile, char *pcGuidetreeOutfile, + bool bUseMBed); + +extern int +Align(mseq_t *prMSeq, + mseq_t *prMSeqProfile, + opts_t *prOpts, + hhalign_para rHhalignPara); + +extern int +AlignProfiles(mseq_t *prMSeqProfile1, + mseq_t *prMSeqProfile2, hhalign_para rHhalignPara); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/Makefile.am Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,38 @@ +AM_CFLAGS = @OPENMP_CFLAGS@ @AM_CFLAGS@ +AM_LDFLAGS = @AM_LDFLAGS@ + +noinst_LTLIBRARIES = libclustal.la + +libclustal_la_SOURCES = \ + hhalign_wrapper.c hhalign_wrapper.h \ + ktuple_pair.c ktuple_pair.h \ + list.c list.h \ + log.c log.h \ + muscle_upgma.c muscle_upgma.h \ + muscle_tree.c muscle_tree.h \ + mbed.c mbed.h \ + pair_dist.h pair_dist.c \ + progress.c progress.h \ + queue.h \ + seq.c seq.h \ + symmatrix.c symmatrix.h \ + tree.c tree.h \ + util.c util.h \ + weights.c weights.h + +library_includedir=$(includedir)/clustalo/clustal + +library_include_HEADERS = \ + hhalign_wrapper.h \ + ktuple_pair.h \ + log.h \ + mbed.h \ + muscle_tree.h \ + pair_dist.h \ + progress.h \ + seq.h \ + symmatrix.h \ + tree.h \ + util.h \ + weights.h +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/Makefile.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,573 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/clustal +DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/ax_openmp.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libclustal_la_LIBADD = +am_libclustal_la_OBJECTS = hhalign_wrapper.lo ktuple_pair.lo list.lo \ + log.lo muscle_upgma.lo muscle_tree.lo mbed.lo pair_dist.lo \ + progress.lo seq.lo symmatrix.lo tree.lo util.lo weights.lo +libclustal_la_OBJECTS = $(am_libclustal_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libclustal_la_SOURCES) +DIST_SOURCES = $(libclustal_la_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(library_includedir)" +HEADERS = $(library_include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @OPENMP_CFLAGS@ @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CODENAME = @PACKAGE_CODENAME@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_LTLIBRARIES = libclustal.la +libclustal_la_SOURCES = \ + hhalign_wrapper.c hhalign_wrapper.h \ + ktuple_pair.c ktuple_pair.h \ + list.c list.h \ + log.c log.h \ + muscle_upgma.c muscle_upgma.h \ + muscle_tree.c muscle_tree.h \ + mbed.c mbed.h \ + pair_dist.h pair_dist.c \ + progress.c progress.h \ + queue.h \ + seq.c seq.h \ + symmatrix.c symmatrix.h \ + tree.c tree.h \ + util.c util.h \ + weights.c weights.h + +library_includedir = $(includedir)/clustalo/clustal +library_include_HEADERS = \ + hhalign_wrapper.h \ + ktuple_pair.h \ + log.h \ + mbed.h \ + muscle_tree.h \ + pair_dist.h \ + progress.h \ + seq.h \ + symmatrix.h \ + tree.h \ + util.h \ + weights.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/clustal/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/clustal/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libclustal.la: $(libclustal_la_OBJECTS) $(libclustal_la_DEPENDENCIES) + $(LINK) $(libclustal_la_OBJECTS) $(libclustal_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hhalign_wrapper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ktuple_pair.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muscle_tree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muscle_upgma.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pair_dist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progress.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/seq.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symmatrix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weights.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-library_includeHEADERS: $(library_include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(library_includedir)" || $(MKDIR_P) "$(DESTDIR)$(library_includedir)" + @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(library_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(library_includedir)" || exit $$?; \ + done + +uninstall-library_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(library_includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(library_includedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(library_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-library_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-library_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-library_includeHEADERS install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-library_includeHEADERS + + +# 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:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/hhalign_wrapper.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1003 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhalign_wrapper.c 241 2011-05-04 14:37:17Z fabian $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <ctype.h> + +#include "seq.h" +#include "tree.h" +#include "progress.h" +#include "hhalign/general.h" +#include "hhalign/hhfunc.h" +#include "hhalign/hhalign.h" + +/* up to this level (from leaf) will background HMM info be applied */ +#define APPLY_BG_HMM_UP_TO_TREE_DEPTH 10 + +#define TIMING 0 + +#define TRACE 0 + +/** + * @brief get rid of unknown residues + * + * @note HHalignWrapper can be entered in 2 different ways: (i) all + * sequences are un-aligned (ii) there are 2 (aligned) profiles. in + * the un-aligned case (i) the sequences come straight from Squid, + * that is, they have been sanitised, all non-alphabetic residues + * have been rendered as X's. In profile mode (ii) one profile may + * have been produced internally. In that case residues may have + * been translated back into their 'native' form, that is, they may + * contain un-sanitised residues. These will cause trouble during + * alignment + * FS, r213->214 + */ +void +SanitiseUnknown(mseq_t *mseq) +{ + + int iS; /* iterator for sequence */ + int iR; /* iterator for residue */ + int iLen; /* length of sequence */ + char *pcRes = NULL; + + + for (iS = 0; iS < mseq->nseqs; iS++){ + + for (pcRes = mseq->seq[iS]; '\0' != *pcRes; pcRes++){ + + if (isgap(*pcRes)){ + continue; + } + + if (mseq->seqtype==SEQTYPE_PROTEIN) { + if (NULL == strchr(AMINO_ALPHABET, toupper(*pcRes))) { + *pcRes = AMINOACID_ANY; + } + } else if (mseq->seqtype==SEQTYPE_DNA) { + if (NULL == strchr(DNA_ALPHABET, toupper(*pcRes))) { + *pcRes = NUCLEOTIDE_ANY; + } + } else if (mseq->seqtype==SEQTYPE_RNA) { + if (NULL == strchr(RNA_ALPHABET, toupper(*pcRes))) { + *pcRes = NUCLEOTIDE_ANY; + } + } + + } /* !EO String */ + + } /* 0 <= iS < mseq->nseqs */ + + return; + +} /*** end: SanitiseUnknown() ***/ + +/** + * @brief translate unknown residues back to ambiguity codes; + * hhalign translates ambiguity codes (B,Z) into unknown residue (X). + * we still have the original (un-aligned) residue information, + * by iterating along the original and aligned sequences we can + * reconstruct where codes have been changed and restore them + * to their original value + * + * @param[in,out] mseq + * sequence/profile data, mseq->seq [in,out] is changed to conform + * with mseq->orig_seq [in] + * + */ +void +TranslateUnknown2Ambiguity(mseq_t *mseq) +{ + + int iS; /* iterator for sequence */ + int iR, iRo; /* iterator for residue (original) */ + int iChange, iCase, iAmbi; /* counts how many replacements */ + static int siOffset = 'a' - 'A'; + + for (iS = 0; iS < mseq->nseqs; iS++){ + + iR = iRo = 0; + iChange = iCase = iAmbi = 0; + + while(('\0' != mseq->seq[iS][iR]) && + ('\0' != mseq->orig_seq[iS][iRo])) { + + /* skip gaps in aligned sequences */ + while(isgap(mseq->seq[iS][iR])) { + iR++; + } /* was gap in unaligned seq + * this should probably not happen */ + while(isgap(mseq->orig_seq[iS][iRo])) { + iRo++; + } /* was gap in aligned seq */ + + /* check if we reached the end of the sequence after + * skipping the gaps */ + if ( ('\0' == mseq->seq[iS][iR]) || + ('\0' == mseq->orig_seq[iS][iRo]) ){ + break; + } + + + if (mseq->seq[iS][iR] != mseq->orig_seq[iS][iRo]){ + /* FIXME: count replacements, discard case changes */ + iChange++; + if ( (mseq->seq[iS][iR] == mseq->orig_seq[iS][iRo]+siOffset) || + (mseq->seq[iS][iR] == mseq->orig_seq[iS][iRo]-siOffset) ){ + iCase++; + } + else { + iAmbi++; + } +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "seq=%d, pos=(%d:%d), (%c:%c)", + iS, iR, iRo, + mseq->seq[iS][iR], mseq->orig_seq[iS][iRo]); +#endif + mseq->seq[iS][iR] = mseq->orig_seq[iS][iRo]; + } + + iR++; + iRo++; + + } /* !EO seq */ + + Log(&rLog, LOG_DEBUG, + "in seq %d re-translated %d residue codes (%d true, %d case)", + iS, iChange, iAmbi, iCase); + + /* assert that both sequences (un/aligned) have terminated */ + /* skip gaps in aligned sequences */ + while(isgap(mseq->seq[iS][iR])) { + iR++; + } /* was gap in unaligned seq + * this should probably not happen */ + while(isgap(mseq->orig_seq[iS][iRo])) { + iRo++; + } /* was gap in aligned seq */ + + + if ( ('\0' != mseq->seq[iS][iR]) || + ('\0' != mseq->orig_seq[iS][iRo]) ){ + + Log(&rLog, LOG_FATAL, "inconsistency in un/aligned sequence %d\n>%s\n>%s\n", + iS, mseq->seq[iS], mseq->orig_seq[iS]); + } + + } /* 0 <= iS < mseq->nseqs */ + +} /*** end: TranslateUnknown2Ambiguity() ***/ + + +/** + * @brief re-attach leading and trailing gaps to alignment + * + * @param[in,out] prMSeq, + * alignment structure (at this stage there should be no un-aligned sequences) + * @param[in] iProfProfSeparator + * gives sizes of input profiles, -1 if no input-profiles but un-aligned sequences + * + * @note leading and tailing profile columns + * that only contain gaps have no effect on the alignment + * and are removed during the alignment. if they are + * encountered a warning message is printed to screen. + * some users like to preserve these gap columns + * FS, r213->214 + */ +void +ReAttachLeadingGaps(mseq_t *prMSeq, int iProfProfSeparator) +{ + + int i, j; + int iSize1 = 0; /* #seqs in 1st profile */ + int iSize2 = 0; /* #seqs in 2nd profile */ + int iPPS = iProfProfSeparator; + int iLeadO1 = 0; /* leading gaps in 1st seq of 1st profile */ + int iLeadO2 = 0; /* leading gaps in 1st seq of 2nd profile */ + int iLeadA1 = 0; /* leading gaps in 1st seq of final alignment */ + int iLeadA2 = 0; /* leading gaps in PPS seq of final alignment */ + int iTrailO1 = 0; /* trailing gaps in 1st seq of 1st profile */ + int iTrailO2 = 0; /* trailing gaps in 1st seq of 2nd profile */ + int iTrailA1 = 0; /* trailing gaps in 1st seq of final alignment */ + int iTrailA2 = 0; /* trailing gaps in PPS seq of final alignment */ + int iLen = 0; /* length of final alignment */ + int iLen1 = 0; /* length of 1st profile */ + int iLen2 = 0; /* length of 2nd profile */ + int iCutHead = 0; /* make up truncation at head */ + int iCutTail = 0; /* make up truncation at tail */ + char *pcIter = NULL; + + if (-1 == iProfProfSeparator){ + return; + } + else { + assert(prMSeq->aligned); + assert(prMSeq->nseqs > iProfProfSeparator); + } + iSize1 = iProfProfSeparator; + iSize2 = prMSeq->nseqs - iProfProfSeparator; + iLen = strlen(prMSeq->seq[0]); + iLen1 = strlen(prMSeq->orig_seq[0]); + iLen2 = strlen(prMSeq->orig_seq[iPPS]); + + /* count leading/trailing gaps in 1st sequence of 1st/2nd profile and final alignmant */ + for (iLeadO1 = 0, pcIter = prMSeq->orig_seq[0]; isgap(*pcIter); pcIter++, iLeadO1++); + for (iLeadO2 = 0, pcIter = prMSeq->orig_seq[iPPS]; isgap(*pcIter); pcIter++, iLeadO2++); + for (iLeadA1 = 0, pcIter = prMSeq->seq[0]; isgap(*pcIter); pcIter++, iLeadA1++); + for (iLeadA2 = 0, pcIter = prMSeq->seq[iPPS]; isgap(*pcIter); pcIter++, iLeadA2++); + for (iTrailO1 = 0, pcIter = &prMSeq->orig_seq[0][iLen1-1]; isgap(*pcIter); pcIter--, iTrailO1++); + for (iTrailO2 = 0, pcIter = &prMSeq->orig_seq[iPPS][iLen2-1]; isgap(*pcIter); pcIter--, iTrailO2++); + for (iTrailA1 = 0, pcIter = &prMSeq->seq[0][iLen-1]; isgap(*pcIter); pcIter--, iTrailA1++); + for (iTrailA2 = 0, pcIter = &prMSeq->seq[iPPS][iLen-1]; isgap(*pcIter); pcIter--, iTrailA2++); + + + /* turn leading/trailing gaps into truncation */ + iLeadO1 = iLeadO1 > iLeadA1 ? iLeadO1-iLeadA1 : 0; + iLeadO2 = iLeadO2 > iLeadA2 ? iLeadO2-iLeadA2 : 0; + iTrailO1 = iTrailO1 > iTrailA1 ? iTrailO1-iTrailA1 : 0; + iTrailO2 = iTrailO2 > iTrailA2 ? iTrailO2-iTrailA2 : 0; + iCutHead = iLeadO1 > iLeadO2 ? iLeadO1 : iLeadO2; + iCutTail = iTrailO1 > iTrailO2 ? iTrailO1 : iTrailO2; + + /* re-allocate and shift memory */ + for (i = 0; i < prMSeq->nseqs; i++){ + + CKREALLOC(prMSeq->seq[i], iLen+iCutHead+iCutTail+1); + memmove(prMSeq->seq[i]+iCutHead, prMSeq->seq[i], iLen); + for (j = 0; j < iCutHead; j++){ + prMSeq->seq[i][j] = '-'; + } + for (j = iLen+iCutHead; j < iLen+iCutHead+iCutTail; j++){ + prMSeq->seq[i][j] = '-'; + } + prMSeq->seq[i][j] = '\0'; + } + +} /*** end: ReAttachLeadingGaps() ***/ + +/** + * @brief reallocate enough memory for alignment and + * attach sequence pointers to profiles + * + * @param[in,out] mseq + * sequence/profile data, increase memory for sequences in profiles + * @param[out] ppcProfile1 + * pointers to sequencese in 1st profile + * @param[out] ppcProfile2 + * pointers to sequencese in 2nd profile + * @param[out] pdWeightsL + * weights (normalised to 1.0) for sequences in left profile + * @param[out] pdWeightsR + * weights (normalised to 1.0) for sequences in right profile + * @param[in] pdSeqWeights + * weights for _all_ sequences in alignment + * @param[in] iLeafCountL + * number of sequences in 1st profile + * @param[in] piLeafListL + * array of integer IDs of sequences in 1st profile + * @param[in] iLeafCountR + * number of sequences in 2nd profile + * @param[in] piLeafListR + * array of integer IDs of sequences in 2nd profile + * + */ +void +PrepareAlignment(mseq_t *mseq, char **ppcProfile1, char **ppcProfile2, + double *pdWeightsL, double *pdWeightsR, double *pdSeqWeights, + int iLeafCountL, int *piLeafListL, + int iLeafCountR, int *piLeafListR) +{ + + int iLenL = 0; /* length of 1st profile */ + int iLenR = 0; /* length of 2nd profile */ + int iMaxLen = 0; /* maximum possible length of alignment */ + int i; /* aux */ + double dWeight = 0.00; + double dWeightInv = 0.00; + + assert(NULL!=mseq); + assert(NULL!=ppcProfile1); + assert(NULL!=ppcProfile2); + assert(NULL!=piLeafListL); + assert(NULL!=piLeafListR); + + /* get length of profiles, + * in a profile all sequences should have same length so only look at 1st + */ + iLenL = strlen(mseq->seq[piLeafListL[0]]); + iLenR = strlen(mseq->seq[piLeafListR[0]]); + iMaxLen = iLenL + iLenR + 1; + + /* reallocate enough memory for sequences in alignment (for adding + * gaps) + */ + for (i = 0; i < iLeafCountL; i++){ + mseq->seq[piLeafListL[i]] = + CKREALLOC(mseq->seq[piLeafListL[i]], iMaxLen); + } + for (i = 0; i < iLeafCountR; i++){ + mseq->seq[piLeafListR[i]] = + CKREALLOC(mseq->seq[piLeafListR[i]], iMaxLen); + } + + /* attach sequences to profiles + */ + for (i = 0; i < iLeafCountL; i++){ + ppcProfile1[i] = mseq->seq[piLeafListL[i]]; + } + ppcProfile1[i] = NULL; + + for (i = 0; i < iLeafCountR; i++){ + ppcProfile2[i] = mseq->seq[piLeafListR[i]]; + } + ppcProfile2[i] = NULL; + + + /* remove terminal 'X' for single sequences: + * it is a quirk of hhalign() to delete 2 individual sequences + * if 2 terminal X's meet during alignment, + * just replace (one of) them. + * this can be undone at the end. + * profiles -consisting of more than 1 sequence- + * appear to be all-right. + * there seems to be no problem with B's and Z's + */ + if ( (1 == iLeafCountL) && (1 == iLeafCountR) ){ + + if ( ('X' == ppcProfile1[0][0]) && ('X' == ppcProfile2[0][0]) ){ +#define NOTX 'N' + ppcProfile1[0][0] = NOTX; /* FIXME: arbitrary assignment */ + ppcProfile2[0][0] = NOTX; /* FIXME: arbitrary assignment */ + } + if ( ('X' == ppcProfile1[0][iLenL-1]) && ('X' == ppcProfile2[0][iLenR-1]) ){ + ppcProfile1[0][iLenL-1] = NOTX; /* FIXME: arbitrary assignment */ + ppcProfile2[0][iLenR-1] = NOTX; /* FIXME: arbitrary assignment */ + } + } + + /* obtain sequence weights + */ + if (NULL != pdSeqWeights){ + + dWeight = 0.00; + for (i = 0; i < iLeafCountL; i++){ + register double dAux = pdSeqWeights[piLeafListL[i]]; +#ifndef NDEBUG + if (dAux <= 0.00){ + Log(&rLog, LOG_DEBUG, "seq-weight %d = %f", piLeafListL[i], dAux); + } +#endif + pdWeightsL[i] = dAux; + dWeight += dAux; + } /* 0 <= i < iLeafCountL */ + dWeightInv = 1.00 / dWeight; + for (i = 0; i < iLeafCountL; i++){ + pdWeightsL[i] *= dWeightInv; + } + + dWeight = 0.00; + for (i = 0; i < iLeafCountR; i++){ + register double dAux = pdSeqWeights[piLeafListR[i]]; +#ifndef NDEBUG + if (dAux <= 0.00){ + Log(&rLog, LOG_DEBUG, "seq-weight %d = %f", piLeafListR[i], dAux); + } +#endif + pdWeightsR[i] = dAux; + dWeight += dAux; + } /* 0 <= i < iLeafCountL */ + dWeightInv = 1.00 / dWeight; + for (i = 0; i < iLeafCountR; i++){ + pdWeightsR[i] *= dWeightInv; + } + } /* (NULL != pdSeqWeights) */ + else { + pdWeightsL[0] = pdWeightsR[0] = -1.00; + } + +#if TRACE + for (i = 0; i < iLeafCountL; i++){ + Log(&rLog, LOG_FORCED_DEBUG, "ppcProfile1[%d/%d] pointing to mseq %d = %s", + i, iLeafCountR, piLeafListL[i], ppcProfile1[i]); + } + for (i = 0; i < iLeafCountR; i++){ + Log(&rLog, LOG_FORCED_DEBUG, "ppcProfile2[%d/%d] pointing to mseq %d = %s", + i, iLeafCountR, piLeafListR[i], ppcProfile2[i]); + } +#endif + + return; + +} /*** end: PrepareAlignment() ***/ + + +/** + * @brief wrapper for hhalign. This is a frontend function to + * the ported hhalign code. + * + * @param[in,out] prMSeq + * holds the unaligned sequences [in] and the final alignment [out] + * @param[in] piOrderLR + * holds order in which sequences/profiles are to be aligned, + * even elements specify left nodes, odd elements right nodes, + * if even and odd are same then it is a leaf + * @param[in] pdSeqWeights + * Weight per sequence. No weights used if NULL + * @param[in] iNodeCount + * number of nodes in tree, piOrderLR has 2*iNodeCount elements + * @param[in] prHMMList + * List of background HMMs (transition/emission probabilities) + * @param[in] iHMMCount + * Number of input background HMMs + * @param[in] iProfProfSeparator + * Gives the number of sequences in the first profile, if in + * profile/profile alignment mode (iNodeCount==3). That assumes mseqs + * holds the sequences of profile 1 and profile 2. + * @param[in] rHhalignPara + * various parameters read from commandline + * + * @return score of the alignment FIXME what is this? + * + * @note complex function. could use some simplification, more and + * documentation and a struct'uring of piOrderLR + * + * @note HHalignWrapper can be entered in 2 different ways: + * (i) all sequences are un-aligned (ii) there are 2 (aligned) profiles. + * in the un-aligned case (i) the sequences come straight from Squid, + * that is, they have been sanitised, all non-alphabetic residues + * have been rendered as X's. In profile mode (ii) one profile may + * have been produced internally. In that case residues may have + * been translated back into their 'native' form, that is, they + * may contain un-sanitised residues. These will cause trouble + * during alignment + * + * @note: introduced argument hhalign_para rHhalignPara; FS, r240 -> r241 + */ + +double +HHalignWrapper(mseq_t *prMSeq, int *piOrderLR, + double *pdSeqWeights, int iNodeCount, + hmm_light *prHMMList, int iHMMCount, + int iProfProfSeparator, hhalign_para rHhalignPara) +{ + int iN; /* node iterator */ + int *piLeafCount = NULL; /* number of leaves beneath a certain node */ + int **ppiLeafList = NULL; /* list of leaves beneath a certain node */ + char **ppcProfile1 = NULL; /* pointer to sequences in profile */ + char **ppcProfile2 = NULL; /* pointer to sequences in profile */ + char *pcReprsnt1 = NULL; /* representative of HMM aligned to left */ + char *pcReprsnt2 = NULL; /* representative of HMM aligned to right */ + char **ppcReprsnt1 = &pcReprsnt1; /* representative of HMM aligned to L */ + char **ppcReprsnt2 = &pcReprsnt2; /* representative of HMM aligned to R */ + char *pcConsens1 = NULL; /* copy of left sequence */ + char *pcConsens2 = NULL; /* copy of right sequence */ + char **ppcCopy1 = /*&pcCopy1*/NULL; /* copy of left sequences */ + char **ppcCopy2 = /*&pcCopy2*/NULL; /* copy of right sequences */ + double *pdScores = NULL; /* alignment scores (seq/HMM) */ + double dScore = 0.0; /* alignment score (seq/HMM) */ + int iAux_FS = 0; + char zcAux[10000] = {0}; + char zcError[10000] = {0}; + int i; /* aux */ + progress_t *prProgress; + int iAlnLen; /* alignment length */ + double *pdWeightsL = NULL; /* sequence weights of left profile */ + double *pdWeightsR = NULL; /* sequence weights of right profile */ + int iMergeNodeCounter = 0; + hmm_light *prHMM = NULL; + bool bPrintCR = (rLog.iLogLevelEnabled<=LOG_VERBOSE) ? FALSE : TRUE; +#if TIMING + char zcStopwatchMsg[1024]; + Stopwatch_t *stopwatch = StopwatchCreate(); + StopwatchZero(stopwatch); + StopwatchStart(stopwatch); +#endif + + + if (NULL != prHMMList) { + if (iHMMCount>1) { + Log(&rLog, LOG_WARN, "FIXME: Using only first of %u HMMs (needs implementation)", iHMMCount); + } + prHMM = &(prHMMList[0]); + } else { + /* FIXME: prHMM not allowed to be NULL and therefore pseudo allocated here */ + prHMM = (hmm_light *) CKCALLOC(1, sizeof(hmm_light)); + } + + assert(NULL!=prMSeq); + + if (NULL==piOrderLR) { + assert(3==iNodeCount); + } + SanitiseUnknown(prMSeq); + + /* hhalign was not made for DNA/RNA. So warn if sequences are not + * protein + */ + if (SEQTYPE_PROTEIN != prMSeq->seqtype) { + Log(&rLog, LOG_WARN, "Sequence type is %s. HHalign has only been tested on protein.", + SeqTypeToStr(prMSeq->seqtype)); + } + + /* hhalign produces funny results if sequences contain gaps, so + * dealign. Only way to use alignment info is to use it as a + * background HMM + */ + if (TRUE == prMSeq->aligned) { + Log(&rLog, LOG_DEBUG, "Dealigning aligned sequences (inside %s)", __FUNCTION__); + DealignMSeq(prMSeq); + } + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "iNodeCount = %d", iNodeCount); +#endif + + + /* allocate top-level memory for leaf tracking arrays and profiles, + * and sequence weights*/ + piLeafCount = CKCALLOC(iNodeCount, sizeof(int)); + ppiLeafList = CKCALLOC(iNodeCount, sizeof(int *)); + ppcProfile1 = CKCALLOC(prMSeq->nseqs*2-1, sizeof(char *)); + ppcProfile2 = CKCALLOC(prMSeq->nseqs*2-1, sizeof(char *)); + pdScores = CKCALLOC(iNodeCount, sizeof(double)); + pdWeightsL = CKCALLOC(iNodeCount, sizeof(double)); + pdWeightsR = CKCALLOC(iNodeCount, sizeof(double)); + + NewProgress(&prProgress, LogGetFP(&rLog, LOG_INFO), + "Progressive alignment progress", bPrintCR); + + + /* Profile-profile alignment? Then setup piLeafCount and + * piLeafList here. FIXME this is just an awful haaaack + */ + if (iNodeCount==3 && NULL==piOrderLR) { + int iSizeProf1 = iProfProfSeparator; + int iSizeProf2 = prMSeq->nseqs - iProfProfSeparator; + + piLeafCount[0] = iSizeProf1; + ppiLeafList[0] = (int *)CKMALLOC(iSizeProf1 * sizeof(int)); + for (i=0;i<iSizeProf1;i++) { + ppiLeafList[0][i] = i; + } + piLeafCount[1] = iSizeProf2; + ppiLeafList[1] = (int *)CKMALLOC(iSizeProf2 * sizeof(int)); + for (i=0;i<iSizeProf2;i++) { + ppiLeafList[1][i] = i+iSizeProf1; + } + + /* awful hack inside an awful hack: we had to setup piLeafCount + * and piLeafList outside the node iteration. this which is + * normally done at leaf level inside the node iteration. to + * avoid overwriting the already setup vars set... + */ + iNodeCount=1; + + piOrderLR = (int *)CKCALLOC(DIFF_NODE, sizeof(int)); + piOrderLR[LEFT_NODE] = 0; + piOrderLR[RGHT_NODE] = 1; + piOrderLR[PRNT_NODE] = 2; + } + + + + iMergeNodeCounter = 0; + for (iN = 0; iN < iNodeCount; iN++){ + + register int riAux = DIFF_NODE * iN; + + /*LOG_DEBUG("node %d ", iN);*/ + + if (piOrderLR[riAux+LEFT_NODE] == piOrderLR[riAux+RGHT_NODE]){ + + register int riLeaf = piOrderLR[riAux+LEFT_NODE]; +#if TRACE + if (NULL == pdSeqWeights) { + Log(&rLog, LOG_FORCED_DEBUG, "node %d is a leaf with entry %d (seq %s)", + iN, riLeaf, prMSeq->sqinfo[riLeaf].name); + } else { + Log(&rLog, LOG_FORCED_DEBUG, "node %d is a leaf with entry %d (seq %s) and weight %f", + iN, riLeaf, prMSeq->sqinfo[riLeaf].name, pdSeqWeights[riLeaf]); + } +#endif + /* left/right entry same, this is a leaf */ + piLeafCount[piOrderLR[riAux+PRNT_NODE]] = 1; /* number of leaves is '1' */ + ppiLeafList[piOrderLR[riAux+PRNT_NODE]] = (int *)CKMALLOC(1 * sizeof(int)); + ppiLeafList[piOrderLR[riAux+PRNT_NODE]][0] = riLeaf; + + } /* was a leaf */ + else { + int iL, iR, iP; /* ID of left/right nodes, parent */ + int i, j; /* aux */ + + Log(&rLog, LOG_DEBUG, + "merge profiles at node %d", iN, piOrderLR[riAux]); + + /* iNodeCount - prMSeq->nseqs = total # of merge-nodes + * unless in profile/profile alignment mode + */ + if (1 == iNodeCount) { + ProgressLog(prProgress, ++iMergeNodeCounter, + 1, FALSE); + } else { + ProgressLog(prProgress, ++iMergeNodeCounter, + iNodeCount - prMSeq->nseqs, FALSE); + } + + /* left/right entry are not same, this is a merge node */ + iL = piOrderLR[riAux+LEFT_NODE]; + iR = piOrderLR[riAux+RGHT_NODE]; + iP = piOrderLR[riAux+PRNT_NODE]; + piLeafCount[iP] = piLeafCount[iL] + piLeafCount[iR]; + ppiLeafList[iP] = (int *)CKMALLOC(piLeafCount[iP] * sizeof(int)); + + for (i = j = 0; i < piLeafCount[iL]; i++, j++){ + ppiLeafList[iP][j] = ppiLeafList[iL][i]; + } + for (i = 0; i < piLeafCount[iR]; i++, j++){ + ppiLeafList[iP][j] = ppiLeafList[iR][i]; + } + + /* prepare simulation arena: + * - make sure enough memory in sequences + * - attach sequence pointers to profiles + */ + /* idea: switch template and query according to nseq? */ + + PrepareAlignment(prMSeq, ppcProfile1, ppcProfile2, + pdWeightsL, pdWeightsR, pdSeqWeights, + piLeafCount[iL], ppiLeafList[iL], + piLeafCount[iR], ppiLeafList[iR]); + if (rLog.iLogLevelEnabled <= LOG_DEBUG){ + int i; + FILE *fp = LogGetFP(&rLog, LOG_DEBUG); + Log(&rLog, LOG_DEBUG, "merging profiles %d & %d", iL, iR); + for (i = 0; i < piLeafCount[iL]; i++){ + fprintf(fp, "L/#=%3d (ID=%3d, w=%f): %s\n", + i, ppiLeafList[iL][i], pdWeightsL[i], ppcProfile1[i]); + } + for (i = 0; i < piLeafCount[iR]; i++){ + fprintf(fp, "R/#=%3d (ID=%3d, w=%f): %s\n", + i, ppiLeafList[iR][i], pdWeightsR[i], ppcProfile2[i]); + } + } + + + + /* align individual sequences to HMM; + * - use representative sequence to get gapping + * - create copies of both, individual/representative sequences + * as we don't want to introduce gaps into original + * + * FIXME: representative sequence is crutch, should use + * full HMM but that does not seem to work at all + * -- try harder! Fail better! + */ + if ( (piLeafCount[iL] <= APPLY_BG_HMM_UP_TO_TREE_DEPTH) && (0 != prHMM->L) ){ + int i, j; + pcReprsnt1 = CKCALLOC(prHMM->L+strlen(ppcProfile1[0])+1, sizeof(char)); + for (i = 0; i < prHMM->L; i++){ + pcReprsnt1[i] = prHMM->seq[prHMM->ncons][i+1]; + } + ppcCopy1 = CKCALLOC(piLeafCount[iL], sizeof(char *)); + for (j = 0; j < piLeafCount[iL]; j++){ + ppcCopy1[j] = CKCALLOC(prHMM->L+strlen(ppcProfile1[0])+1, sizeof(char)); + for (i = 0; i < (int) strlen(ppcProfile1[0]); i++){ + ppcCopy1[j][i] = ppcProfile1[j][i]; + } + } + + { + /* the size of the elements in the forward/backward matrices + depends very much on the lengths of the profiles _and_ + in which position (1st/2nd) the longer/shorter profile/HMM is. + the matrix elements can easily exceed the size of a (long?) double + if the longer profile/HMM is associated with the query (q) and the + shorter with the target (t). + FIXME: however, pseudo-count adding may also depend on position, + this is only really tested for the HMM being in the 1st position (q) + MUST TEST THIS MORE THOGOUGLY + + this switch appears to be most easily (although unelegantly) + effected here. Don't want to do it (upstairs) in PrepareAlignment() + because it might jumble up the nodes. Don't want to do it in hhalign() + either because ppcProfile1/2 and q/t may be used independently. + FS, r236 -> r237 + */ + int iLenA = strlen(ppcCopy1[0]); + int iLenH = prHMM->L; + + if (iLenH < iLenA){ + hhalign(ppcReprsnt1, 0/* only one representative seq*/, NULL, + ppcCopy1, piLeafCount[iL], pdWeightsL, + &dScore, prHMM, + NULL, NULL, NULL, NULL, + rHhalignPara, + iAux_FS++, /* DEBUG ARGUMENT */ + zcAux, zcError); + } + else { + hhalign(ppcCopy1, piLeafCount[iL], pdWeightsL, + ppcReprsnt1, 0/* only one representative seq*/, NULL, + &dScore, prHMM, + NULL, NULL, NULL, NULL, + rHhalignPara, + iAux_FS++, /* DEBUG ARGUMENT */ + zcAux, zcError); + } + } + pdScores[ppiLeafList[iL][0]] = dScore; +#if 0 + printf("score: %f\nL: %s\nH: %s\n", + dScore, ppcCopy1[0], ppcReprsnt1[0]); +#endif + /* assemble 'consensus'; + * this is not a real consensus, it is more a gap indicator, + * for each position it consists of residues/gaps in the 1st sequences, + * or a residue (if any) of the other sequences. + * it only contains a gap if all sequences of the profile + * have a gap at this position + */ + pcConsens1 = CKCALLOC(prHMM->L+strlen(ppcProfile1[0])+1, sizeof(char)); + for (i = 0; i < prHMM->L; i++){ + for (j = 0, pcConsens1[i] = '-'; (j < piLeafCount[iL]) && ('-' == pcConsens1[i]); j++){ + pcConsens1[i] = ppcCopy1[j][i]; + } + } +#if 0 + for (j = 0; (j < piLeafCount[iL]); j++){ + printf("L%d:%s\n", j, ppcCopy1[j]); + } + printf("LC:%s\n", pcConsens1); +#endif + } /* ( (1 == piLeafCount[iL]) && (0 != prHMM->L) ) */ + + if ( (piLeafCount[iR] <= APPLY_BG_HMM_UP_TO_TREE_DEPTH) && (0 != prHMM->L) ){ + int i, j; + + pcReprsnt2 = CKCALLOC(prHMM->L+strlen(ppcProfile2[0])+1, sizeof(char)); + for (i = 0; i < prHMM->L; i++){ + pcReprsnt2[i] = prHMM->seq[prHMM->ncons][i+1]; + } + ppcCopy2 = CKCALLOC(piLeafCount[iR], sizeof(char *)); + for (j = 0; j < piLeafCount[iR]; j++){ + ppcCopy2[j] = CKCALLOC(prHMM->L+strlen(ppcProfile2[0])+1, sizeof(char)); + for (i = 0; i < (int) strlen(ppcProfile2[0]); i++){ + ppcCopy2[j][i] = ppcProfile2[j][i]; + } + } + + { + /* the size of the elements in the forward/backward matrices + depends very much on the lengths of the profiles _and_ + in which position (1st/2nd) the longer/shorter profile/HMM is. + the matrix elements can easily exceed the size of a (long?) double + if the longer profile/HMM is associated with the query (q) and the + shorter with the target (t). + FIXME: however, pseudo-count adding may also depend on position, + this is only really tested for the HMM being in the 1st position (q) + MUST TEST THIS MORE THOGOUGLY + + this switch appears to be most easily (although unelegantly) + effected here. Don't want to do it (upstairs) in PrepareAlignment() + because it might jumble up the nodes. Don't want to do it in hhalign() + either because ppcProfile1/2 and q/t may be used independently. + FS, r236 -> r237 + */ + int iLenA = strlen(ppcCopy2[0]); + int iLenH = prHMM->L; + + if (iLenH < iLenA){ + hhalign(ppcReprsnt2, 0/* only one representative seq */, NULL, + ppcCopy2, piLeafCount[iR], pdWeightsR, + &dScore, prHMM, + NULL, NULL, NULL, NULL, + rHhalignPara, + iAux_FS++, /* DEBUG ARGUMENT */ + zcAux, zcError); + } + else { + hhalign(ppcCopy2, piLeafCount[iR], pdWeightsR, + ppcReprsnt2, 0/* only one representative seq */, NULL, + &dScore, prHMM, + NULL, NULL, NULL, NULL, + rHhalignPara, + iAux_FS++, /* DEBUG ARGUMENT */ + zcAux, zcError); + } + } + pdScores[ppiLeafList[iR][0]] = dScore; +#if 0 + printf("H: %s\nR: %s\nscore: %f\n", + ppcReprsnt2[0], ppcCopy2[0], dScore); +#endif + /* assemble 'consensus'; + * this is not a real consensus, it is more a gap indicator, + * for each position it consists of residues/gaps in the 1st sequences, + * or a residue (if any) of the other sequences. + * it only contains a gap if all sequences of the profile + * have a gap at this position + */ + pcConsens2 = CKCALLOC(prHMM->L+strlen(ppcProfile2[0])+1, sizeof(char)); + for (i = 0; i < prHMM->L; i++){ + for (j = 0, pcConsens2[i] = '-'; (j < piLeafCount[iR]) && ('-' == pcConsens2[i]); j++){ + pcConsens2[i] = ppcCopy2[j][i]; + } + } +#if 0 + for (j = 0; (j < piLeafCount[iR]); j++){ + printf("R%d:%s\n", j, ppcCopy2[j]); + } + printf("RC:%s\n", pcConsens2); +#endif + } /* ( (1 == piLeafCount[iR]) && (0 != prHMM->L) ) */ + + + + /* do alignment here (before free) + */ + { + /* the size of the elements in the forward/backward matrices + depends very much on the lengths of the profiles _and_ + in which position (1st/2nd) the longer/shorter profile is. + the matrix elements can easily exceed the size of a (long?) double + if the longer profile is associated with the query (q) and the + shorter with the target (t). + this switch appears to be most easily (although unelegantly) + effected here. Don't want to do it (upstairs) in PrepareAlignment() + because it might jumble up the nodes. Don't want to do it in hhalign() + either because ppcProfile1/2 and q/t may be used independently. + FS, r228 -> 229 + */ + int iLen1 = strlen(ppcProfile1[0]); + int iLen2 = strlen(ppcProfile2[0]); + + if (iLen1 < iLen2){ + hhalign(ppcProfile1, piLeafCount[iL], pdWeightsL, + ppcProfile2, piLeafCount[iR], pdWeightsR, + &dScore, prHMM, + pcConsens1, pcReprsnt1, + pcConsens2, pcReprsnt2, + rHhalignPara, + iAux_FS++, /* DEBUG ARGUMENT */ + zcAux, zcError); + } + else { + hhalign(ppcProfile2, piLeafCount[iR], pdWeightsR, + ppcProfile1, piLeafCount[iL], pdWeightsL, + &dScore, prHMM, + pcConsens2, pcReprsnt2, + pcConsens1, pcReprsnt1, + rHhalignPara, + iAux_FS++, /* DEBUG ARGUMENT */ + zcAux, zcError); + } + + } + /* free left/right node lists, + * after alignment left/right profiles no longer needed + */ + if (NULL != ppcCopy1){ + int i; + for (i = 0; i < piLeafCount[iL]; i++){ + CKFREE(ppcCopy1[i]); + } + CKFREE(ppcCopy1); + CKFREE(pcReprsnt1); + CKFREE(pcConsens1); + } + if (NULL != ppcCopy2){ + int i; + for (i = 0; i < piLeafCount[iR]; i++){ + CKFREE(ppcCopy2[i]); + } + CKFREE(ppcCopy2); + CKFREE(pcReprsnt2); + CKFREE(pcConsens2); + } + ppiLeafList[iL] = CKFREE(ppiLeafList[iL]); + ppiLeafList[iR] = CKFREE(ppiLeafList[iR]); + piLeafCount[iL] = piLeafCount[iR] = 0; + + } /* was a merge node */ + + if (rLog.iLogLevelEnabled <= LOG_DEBUG){ + int i, j; + FILE *fp = LogGetFP(&rLog, LOG_DEBUG); + for (i = 0; i < iNodeCount; i++){ + if (0 == piLeafCount[i]){ + continue; + } + fprintf(fp, "node %3d, #leaves=%d:\t", i, piLeafCount[i]); + for (j = 0; ppiLeafList && (j < piLeafCount[i]); j++){ + fprintf(fp, "%d,", ppiLeafList[i][j]); + } + fprintf(fp, "\n"); + } + } + + + } /* 0 <= iN < iNodeCount */ + ProgressDone(prProgress); + + + /* check length and set length info + */ + iAlnLen = strlen(prMSeq->seq[0]); + for (i=0; i<prMSeq->nseqs; i++) { +#if 0 + Log(&rLog, LOG_FORCED_DEBUG, "seq no %d: name %s; len %d; %s", + i, prMSeq->sqinfo[i].name, strlen(prMSeq->seq[i]), prMSeq->seq[i]); +#endif + +#ifndef NDEBUG + assert(iAlnLen == strlen(prMSeq->seq[i])); +#endif + prMSeq->sqinfo[i].len = iAlnLen; + } + prMSeq->aligned = TRUE; + + + if (rLog.iLogLevelEnabled <= LOG_DEBUG){ + if (0 != prHMM->L){ + int i; + Log(&rLog, LOG_DEBUG, "Alignment scores with HMM:"); + for (i = 0; /*pdScores[i] > 0.0*/i < prMSeq->nseqs; i++){ + Log(&rLog, LOG_DEBUG, "%2d:\t%f\n", i, pdScores[i]); + } + } + } + + + /** translate back ambiguity residues + * hhalign translates ambiguity codes (B,Z) into unknown residues (X). + * as we still have the original input we can substitute them back + */ + TranslateUnknown2Ambiguity(prMSeq); + ReAttachLeadingGaps(prMSeq, iProfProfSeparator); + + if (NULL == prHMMList){ + CKFREE(prHMM); + } + CKFREE(ppcProfile2); + CKFREE(ppcProfile1); + CKFREE(ppiLeafList[piOrderLR[DIFF_NODE*(iNodeCount-1)+PRNT_NODE]]); + CKFREE(ppiLeafList); + CKFREE(piLeafCount); + CKFREE(pdScores); + FreeProgress(&prProgress); + CKFREE(pdWeightsL); + CKFREE(pdWeightsR); + +#if TIMING + StopwatchStop(stopwatch); + StopwatchDisplay(stdout, "Total time for HHalignWrapper():" , stopwatch); + StopwatchFree(stopwatch); +#endif + + return dScore; /* FIXME alternative: return averaged pdScores */ + +} +/*** end: HHalignWrapper() ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/hhalign_wrapper.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,24 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhalign_wrapper.h 241 2011-05-04 14:37:17Z fabian $ + */ + + +extern double +HHalignWrapper(mseq_t *mseq, int *piOrderLR, + double *pdSeqWeights, int iNodeCount, + hmm_light *prHMMList, int iHMMCount, + int iProfProfSeparator, hhalign_para rHhalignPara);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/ktuple_pair.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,842 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: ktuple_pair.c 230 2011-04-09 15:37:50Z andreas $ + * + * + * K-Tuple code for pairwise alignment (Wilbur and Lipman, 1983; PMID + * 6572363). Most code taken from showpair.c (Clustal 1.83) + * DD: some functions now have lots of parameters as static variables + * were removed to make code OpenMP-friendly + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + + +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <stdlib.h> +#include <math.h> +#include <assert.h> + +#ifdef HAVE_OPENMP +#include <omp.h> +#endif + +#include "squid/squid.h" +#include "util.h" +#include "symmatrix.h" +#include "ktuple_pair.h" +#include "log.h" +#include "progress.h" + +#define END_MARK -3 /* see interface.c in 1.83 */ +#define NUMRES 32 /* max size of comparison matrix */ + +/* see notes below */ +#undef SORT_LAST_ELEMENT_AS_WELL + +/* gap_pos1 = NUMRES-2; /@ code for gaps inserted by clustalw @/ */ +static const int GAP_POS2 = NUMRES-1; /* code for gaps already in alignment */ +static bool DNAFLAG = FALSE; + +static const char *AMINO_ACID_CODES = "ABCDEFGHIKLMNPQRSTUVWXYZ-"; +static const char *NUCLEIC_ACID_CODES = "ACGTUN-"; +/* As far as I understand the gap symbol should not be necessary here, + * because we use isgap for testing later anyway. But changing this, + * will affect max_res_code and max_nuc as well. So I leave it for now + * as it is. AW + */ + +static bool percent = TRUE; + +static void make_ptrs(int *tptr, int *pl, const int naseq, const int l, const int ktup, const int max_res_code, char **seq_array); +static void put_frag(const int fs, const int v1, const int v2, const int flen, const int curr_frag, int *next, int *maxsf, int **accum); +static bool frag_rel_pos(int a1, int b1, int a2, int b2, int ktup); +static void des_quick_sort(int *array1, int *array2, const int array_size); +static void pair_align(int seq_no, int l1, int l2, int max_res_code, ktuple_param_t *aln_param, + char **seq_array, int *maxsf, int **accum, int max_aln_length, + int *zza, int *zzb, int *zzc, int *zzd); +static void encode(char *seq, char *naseq, int l, const char *res_codes); +static int res_index(const char *lookup, char c); + + +typedef struct { + int i1; + int i2; +} two_ints_t; + + + +/* default ktuple pairwise alignment parameters + * + */ +/* protein + */ +/* designated initializer */ +const ktuple_param_t default_protein_param = { + .ktup = 1, + .wind_gap = 3, + .signif = 5, + .window = 5, +}; +/* dna + */ +/* designated initializer */ +const ktuple_param_t default_dna_param = { + .ktup = 2, + .wind_gap = 5, + .signif = 4, + .window = 4, +}; + + +/** + * note: naseq should be unit-offset + */ +static void +encode(char *seq, char *naseq, int l, const char *res_codes) +{ + /* code seq as ints .. use GAP_POS2 for gap */ + register int i; + bool seq_contains_unknown_char = FALSE; + /*LOG_DEBUG("seq=%s naseq=%p l=%d", &(seq[1]), naseq, l); */ + + + for (i=1; i<=l; i++) { + char res = toupper(seq[i]); + if (isgap(res)) { + naseq[i] = GAP_POS2; /* gap in input */ + } else { + naseq[i] = res_index(res_codes, res); + } + + /*LOG_DEBUG("Character '%c' at pos %d", res, i);*/ + if (-1 == naseq[i]) { + seq_contains_unknown_char = TRUE; + /*LOG_DEBUG("Unknown character '%c' at pos %d", res, i);*/ + } + /*LOG_DEBUG("na_seq[%d]=%d", i, naseq[i]);*/ + } + + if (TRUE == seq_contains_unknown_char) + Log(&rLog, LOG_WARN, "Unknown character in seq '%s'", &(seq[1])); + + naseq[i] = END_MARK; + + return; +} +/* end of encode */ + + +/** + * + */ +static int +res_index(const char *t, char c) +{ + register int i; + for (i=0; t[i] && t[i] != c; i++) + ; + if (t[i]) { + return (i); + } else { + return -1; + } +} +/* end of res_index */ + + +/** + * + */ +static void +make_ptrs(int *tptr, int *pl, const int naseq, const int l, const int ktup, const int max_res_code, char **seq_array) +{ + /* FIXME make 10 a constant and give it a nice name */ + static int a[10]; + int i, j, code, flag; + char residue; + const int limit = (int) pow((double)(max_res_code+1),(double)ktup); + + for (i=1;i<=ktup;i++) + a[i] = (int) pow((double)(max_res_code+1),(double)(i-1)); + + for (i=1; i<=limit; ++i) + pl[i]=0; + for (i=1; i<=l; ++i) + tptr[i]=0; + + for (i=1; i<=(l-ktup+1); ++i) { + code=0; + flag=FALSE; + for (j=1; j<=ktup; ++j) { + /* Log(&rLog, LOG_FORCED_DEBUG, "naseq=%d i=%d j=%d seq_array[naseq]=%p", + * naseq, i, j, seq_array[naseq]); + */ + residue = seq_array[naseq][i+j-1]; + /* Log(&rLog, LOG_FORCED_DEBUG, "residue = %d", residue); */ + if ((residue<0) || (residue > max_res_code)){ + flag=TRUE; + break; + } + code += ((residue) * a[j]); + } + if (flag) + continue; + ++code; + if (0 != pl[code]) + tptr[i] =pl[code]; + pl[code] = i; + } + + return; +} +/* end of make_ptrs */ + + +/** + * + * FIXME Why hardcoding of 5? + */ +static void +put_frag(const int fs, const int v1, const int v2, const int flen, const int curr_frag, int *next, int *maxsf, int **accum) +{ + int end; + accum[0][curr_frag]=fs; + accum[1][curr_frag]=v1; + accum[2][curr_frag]=v2; + accum[3][curr_frag]=flen; + + if (!*maxsf) { + *maxsf=1; + accum[4][curr_frag]=0; + return; + } + + if (fs >= accum[0][*maxsf]) { + accum[4][curr_frag]=*maxsf; + *maxsf=curr_frag; + return; + } else { + *next=*maxsf; + while (TRUE) { + end=*next; + *next=accum[4][*next]; + if (fs>=accum[0][*next]) + break; + } + accum[4][curr_frag]=*next; + accum[4][end]=curr_frag; + } + + return; +} +/* end of put_frag */ + + +/** + * + */ +static bool +frag_rel_pos(int a1, int b1, int a2, int b2, int ktup) +{ + if (a1-b1 == a2-b2) { + if (a2<a1) { + return TRUE; + } + } else { + if (a2+ktup-1<a1 && b2+ktup-1<b1) { + return TRUE; + } + } + return FALSE; +} +/* end of frag_rel_pos */ + + + + +/** + * + * @note: This is together with des_quick_sort most time consuming + * routine according to gprof on r110. Tried to replace it with qsort + * and/or QSortAndTrackIndex(), which is always slower! So we keep the + * original. + * + * Original doc: Quicksort routine, adapted from chapter 4, page 115 + * of software tools by Kernighan and Plauger, (1986). Sort the + * elements of array1 and sort the elements of array2 accordingly + * + * There might be a bug here. The original function apparently never + * touches the last element and keeps it as is. Tried to fix this (see + * SORT_LAST_ELEMENT_AS_WELL) which gives slightly worse performance + * (-0.5% on BB). My fix might not be working or it's not a bug at + * all... + * + * + * + */ +static void +des_quick_sort(int *array1, int *array2, const int array_size) +{ + int temp1, temp2; + int p, pivlin; + int i, j; + int lst[50], ust[50]; /* the maximum no. of elements must be*/ + /* < log(base2) of 50 */ + +#if 0 + for (i=1; i<=array_size; i++) { + Log(&rLog, LOG_FORCED_DEBUG, "b4 sort array1[%d]=%d array2[%d]=%d", i, array1[i], i, array2[i]); + } +#endif + lst[1] = 1; + +#ifdef SORT_LAST_ELEMENT_AS_WELL + ust[1] = array_size; +#else + /* original */ + ust[1] = array_size-1; +#endif + p = 1; + + + while (p > 0) { + if (lst[p] >= ust[p]) { + p--; + } else { + i = lst[p] - 1; + j = ust[p]; + pivlin = array1[j]; + while (i < j) { + for (i=i+1; array1[i] < pivlin; i++) + ; + for (j=j-1; j > i; j--) + if (array1[j] <= pivlin) break; + if (i < j) { + temp1 = array1[i]; + array1[i] = array1[j]; + array1[j] = temp1; + + temp2 = array2[i]; + array2[i] = array2[j]; + array2[j] = temp2; + } + } + + j = ust[p]; + + temp1 = array1[i]; + array1[i] = array1[j]; + array1[j] = temp1; + + temp2 = array2[i]; + array2[i] = array2[j]; + array2[j] = temp2; + + if (i-lst[p] < ust[p] - i) { + lst[p+1] = lst[p]; + ust[p+1] = i - 1; + lst[p] = i + 1; + + } else { + lst[p+1] = i + 1; + ust[p+1] = ust[p]; + ust[p] = i - 1; + } + p = p + 1; + } + } + +#if 0 + for (i=1; i<=array_size; i++) { + Log(&rLog, LOG_FORCED_DEBUG, "after sort array1[%d]=%d array2[%d]=%d", i, array1[i], i, array2[i]); + } +#endif + + return; +} +/* end of des_quick_sort */ + + + +/** + * + * FIXME together with des_quick_sort most time consuming routine + * according to gprof on r110 + * + */ +static void +pair_align(int seq_no, int l1, int l2, int max_res_code, ktuple_param_t *aln_param, + char **seq_array, int *maxsf, int **accum, int max_aln_length, + int *zza, int *zzb, int *zzc, int *zzd) +{ + int next; /* forrmerly static */ + int pot[8],i, j, l, m, flag, limit, pos, vn1, vn2, flen, osptr, fs; + int tv1, tv2, encrypt, subt1, subt2, rmndr; + char residue; + int *diag_index; + int *displ; + char *slopes; + int curr_frag; + const int tl1 = (l1+l2)-1; + + assert(NULL!=aln_param); + + /* + Log(&rLog, LOG_FORCED_DEBUG, "DNAFLAG=%d seq_no=%d l1=%d l2=%d window=%d ktup=%d signif=%d wind_gap=%d", + DNAFLAG, seq_no, l1, l2, window, ktup, signif, + wind_gap); + */ + + slopes = (char *) CKCALLOC(tl1+1, sizeof(char)); + displ = (int *) CKCALLOC(tl1+1, sizeof(int)); + diag_index = (int *) CKMALLOC((tl1+1) * sizeof(int)); + + for (i=1; i<=tl1; ++i) { + /* unnecessary, because we calloced: slopes[i] = displ[i] = 0; */ + diag_index[i] = i; + } + + for (i=1;i<=aln_param->ktup;i++) + pot[i] = (int) pow((double)(max_res_code+1),(double)(i-1)); + limit = (int) pow((double)(max_res_code+1),(double)aln_param->ktup); + + + + /* increment diagonal score for each k_tuple match */ + + for (i=1; i<=limit; ++i) { + vn1=zzc[i]; + while (TRUE) { + if (!vn1) break; + vn2 = zzd[i]; + while (0 != vn2) { + osptr = vn1-vn2+l2; + ++displ[osptr]; + vn2 = zzb[vn2]; + } + vn1=zza[vn1]; + } + } + + + /* choose the top SIGNIF diagonals + */ + +#ifdef QSORT_REPLACEMENT + /* This was an attempt to replace des_quick_sort with qsort(), + * which turns out to be much slower, so don't use this + */ + + /* FIXME: if we use this branch, we don't need to init diag_index + * before, because that is done in QSortAndTrackIndex() + * automatically. + */ +#if 0 + for (i=1; i<=tl1; i++) { + Log(&rLog, LOG_FORCED_DEBUG, "b4 sort disp[%d]=%d diag_index[%d]=%d", i, diag_index[i], i, displ[i]); + } +#endif + + QSortAndTrackIndex(&(diag_index[1]), &(displ[1]), tl1, 'a', TRUE); + +#if 0 + for (i=1; i<=tl1; i++) { + Log(&rLog, LOG_FORCED_DEBUG, "after sort disp[%d]=%d diag_index[%d]=%d", i, diag_index[i], i, displ[i]); + } +#endif + +#else + + des_quick_sort(displ, diag_index, tl1); + +#endif + + j = tl1 - aln_param->signif + 1; + + if (j < 1) { + j = 1; + } + + /* flag all diagonals within WINDOW of a top diagonal */ + + for (i=tl1; i>=j; i--) { + if (displ[i] > 0) { + pos = diag_index[i]; + l = (1 > pos - aln_param->window) ? + 1 : pos - aln_param->window; + m = (tl1 < pos + aln_param->window) ? + tl1 : pos + aln_param->window; + for (; l <= m; l++) + slopes[l] = 1; + } + } + + for (i=1; i<=tl1; i++) { + displ[i] = 0; + } + + curr_frag=*maxsf=0; + + for (i=1; i<=(l1-aln_param->ktup+1); ++i) { + encrypt=flag=0; + for (j=1; j<=aln_param->ktup; ++j) { + residue = seq_array[seq_no][i+j-1]; + if ((residue<0) || (residue>max_res_code)) { + flag=TRUE; + break; + } + encrypt += ((residue)*pot[j]); + } + if (flag) { + continue; + } + ++encrypt; + + vn2=zzd[encrypt]; + + flag=FALSE; + while (TRUE) { + if (!vn2) { + flag=TRUE; + break; + } + osptr=i-vn2+l2; + if (1 != slopes[osptr]) { + vn2=zzb[vn2]; + continue; + } + flen=0; + fs=aln_param->ktup; + next=*maxsf; + + /* + * A-loop + */ + + while (TRUE) { + if (!next) { + ++curr_frag; + if (curr_frag >= 2*max_aln_length) { + Log(&rLog, LOG_VERBOSE, "(Partial alignment)"); + goto free_and_exit; /* Yesss! Always wanted to + * use a goto (AW) */ + } + displ[osptr]=curr_frag; + put_frag(fs, i, vn2, flen, curr_frag, &next, maxsf, accum); + + } else { + tv1=accum[1][next]; + tv2=accum[2][next]; + + if (frag_rel_pos(i, vn2, tv1, tv2, aln_param->ktup)) { + if (i-vn2 == accum[1][next]-accum[2][next]) { + if (i > accum[1][next]+(aln_param->ktup-1)) { + fs = accum[0][next]+aln_param->ktup; + } else { + rmndr = i-accum[1][next]; + fs = accum[0][next]+rmndr; + } + flen=next; + next=0; + continue; + + } else { + if (0 == displ[osptr]) { + subt1=aln_param->ktup; + } else { + if (i > accum[1][displ[osptr]]+(aln_param->ktup-1)) { + subt1=accum[0][displ[osptr]]+aln_param->ktup; + } else { + rmndr=i-accum[1][displ[osptr]]; + subt1=accum[0][displ[osptr]]+rmndr; + } + } + subt2=accum[0][next] - aln_param->wind_gap + aln_param->ktup; + if (subt2>subt1) { + flen=next; + fs=subt2; + } else { + flen=displ[osptr]; + fs=subt1; + } + next=0; + continue; + } + } else { + next=accum[4][next]; + continue; + } + } + break; + } + /* + * End of Aloop + */ + + vn2=zzb[vn2]; + } + } + +free_and_exit: + CKFREE(displ); + CKFREE(slopes); + CKFREE(diag_index); + + return; +} +/* end of pair_align */ + + + +/** + * + * Will compute ktuple scores and store in tmat + * Following values will be set: tmat[i][j], where + * istart <= i <iend + * and + * jstart <= j < jend + * i.e. zero-offset + * tmat data members have to be preallocated + * + * if ktuple_param_t *aln_param == NULL defaults will be used + */ +void +KTuplePairDist(symmatrix_t *tmat, mseq_t *mseq, + int istart, int iend, + int jstart, int jend, + ktuple_param_t *param_override, + progress_t *prProgress, + unsigned long int *ulStepNo, unsigned long int ulTotalStepNo) +{ + /* this first group of variables were previously static + and hence un-parallelisable */ + char **seq_array; + int maxsf; + int **accum; + int max_aln_length; + /* divide score with length of smallest sequence */ + int *zza, *zzb, *zzc, *zzd; + int private_step_no = 0; + + int i, j, dsr; + double calc_score; + int max_res_code = -1; + + int max_seq_len; + int *seqlen_array; + /* progress_t *prProgress; */ + /* int uStepNo, uTotalStepNo; */ + ktuple_param_t aln_param = default_protein_param; + bool bPrintCR = (rLog.iLogLevelEnabled<=LOG_VERBOSE) ? FALSE : TRUE; + + + if(prProgress == NULL) { + NewProgress(&prProgress, LogGetFP(&rLog, LOG_INFO), + "Ktuple-distance calculation progress", bPrintCR); + } + + /* conversion to old style data types follows + * + */ + + seqlen_array = (int*) CKMALLOC((mseq->nseqs+1) * sizeof(int)); + for (i=0; i<mseq->nseqs; i++) { + seqlen_array[i+1] = mseq->sqinfo[i].len; + } + + /* setup alignment parameters + */ + if (SEQTYPE_PROTEIN == mseq->seqtype) { + DNAFLAG = FALSE; + max_res_code = strlen(AMINO_ACID_CODES)-2; + aln_param = default_protein_param; + + } else if (SEQTYPE_RNA == mseq->seqtype || SEQTYPE_DNA == mseq->seqtype) { + DNAFLAG = TRUE; + max_res_code = strlen(NUCLEIC_ACID_CODES)-2; + aln_param = default_dna_param; + + } else { + Log(&rLog, LOG_FATAL, "Internal error in %s: Unknown sequence type.", __FUNCTION__); + } + + if (NULL!=param_override) { + aln_param.ktup = param_override->ktup; + aln_param.wind_gap = param_override->wind_gap; + aln_param.signif = param_override->signif; + aln_param.window = param_override->window; + } + + /*LOG_DEBUG("DNAFLAG = %d max_res_code = %d", DNAFLAG, max_res_code);*/ + + /* convert mseq to clustal's old-style int encoded sequences (unit-offset) + */ + max_aln_length = 0; + max_seq_len = 0; + seq_array = (char **) CKMALLOC((mseq->nseqs+1) * sizeof(char *)); + seq_array[0] = NULL; + /* FIXME check that non of the seqs is smaller than ktup (?). + * Otherwise segfault occurs + */ + for (i=0; i<mseq->nseqs; i++) { + seq_array[i+1] = (char *) CKMALLOC((seqlen_array[i+1]+2) * sizeof (char));; + } + for (i=0; i<mseq->nseqs; i++) { + /*LOG_DEBUG("calling encode with seq_array[%d+1] len=%d and seq=%s", + i, seqlen_array[i+1], mseq->seq[i]);*/ + if (TRUE == DNAFLAG) { + encode(&(mseq->seq[i][-1]), seq_array[i+1], + seqlen_array[i+1], NUCLEIC_ACID_CODES); + } else { + encode(&(mseq->seq[i][-1]), seq_array[i+1], + seqlen_array[i+1], AMINO_ACID_CODES); + } + + if (seqlen_array[i+1]>max_seq_len) { + max_seq_len = seqlen_array[i+1]; + } + } + max_aln_length = max_seq_len * 2; + /* see sequence.c in old source */ + + /* FIXME: short sequences can cause seg-fault + * because max_aln_length can get shorter + * than (max_res_code+1)^k + * FS, r222->r223 */ + max_aln_length = max_aln_length > pow((max_res_code+1), aln_param.ktup)+1 ? + max_aln_length : pow((max_res_code+1), aln_param.ktup)+1; + + /* + * + * conversion to old style clustal done (in no time) */ + + + accum = (int **) CKCALLOC(5, sizeof (int *)); + for (i=0;i<5;i++) { + accum[i] = (int *) CKCALLOC((2*max_aln_length+1), sizeof(int)); + } + zza = (int *) CKCALLOC( (max_aln_length+1), sizeof(int)); + zzb = (int *) CKCALLOC( (max_aln_length+1), sizeof(int)); + zzc = (int *) CKCALLOC( (max_aln_length+1), sizeof(int)); + zzd = (int *) CKCALLOC( (max_aln_length+1), sizeof(int)); + + /* estimation of total number of steps (if istart and jstart are + * both 0) (now handled in the calling routine) + */ + /* uTotalStepNo = iend*jend - iend*iend/2 + iend/2; + uStepNo = 0; */ + /*LOG_DEBUG("istart=%d iend=%d jstart=%d jend=%d", istart, iend, jstart, jend);*/ + + for (i=istart+1; i<=iend; ++i) { + /* by definition a sequence compared to itself should give + a score of 0. AW */ + SymMatrixSetValue(tmat, i-1, i-1, 0.0); + make_ptrs(zza, zzc, i, seqlen_array[i], aln_param.ktup, max_res_code, seq_array); + +#ifdef HAVE_OPENMP + #pragma omp critical(ktuple) +#endif + { + ProgressLog(prProgress, *ulStepNo, ulTotalStepNo, FALSE); + } + + for (j=MAX(i+1, jstart+1); j<=jend; ++j) { + (*ulStepNo)++; + private_step_no++; + /*LOG_DEBUG("comparing pair %d:%d", i, j);*/ + + make_ptrs(zzb, zzd, j, seqlen_array[j], aln_param.ktup, max_res_code, seq_array); + pair_align(i, seqlen_array[i], seqlen_array[j], max_res_code, &aln_param, + seq_array, &maxsf, accum, max_aln_length, zza, zzb, zzc, zzd); + + if (!maxsf) { + calc_score=0.0; + } else { + calc_score=(double)accum[0][maxsf]; + if (percent) { + dsr=(seqlen_array[i]<seqlen_array[j]) ? + seqlen_array[i] : seqlen_array[j]; + calc_score = (calc_score/(double)dsr) * 100.0; + } + } + + /* printf("%d %d %d\n", i-1, j-1, (100.0 - calc_score)/100.0); */ + SymMatrixSetValue(tmat, i-1, j-1, (100.0 - calc_score)/100.0); + + /* the function allows you not to compute the full matrix. + * here we explicitely make the resulting matrix a + * rectangle, i.e. we always set full rows. in other + * words, if we don't complete the full matrix then we + * don't have a full symmetry. so only use the defined + * symmetric part. AW + */ + /*LOG_DEBUG("setting %d : %d = %f", j, i, tmat[i][j]);*/ + /* not needed anymore since we use symmatrix_t + if (j<=iend) { + tmat[j][i] = tmat[i][j]; + } + */ +#ifdef HAVE_OPENMP + #pragma omp critical(ktuple) +#endif + { + Log(&rLog, LOG_DEBUG, "K-tuple distance for sequence pair %d:%d = %lg", + i, j, SymMatrixGetValue(tmat, i-1, j-1)); + } + } + } + /* + Log(&rLog, LOG_FORCED_DEBUG, "uTotalStepNo=%d for istart=%d iend=%d jstart=%d jend=%d", uStepNo, istart, iend, jstart, jend); + Log(&rLog, LOG_FORCED_DEBUG, "Fabian = %d", iend*jend - iend*iend/2 + iend/2); + */ + +/* printf("\n\n%d\t%d\t%d\t%d\n\n", omp_get_thread_num(), uStepNo, istart, iend); */ + + for (i=0;i<5;i++) { + CKFREE(accum[i]); + } + CKFREE(accum); + +#ifdef HAVE_OPENMP + #pragma omp critical(ktuple) +#if 0 + { + printf("steps: %d\n", private_step_no); + } +#endif +#endif + + CKFREE(zza); + CKFREE(zzb); + CKFREE(zzc); + CKFREE(zzd); + + free(seqlen_array); + + for (i=1; i<=mseq->nseqs; i++) { + CKFREE(seq_array[i]); + } + CKFREE(seq_array); +} +/* end of KTuplePairDist */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/ktuple_pair.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,47 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: ktuple_pair.h 193 2011-02-07 15:45:21Z andreas $ + */ + +/* K-Tuple code for pairwise alignment (Wilbur and Lipman (1983) + * Most code taken from showpair (Clustal 1.83) + */ + + +#ifndef CLUSTALO_KTUPLE_PAIR_H +#define CLUSTALO_KTUPLE_PAIR_H + +#include "seq.h" +#include "symmatrix.h" +#include "progress.h" + +typedef struct { + int ktup; + int window; + int wind_gap; + int signif; +} ktuple_param_t; + + +extern void +KTuplePairDist(symmatrix_t *tmat, mseq_t *mseq, + int istart, int iend, + int jstart, int jend, + ktuple_param_t *aln_param, + progress_t *prProgress, + unsigned long int *ulStepNo, unsigned long int ulTotalStepNo); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/list.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,389 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: list.c 156 2010-11-18 10:52:40Z andreas $ + * + * Single linked list and FIFO/Queue + * + * Based on Kyle Loudon's Mastering Algorithms with C + * http://oreilly.com/catalog/9781565924536 + * + * Allows generic data types by using void* pointers, which works fine + * as long as your data is just pointers. + * + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <assert.h> +#include <string.h> /* for memset */ + +#include "list.h" + +#ifdef LIST_TEST +#include <stdio.h> +#include "queue.h" +#include "time.h" +#endif + +/** + * @brief Initialise data members of a list + * + * @param[in] prList + * List to initialise + * @param[in] destroy + * A function to be called with pointer to data when destroying the + * list. NULL if in doubt, free in most other cases. + * Note: doxygen will always fail to parse this... + */ +void +ListInit(list_t *prList, void (*destroy)(void *data)) { + prList->size = 0; + prList->destroy = destroy; + prList->head = NULL; + prList->tail = NULL; + + return; +} +/* end of ListInit() */ + + + +/** + * @brief Calls user defined function to free data in list and resets + * the list to NULL. Call even if your destroy function is NULL. + * + * @param[in] prList + * The list to destroy + * + */ +void +ListDestroy(list_t *prList) { + void *pvData; + + while (LIST_SIZE(prList) > 0) { + if (0 == ListRemoveNext(prList, NULL, (void **)&pvData) + && + NULL != prList->destroy) { + prList->destroy(pvData); + } + } + /* precaution */ + memset(prList, 0, sizeof(list_t)); + + return; +} +/* end of ListDestroy() */ + + + +/** + * + * @brief Insert data next to given element + * + * @param[in] prList + * List into which to insert + * @param[in] prElement + * Current position/element. Element after which to insert. If NULL + * head is used. + * @param[in] pvData + * Pointer to data to store + * + * @return Non-zero on failure + */ +int +ListInsertNext(list_t *prList, list_elem_t *prElement, const void *pvData) +{ + list_elem_t *prNewElement; + + if (NULL == (prNewElement = (list_elem_t *) malloc(sizeof(list_elem_t)))) + return -1; + + prNewElement->data = (void *)pvData; + + if (NULL == prElement) { + /* insertion at head */ + if (LIST_SIZE(prList) == 0) + prList->tail = prNewElement; + prNewElement->next = prList->head; + prList->head = prNewElement; + + } else { + /* insert somewhere other than at head */ + if (NULL == prElement->next) + prList->tail = prNewElement; + prNewElement->next = prElement->next; + prElement->next = prNewElement; + } + + prList->size++; + + return 0; +} +/* end of ListInsertNext() */ + + + +/** + * @brief Remove next element from current element/position. + * + * @param[in] prList + * List from which an element is to be removed. + * @param[in] prElement + * Current element/position. Next item will be removed. If NULL head + * is used. + * @param[out] pvData_p + * Will be pointed to removed elements data. + * + * @return Non-zero on failure + */ +int +ListRemoveNext(list_t *prList, list_elem_t *prElement, void **pvData_p) +{ + list_elem_t *prOldElement; + + if (0 == LIST_SIZE(prList)) + return -1; + + if (NULL == prElement) { + /* handle removal from the head of the list */ + *pvData_p = prList->head->data; + prOldElement = prList->head; + prList->head = prList->head->next; + if (1 == LIST_SIZE(prList)) + prList->tail = NULL; + + } else { + /* handle removal from somewhere other than the head */ + if (NULL == prElement->next) + return -1; + + *pvData_p = prElement->next->data; + prOldElement = prElement->next; + prElement->next = prElement->next->next; + + if (NULL == prElement->next) + prList->tail = prElement; + } + + free(prOldElement); + + prList->size--; + + return 0; +} +/* end of ListRemoveNext() */ + + + +/** + * @brief Insert int next to given element + * + * @param[in] prList + * List into which to insert + * @param[in] prElement + * Current position/element. Element after which to insert. If NULL + * head is used. + * @param[in] data + * int to store + * + * @return Non-zero on failure + * + */ +int +IntListInsertNext(list_t *prList, list_elem_t *prElement, const int data) +{ + int *piInt; + + if (NULL == (piInt = malloc(sizeof(int)))) { + return -1; + } + *piInt = data; + + return ListInsertNext(prList, prElement, piInt); + } +/* end if IntListInsertNext() */ + + +/** + * @brief Remove next element from current element/position. + * + * @param[in] prList + * List from which an element is to be removed. + * @param[in] prElement + * Current element/position. Next item will be removed. If NULL head + * is used. + * @param[out] iData_p + * Will be pointed to removed elements data. + * + * @return Non-zero on failure + * + */ +int +IntListRemoveNext(list_t *prList, list_elem_t *prElement, int *iData_p) +{ + int *piData; + int res; + res = ListRemoveNext(prList, prElement, (void **)&piData); + *iData_p = *piData; + prList->destroy(piData); + return res; +} +/* end of IntListRemoveNext */ + + + + +#ifdef LIST_TEST +/* gcc list.c -o list_test -ansi -Wall -DLIST_TEST */ + +int main(int argc, char **argv) +{ + + int i; + list_t *mylist; + int_list_t *myintlist; + queue_t *myqueue; + int_queue_t *myintqueue; + int res; + + int iSeed = (int)time(NULL); + srand((unsigned int)iSeed); + + printf("%s", "list test! also delete #include!\n"); + + + mylist = malloc(sizeof(list_t)); + ListInit(mylist, NULL); + + printf("LIST test\n"); + + for (i=0; i<argc; i++) { + res = LIST_APPEND(mylist, argv[i]); + printf("LIST Result for appending '%s' was %d\n", argv[i], res); + } + + while (LIST_SIZE(mylist)) { + char *argv_ptr; + if (ListRemoveNext(mylist, NULL, (void **)&argv_ptr)) + perror("ListRemoveNext() failed"); + printf("LIST Popped %s\n", argv_ptr); + } + printf("LIST %s", "No more elements to pop"); + + /* could become list_free */ + ListDestroy(mylist); + free(mylist); + + + + + myintlist = malloc(sizeof(list_t)); + INT_LIST_INIT(myintlist); + + printf("\n"); + printf("%s", "INT_LIST test"); + + for (i=0; i<argc; i++) { + int data = 666-i; + res = INT_LIST_APPEND(myintlist, data); + printf("INT_LIST Result for appending '%d' was %d\n", data, res); + } + + while (INT_LIST_SIZE(myintlist)) { + int data; + if (IntListRemoveNext(myintlist, NULL, &data)) + perror("ListRemoveNext() failed\n"); + printf("INT_LIST Popped %d\n", data); + } + printf("INT_LIST %s\n", "No more elements to pop"); + + /* could become list_free */ + INT_LIST_DESTROY(myintlist); + free(myintlist); + + + + + + myqueue = malloc(sizeof(queue_t)); + QUEUE_INIT(myqueue, NULL); + + printf("\n"); + printf("%s", "QUEUE test\n"); + + for (i=0; i<argc; i++) { + res = QUEUE_PUSH(myqueue, argv[i]); + printf("QUEUE Result for pushing '%s' was %d\n", argv[i], res); + } + + while (! QUEUE_EMPTY(myqueue)) { + char *argv_ptr; + if (QUEUE_POP(myqueue, (void **)&argv_ptr)) + perror("QUEUE_POP() failed\n"); + printf("QUEUE Popped %s\n", argv_ptr); + } + printf("QUEUE %s\n", "QUEUE No more elements to pop"); + + /* could become list_free */ + QUEUE_DESTROY(myqueue); + free(myqueue); + + + + + myintqueue = malloc(sizeof(queue_t)); + INT_QUEUE_INIT(myintqueue); + + printf("\n"); + printf("%s\n", "INT_QUEUE test"); + + for (i=0; i<argc; i++) { + res = INT_QUEUE_PUSH(myintqueue, i); + printf("INT_QUEUE Result for appending '%d' was %d\n", i, res); + } + + while (! INT_QUEUE_EMPTY(myintqueue)) { + int data; + int rand_data; + if (INT_QUEUE_POP(myintqueue, &data)) + perror("INT_QUEUE_POP() failed\n"); + printf("INT_QUEUE Popped %d\n", data); + + rand_data = (int)( 10.0 * rand() / ( RAND_MAX+1.0)); + if (! (rand_data%3)) { + res = INT_QUEUE_PUSH(myintqueue, rand_data); + printf("INT_QUEUE Result for pushing random number '%d' was %d\n", rand_data, res); + } + } + printf("INT_QUEUE %s\n", "INT_QUEUE No more elements to pop"); + + /* could become list_free */ + INT_QUEUE_DESTROY(myintqueue); + free(myintqueue); + + + exit(0); +} + +#endif + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/list.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,105 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: list.h 193 2011-02-07 15:45:21Z andreas $ + * + * Generic single linked list storing pointers to data + * + */ + +#ifndef CLUSTALO_LIST_H +#define CLUSTALO_LIST_H + +#include <stdlib.h> + +typedef struct list_elem_s { + void *data; + struct list_elem_s *next; +} list_elem_t; + +typedef struct { + /* size of list */ + int size; + /* user defined function for freeing data */ + void (*destroy)(void *data); + list_elem_t *head; + list_elem_t *tail; +} list_t; + +void ListInit(list_t *prList, void (*destroy)(void *data)); + +void ListDestroy(list_t *prList); + +int ListInsertNext(list_t *prList, list_elem_t *prElement, const void *data); + +#define LIST_APPEND(prList, data) ListInsertNext((prList), LIST_TAIL(prList), (data)) + +#define LIST_PREPEND(prList, data) ListInsertNext((prList), CLUSTALO_LIST_HEAD(prList), (data)) + +int ListRemoveNext(list_t *prList, list_elem_t *prElement, void **data); + +#define LIST_SIZE(prList) ((prList)->size) + +#define CLUSTALO_LIST_HEAD(prList) ((prList)->head) + +#define LIST_TAIL(prList) ((prList)->tail) + +#define LIST_IS_HEAD(prList, prElement) ((prElement) == (prList)->head ? 1 : 0) + +#define LIST_IS_TAIL(prElement) ((prElement)->next == NULL ? 1 : 0) + +#define LIST_DATA(prElement) ((prElement)->data) + +#define LIST_NEXT(prElement) ((prElement)->next) + + + + + +/* special int list: stores ints by copying them (instead of storing + * pointers as generic list) + * + */ + +typedef list_t int_list_t; + +#define INT_LIST_INIT(prList) ListInit((prList), free) + +#define INT_LIST_DESTROY(prList) ListDestroy((prList)); + +int IntListInsertNext(list_t *prList, list_elem_t *prElement, const int data); + +#define INT_LIST_APPEND(prList, data) IntListInsertNext((prList), LIST_TAIL(prList), (data)) + +#define INT_LIST_PREPEND(prList, data) IntListInsertNext((prList), CLUSTALO_LIST_HEAD(prList), (data)) + +int IntListRemoveNext(list_t *prList, list_elem_t *prElement, int *data); + +#define INT_LIST_SIZE(prList) LIST_SIZE(prList) + +#define INT_CLUSTALO_LIST_HEAD(prList) CLUSTALO_LIST_HEAD_INT((prList)) + +#define INT_LIST_TAIL(prList) LIST_TAIL_INT((prList) ) + +#define INT_LIST_IS_HEAD(prList, prElement) LIST_IS_HEAD(prList, prElement) + +#define INT_LIST_IS_TAIL(prElement) LIST_IS_TAIL((prElement)) + +#define INT_LIST_DATA(prElement) LIST_DATA((prElement)) + +#define INT_LIST_NEXT(prElement) LIST_NEXT((prElement)) + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/log.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,379 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id$ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <assert.h> + +#include "log.h" + +/* a default standard logger */ +log_t rLog; + + + +void +LogVfprintf(FILE *prFP, char *pcFmt, va_list rVArgList); +void +LogWarn(FILE *prFP, char *pcFmt, va_list rVArgList); +void +LogError(FILE *prFP, char *pcFmt, va_list rVArgList); +void +LogCritical(FILE *prFP, char *pcFmt, va_list rVArgList); +void +LogFatal(FILE *prFP, char *pcFmt, va_list rVArgList); +void +LogForcedDebug(FILE *prFP, char *pcFmt, va_list rVArgList); + + + + +/** + * @brief Plain, default print function + * + * Newline character is automatically appended to message. + * + */ +void +LogVfprintf(FILE *prFP, char *pcFmt, va_list rVArgList) +{ + /* print prefix */ + vfprintf(prFP, pcFmt, rVArgList); + fprintf(prFP,"\n"); + +#ifndef NDEBUG + fflush(prFP); +#endif +} +/* end of LogVfprintf() */ + + + +/** + * @brief + * + */ +void +LogWarn(FILE *prFP, char *pcFmt, va_list rVArgList) +{ + fprintf(prFP, "WARNING: "); + LogVfprintf(prFP, pcFmt, rVArgList); +} +/* end of LogWarn() */ + + + +/** + * @brief + * + */ +void +LogError(FILE *prFP, char *pcFmt, va_list rVArgList) +{ + fprintf(prFP, "ERROR: "); + LogVfprintf(prFP, pcFmt, rVArgList); +} +/* end of LogError() */ + + + +/** + * @brief + * + */ +void +LogCritical(FILE *prFP, char *pcFmt, va_list rVArgList) +{ + fprintf(prFP, "CRITICAL ERROR: "); + LogVfprintf(prFP, pcFmt, rVArgList); +} +/* end of LogCritical() */ + + + +/** + * @brief Will also exit! + */ +void +LogFatal(FILE *prFP, char *pcFmt, va_list rVArgList) +{ + fprintf(prFP, "FATAL: "); + LogVfprintf(prFP, pcFmt, rVArgList); + + exit(EXIT_FAILURE); +} +/* end of LogFatal() */ + + + +/** + * @brief + * + */ +void +LogForcedDebug(FILE *prFP, char *pcFmt, va_list rVArgList) +{ + fprintf(prFP, "FORCED DEBUG: "); + LogVfprintf(prFP, pcFmt, rVArgList); +} +/* end of LogForcedDebug() */ + + + +/** + * + * @brief Sets up default function pointers + * + */ +void +LogDefaultSetup(log_t *log) +{ + log->iLogLevelEnabled = LOG_WARN; + + log->prFP[LOG_DEBUG] = stdout; + log->prFP[LOG_INFO] = stdout; + log->prFP[LOG_WARN] = stderr; + log->prFP[LOG_ERROR] = stderr; + log->prFP[LOG_CRITICAL] = stderr; + log->prFP[LOG_FATAL] = stderr; + log->prFP[LOG_FORCED_DEBUG] = stderr; + + log->prFunc[LOG_DEBUG] = &LogVfprintf; + log->prFunc[LOG_INFO] = &LogVfprintf; + log->prFunc[LOG_WARN] = &LogWarn; + log->prFunc[LOG_ERROR] = &LogError; + log->prFunc[LOG_CRITICAL] = &LogCritical; + log->prFunc[LOG_FATAL] = &LogFatal; + log->prFunc[LOG_FORCED_DEBUG] = &LogForcedDebug; +} +/* end of LogDefaultSetup() */ + + + +/** + * @brief Log to certain level + * + * See also comp.lang.c FAQ list · Question 15.12 + * http://c-faq.com/varargs/handoff.html How can I write a function which + * takes a variable number of arguments and passes them to some other function + * (which takes a variable number of arguments)? + * + */ +void +Log(log_t *prLog, int iLevel, char *pcFmt, ...) +{ + va_list rVArgList; + void (*prFunc) (FILE *prFP, char *pcFormat, va_list rVArgList); + FILE *prFP; + + assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); + + /* fprintf(stderr, "DEBUG: iLevel=%d and iLogLevelEnabled=%d\n", iLevel, prLog->iLogLevelEnabled); */ + + /* return if below current loglevel */ + if (iLevel < prLog->iLogLevelEnabled) { + return; + } + + prFunc = prLog->prFunc[iLevel]; + prFP = prLog->prFP[iLevel]; + + /* return if muted */ + if (NULL == prFunc) { + return; + } + + va_start(rVArgList, pcFmt); + prFunc(prFP, pcFmt, rVArgList); + va_end(rVArgList); +} +/* end of Log() */ + + + +/** + * + * @brief Change file pointer for certain level + * + */ +void +LogSetFP(log_t *prLog, int iLevel, FILE *prFP) +{ + assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); + + prLog->prFP[iLevel] = prFP; +} +/* end of LogSetFP() */ + + + +/** + * + * @brief Return file pointer for certain level + * + */ +FILE * +LogGetFP(log_t *prLog, int iLevel) +{ + assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); + + return prLog->prFP[iLevel]; +} +/* end of LogGetFP() */ + + + + + +/** + * + * @brief Change file pointer for all levels + * + */ +void +LogSetFPForAll(log_t *prLog, FILE *prFP) +{ + int iAux; + + for (iAux=0; iAux<LOG_NUM_LEVELS; iAux++) { + prLog->prFP[iAux] = prFP; + } +} +/* end of LogSetFP() */ + + + +/** + * + * @brief Mute certain level (i.e set the corresponding function to NULL) + * + */ +void +LogMute(log_t *prLog, int iLevel) +{ + assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); + + prLog->prFunc[iLevel] = NULL; +} +/* end of LogMute() */ + + +/** + * + * @brief Mute all channels + * + */ +void +LogMuteAll(log_t *prLog) +{ + int iAux; + + for (iAux=0; iAux<LOG_NUM_LEVELS; iAux++) { + LogMute(prLog, iAux); + } +} +/* end of LogMuteAll() */ + + + +/** + * @brief + * + */ +void +LogFuncOverwrite(log_t *prLog, int iLevel, + void (*Func) (FILE *prFP, char *pcFormat, va_list rVArgList)) +{ + assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); + + prLog->prFunc[iLevel] = Func; + +} +/* end of LogFuncOverwrite() */ + + + +#ifdef LOG_TEST + + +#define TEXT "Lorem ipsum dolor sit amet" + +void +PrintSomeTextToAll(log_t *prLog) { + int iAux; + for (iAux=0; iAux<LOG_NUM_LEVELS; iAux++) { + Log(prLog, iAux, TEXT); + } +} + + +int +main(int argc, char**argv) { + log_t prLog; + log_t pr2ndLog; + FILE *prFP; + char *pcTmpFileName = "schmock.txt"; + + prFP = fopen(pcTmpFileName, "w"); + + + LogDefaultSetup(&prLog); + LogDefaultSetup(&pr2ndLog); + + printf("Printing to log:\n"); + PrintSomeTextToAll(&prLog); + printf("---\n"); + + printf("Printing to pr2ndLog:\n"); + PrintSomeTextToAll(&prLog); + printf("---\n"); + + + + printf("Changing second log's FP to write to '%s'\n", pcTmpFileName); + LogSetFPForAll(&pr2ndLog, prFP); + + printf("Printing to pr2ndLog:\n"); + PrintSomeTextToAll(&pr2ndLog); + printf("---\n"); + + + printf("Changing Info() to new function (Fatal()) in log:\n"); + LogFuncOverwrite(&prLog, LOG_INFO, &LogFatal); + + printf("Printing to log:\n"); + PrintSomeTextToAll(&prLog); + printf("---\n"); + + + + fclose(prFP); + + return 0; +} + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/log.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,81 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id$ + */ + + +#include <stdio.h> +#include <stdarg.h> + +#ifndef LOG_H +#define LOG_H + + +#define LOG_DEBUG 0 +#define LOG_VERBOSE 1 +#define LOG_INFO 2 +#define LOG_WARN 3 +#define LOG_FORCED_DEBUG 4 +#define LOG_ERROR 5 +#define LOG_CRITICAL 6 +#define LOG_FATAL 7 + +#define LOG_NUM_LEVELS 8 + + +typedef struct { + /* the higher the level, the more priority it has. numbers must be + * sequential + */ + + /* array of function pointers */ + void (*prFunc[LOG_NUM_LEVELS]) (FILE *prFP, char *pcFormat, va_list rVArgList); + FILE *prFP[LOG_NUM_LEVELS]; + char *prPrefix[LOG_NUM_LEVELS]; + + /* everything above this level will be printed */ + int iLogLevelEnabled; +} log_t; + + + +/* a standard logger */ +extern log_t rLog; + + + +void +LogDefaultSetup(log_t *log); +void +Log(log_t *prLog, int iLevel, char *pcFmt, ...); +void +LogSetFP(log_t *log, int level, FILE *fp); +void +LogSetFPForAll(log_t *log, FILE *fp); +FILE * +LogGetFP(log_t *prLog, int iLevel); +void +LogMute(log_t *log, int level); +void +LogMuteAll(log_t *log); +void +LogFuncOverwrite(log_t *prLog, int iLevel, + void (*Func) (FILE *prFP, char *pcFormat, va_list rVArgList)); + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/mbed.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1553 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: mbed.c 242 2011-05-27 14:04:21Z andreas $ + * + * + * Reimplementation from scratch of mBed: + * Blackshields et al. (2010); PMID 20470396 + * + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <assert.h> +#include <float.h> + +#include "mbed.h" +#include "pair_dist.h" +#include "symmatrix.h" +#include "ktuple_pair.h" +#include "tree.h" +#include "util.h" +#include "progress.h" +#include "queue.h" + +#include "log.h" +#include "kmpp/KMeans.h" +#include "mbed.h" + +#define TIMING 0 +#if TIMING +#include "squid/stopwatch.h" +#endif + + +/* If FULL_WITHIN_CLUSTER_DISTANCES is not 0, distances within each + * bisecting kmeans subcluster are not estimated using the vectors, + * but calculated normally (using ktuple or kimura). Surprisingly this + * results in 3% loss on a Homfam p24-h2010-08-09 subset (100-5000 + * seqs in test, at least 5 ref seqs; MAX_SEQ 100 vs 10000; NUM_SEEDS + * log2 instead of log2^2). And of course it slows things down. + */ +#define FULL_WITHIN_CLUSTER_DISTANCES 1 + + +/* Cluster size limits. Maximum is a soft limit, which might be + * exceeded if a K-Means split was unsuccesful, where unsuccesful + * might also mean that the minimum required number seqs. was not + * reached */ +#if FULL_WITHIN_CLUSTER_DISTANCES +static const int MAX_ALLOWED_SEQ_PER_PRECLUSTER = 100; +static const int MIN_REQUIRED_SEQ_PER_PRECLUSTER = 1; +#else +static const int MAX_ALLOWED_SEQ_PER_PRECLUSTER = 10000; +static const int MIN_REQUIRED_SEQ_PER_PRECLUSTER = 100; +#endif + +/* How many restarts per bisecting kmeans split. 10 give 0.5% increase + * in quality on original HOMFAM over just 1. It also increases kmeans + * time by a factor of ~3, but overall time is insignificant + * compared to pairdist/progressive alignment part. + */ +static const int RESTARTS_PER_SPLIT = 10; + + +/* Use standard kmeans (lloyds) or kmeans++. Both are almost + * indistinguishable here, although kmeans++ is slightly ahead the + * fewer seeds you pick (and it should be better in theory) + */ +#define USE_KMEANS_LLOYDS 0 + + +#ifndef HAVE_LOG2 +#define log2(x) (log(x) / 0.69314718055994530942) +#endif +#define NUMBER_OF_SEEDS(n) pow(log2(((double)n)), 2) + + +/* Seed selection method: SAMPLE_SEEDS_BY_LENGTH is the original mBed + * approach: Sample iSeeds sequence with constant stride from length-sorted X. + * It might be better to pick the seeds randomly, because length sorting might + * be more prone to including outliers (e.g. very long and very short seqs). + * However, we could never observer such a thing. So just stick to the + * original version as this also removes the random element. + */ +enum SEED_SELECTION_TYPE { + SELECT_SEEDS_RANDOMLY, + SELECT_SEEDS_BY_LENGTH +}; +#define SEED_SELECTION SELECT_SEEDS_BY_LENGTH + + +/* Tests on BAliBase (RV11,12,20,30,40,50; 10 runs each) show there is + * no difference between mbed-trees created from cosine or euclidean + * distances (simple version, just using disparities). + */ +#define USE_EUCLIDEAN_DISTANCE 1 + + +/* print some mbed pre-cluster usage to screen */ +#define PRINT_CLUSTER_DISTRIBUTION 0 + + +#define TRACE 0 + + +typedef struct { + /* Number of final clusters + */ + int iNClusters; + + /* Coordinates (columns) for each cluster (rows) + * valid indices: [0...iNClusters][0...dim-1] + */ + double **ppdClusterCenters; + + /* Dimensionality of input data and cluster center coordinates + */ + int iDim; + + /* Number of objects per cluster + */ + int *piNObjsPerCluster; + + /* Objects (indices) for each cluster. [i][j] will point to (index + * of) object j in cluster i + */ + int **ppiObjIndicesPerCluster; +} bisecting_kmeans_result_t; + + + +/** + * @brief Free KMeans result structure. + * + * @param[out] prResult_p + * K-Means result to free + * + * @see NewKMeansResult() + */ +void +FreeKMeansResult(bisecting_kmeans_result_t **prResult_p) +{ + int iAux; + CKFREE((*prResult_p)->piNObjsPerCluster); + for (iAux=0; iAux<(*prResult_p)->iNClusters; iAux++) { + CKFREE((*prResult_p)->ppiObjIndicesPerCluster[iAux]); + CKFREE((*prResult_p)->ppdClusterCenters[iAux]); + } + CKFREE((*prResult_p)->ppiObjIndicesPerCluster); + CKFREE((*prResult_p)->ppdClusterCenters); + (*prResult_p)->iNClusters = 0; + (*prResult_p)->iDim = 0; + CKFREE(*prResult_p); +} +/*** end: FreeKMeansResult() ***/ + + + +/** + * @brief Allocate new KMeans result + * + * @param[out] prKMeansResult_p + * K-Means result to free + * + * @see NewKMeansResult() + */ +void +NewKMeansResult(bisecting_kmeans_result_t **prKMeansResult_p) +{ + (*prKMeansResult_p) = (bisecting_kmeans_result_t *) + CKCALLOC(1, sizeof(bisecting_kmeans_result_t)); + (*prKMeansResult_p)->iNClusters = 0; + (*prKMeansResult_p)->iDim = 0; + (*prKMeansResult_p)->ppdClusterCenters = NULL; + (*prKMeansResult_p)->piNObjsPerCluster = NULL; + (*prKMeansResult_p)->ppiObjIndicesPerCluster = NULL; + +} +/*** end: NewKMeansResult() ***/ + + + +/** + * @brief Calculate the euclidean distance between two vectors + * + * @param[in] v1 + * First vector with dim dimensions + * @param[in] v2 + * Second vector with dim dimensions + * @param[in] dim + * Dimensionality of v1 and v2 + * + * @return euclidean distance as double + * + * @note Could probably be inlined. Also perfect for SSE + */ +double +EuclDist(const double *v1, const double *v2, const int dim) +{ + int i; /* aux */ + double dist; /* returned distance */ + + assert(v1!=NULL); + assert(v2!=NULL); + + dist = 0.0; + for (i=0; i<dim; i++) { + dist += pow(v1[i]-v2[i], 2.0); + } + + return sqrt(dist); +} +/*** end: EuclDist() ***/ + + + +/** + * @brief Calculate the cosine distance between two vectors + * + * @param[in] v1 + * First vector with dim dimensions + * @param[in] v2 + * Second vector with dim dimensions + * @param[in] dim + * Dimensionality of v1 and v2 + * + * @return cosine distance as double + * + * @note Could probably be inlined. Also perfect for SSE + */ +double +CosDist(const double *v1, const double *v2, const int dim) +{ + int i; /* aux */ + double dist; /* returned distance */ + double s, sq1, sq2; + + assert(v1!=NULL); + assert(v2!=NULL); + + s = 0.0; + sq1 = 0.0; + sq2 = 0.0; + for (i=0; i<dim; i++) { + s += (v1[i]*v2[i]); + sq1 += pow(v1[i], 2.0); + sq2 += pow(v2[i], 2.0); + } + sq1 = sqrt(sq1); + sq2 = sqrt(sq2); + + if ((sq1 * sq2) < DBL_EPSILON) { + dist = 1 - s / (sq1 * sq2); + } else { + /* if the denominator gets small, the fraction gets big, hence dist + gets small: */ + dist = 0.0; + } + return dist; +} +/*** end: CosDist() ***/ + + + +/** + * @brief convert sequences into mbed-like (distance) vector + * representation. Seeds (prMSeq sequence indices) have to be picked before + * + * @param[out] ppdSeqVec + * Pointer to preallocated matrix of size nseqs x iSeeds + * @param[in] prMSeq + * Sequences which are to be converted + * @param[in] piSeeds + * Array of sequences in prMSeq which are to be used as seeds. + * @param[in] iNumSeeds + * Number of seeds/elements in piSeeds + * @param[in] iPairDistType + * Type of pairwise distance comparison + * + */ +int +SeqToVec(double **ppdSeqVec, mseq_t *prMSeq, + int *piSeeds, const int iNumSeeds, + const int iPairDistType) +{ + symmatrix_t *prDistmat = NULL; + int iSeqIndex; + int iSeedIndex; + /* indices for restoring order */ + int *restore; + /* sorted copy of piSeeds */ + int *piSortedSeeds; + +#if TIMING + Stopwatch_t *stopwatch = StopwatchCreate(); + StopwatchZero(stopwatch); + StopwatchStart(stopwatch); +#endif + + assert(NULL != ppdSeqVec); + assert(iNumSeeds>0 && iNumSeeds<=prMSeq->nseqs); + + piSortedSeeds = CKMALLOC(iNumSeeds * sizeof(int)); + memcpy(piSortedSeeds, piSeeds, iNumSeeds*sizeof(int)); + + /* need them sorted, otherwise the swapping approach below might + * break + */ + qsort(piSortedSeeds, iNumSeeds, sizeof(int), IntCmp); + + + /* rearrange mseq order so that we can use ktuple_pairdist code as + * is. That is, swap seeds and non-seeds such that the seeds end + * up in front of mseq. This way we can use the KTuplePairDist() + * code, without making a copy of mseq. Also, keep an array of + * indices which serves to restore the original sequence order + * after putting the seeds in front + * + */ + restore = (int *) CKMALLOC(prMSeq->nseqs * sizeof(int)); + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + restore[iSeqIndex] = iSeqIndex; + } + for (iSeedIndex=0; iSeedIndex<iNumSeeds; iSeedIndex++) { +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Swapping seqs %d and %u", piSortedSeeds[iSeedIndex], iSeedIndex); +#endif + if (piSortedSeeds[iSeedIndex]!=iSeedIndex) { + int swap; + SeqSwap(prMSeq, piSortedSeeds[iSeedIndex], iSeedIndex); + + swap = restore[iSeedIndex]; + restore[iSeedIndex] = restore[piSortedSeeds[iSeedIndex]]; + restore[piSortedSeeds[iSeedIndex]] = swap; + } + } +#if TRACE + printf("DEBUG(%s|%s():%d): restore indices =", + __FILE__, __FUNCTION__, __LINE__); + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + printf(" %u:%u", iSeqIndex, restore[iSeqIndex]); + } + printf("\n"); + + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + Log(&rLog, LOG_FORCED_DEBUG, "swapped seq no %d now: seq = %s", + iSeqIndex, prMSeq->sqinfo[iSeqIndex].name); + } +#endif + + + /* convert sequences into vectors of distances by calling pairwise + * distance function for each seq/seed pair + * + */ + if (0 != PairDistances(&prDistmat, prMSeq, iPairDistType, + 0, iNumSeeds, 0, prMSeq->nseqs, + NULL, NULL)) { + Log(&rLog, LOG_ERROR, "Could not compute pairwise distances for mbed."); + FreeSymMatrix(&prDistmat); + CKFREE(piSortedSeeds); + CKFREE(restore); + return -1; + } +#if TRACE + { + char **labels; + labels = (char **) CKMALLOC(prMSeq->nseqs * sizeof(char *)); + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + labels[iSeqIndex] = prMSeq->sqinfo[iSeqIndex].name; + } + SymMatrixPrint(prDistmat, labels, NULL); + CKFREE(labels); + } +#endif + + + /* update ppdSeqVec according to prDistmat. keep in mind that we + * changed mseq order + * + */ + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + for (iSeedIndex=0; iSeedIndex<iNumSeeds; iSeedIndex++) { + ppdSeqVec[restore[iSeqIndex]][iSeedIndex] = + SymMatrixGetValue(prDistmat, iSeqIndex, iSeedIndex); + } + } + + + /* restore mseq order by reverse swapping + * + * need reverse order now, so start from top index + */ + iSeedIndex=iNumSeeds-1; + do { +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Swapping seqs %d and %d", piSortedSeeds[iSeedIndex], iSeedIndex); +#endif + if (piSortedSeeds[iSeedIndex]!=iSeedIndex) { + int swap; + + SeqSwap(prMSeq, piSortedSeeds[iSeedIndex], iSeedIndex); + + swap = restore[iSeedIndex]; + restore[iSeedIndex] = restore[piSortedSeeds[iSeedIndex]]; + restore[piSortedSeeds[iSeedIndex]] = swap; + } + } while (0 != iSeedIndex--); +#if TRACE + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + Log(&rLog, LOG_FORCED_DEBUG, "restored seq no %d: seq = %s %s", + iSeqIndex, prMSeq->sqinfo[iSeqIndex].name, prMSeq->seq[iSeqIndex]); + } +#endif + +#if TRACE + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + printf("DEBUG: seq %-4u as distance vector =", iSeqIndex); + for (iSeedIndex=0; iSeedIndex<iNumSeeds; iSeedIndex++) { + printf(" %f", ppdSeqVec[iSeqIndex][iSeedIndex]); + } + printf("\n"); + } +#endif + + + FreeSymMatrix(&prDistmat); + CKFREE(restore); +#if TIMING + StopwatchStop(stopwatch); + StopwatchDisplay(stdout, "Total time for SeqToVec(): ", stopwatch); + StopwatchFree(stopwatch); +#endif + + + return 0; +} +/*** end: SeqToVec() ***/ + + + +/** + * @brief Select seeds to be used from an prMSeq + * + * @param[out] piSeeds + * Will store the indices of prMSeqs seqs used to be as seeds here. Must be preallocated. + * @param[in] iNumSeeds + * Number of seeds to be picked + * @param[in] iSelectionMethod + * Seed selection method to be used + * @param[in] prMSeq + * The prMSeq structure to pick sequences from + * + * @return: Non-zero on failure + * + */ +int +SeedSelection(int *piSeeds, int iNumSeeds, int iSelectionMethod, mseq_t *prMSeq) +{ + /* seed iterator */ + int iSeedIndex; + /* sequence iterator */ + int iSeqIndex; + + if (SELECT_SEEDS_RANDOMLY == iSelectionMethod) { + int *piPermArray; + + Log(&rLog, LOG_INFO, + "Using %d seeds (randomly chosen) for mBed (from a total of %d sequences)", + iNumSeeds, prMSeq->nseqs); + + PermutationArray(&piPermArray, iNumSeeds); + /* copy to piSeeds */ + for (iSeedIndex=0; iSeedIndex<iNumSeeds; iSeedIndex++) { + piSeeds[iSeedIndex] = piPermArray[iSeedIndex]; + } + CKFREE(piPermArray); + + } else if (SELECT_SEEDS_BY_LENGTH == iSelectionMethod) { + + /* step size for picking with constant stride */ + int iStep; + int *piSeqLen = CKMALLOC(prMSeq->nseqs * sizeof(int)); + int *piOrder = CKMALLOC(prMSeq->nseqs * sizeof(int)); + + Log(&rLog, LOG_INFO, + "Using %d seeds (chosen with constant stride from length sorted seqs) for mBed (from a total of %d sequences)", + iNumSeeds, prMSeq->nseqs); + + iStep = prMSeq->nseqs / iNumSeeds; /* iStep will never get too big + * due to rounding */ + /* first get an array of seq indices order according to + corresponding sequence length: piOrder */ + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + piSeqLen[iSeqIndex] = prMSeq->sqinfo[iSeqIndex].len; + } + QSortAndTrackIndex(piOrder, piSeqLen, prMSeq->nseqs, 'd', FALSE); +#if 0 + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + Log(&rLog, LOG_FORCED_DEBUG, "Descending order (no %d): seq %d has len %d)", + iSeqIndex, piOrder[iSeqIndex], piSeqLen[piOrder[iSeqIndex]]); + } +#endif + CKFREE(piSeqLen); + iSeedIndex = 0; + for (iSeqIndex=0; iSeedIndex<iNumSeeds; iSeqIndex+=iStep) { + piSeeds[iSeedIndex++] = piOrder[iSeqIndex]; + } + CKFREE(piOrder); + + } else { + + Log(&rLog, LOG_ERROR, "Internal error: unknown seed selection type"); + return -1; + } + + +#ifdef PICK_SEEDS_FROM_KMEANS_CLUSTERS + /* do initial mbedding and kmeans. then pick seeds from each cluster and + do full mbed with these seeds. idea is that those seeds represent the + sequence space better than random seeds. however, this reduces the + quality slightly. random is almost always better. + */ + + if (1) { + /* seqs represented as distance vectors */ + double **ppdSeqVec; + double dCost = -1.0; + /* assignments for each seq to the K newly created clusters */ + int *piKMeansClusterAssignments = CKMALLOC(prMSeq->nseqs * sizeof(int)); + double *pdKMeansClusterCenters = CKCALLOC(iNumSeeds * iNumSeeds, sizeof(double)); + /* create a copy of ppdSeqVec suitable for KMeans */ + double *pdKMeansVectors = CKMALLOC(prMSeq->nseqs * iNumSeeds * sizeof(double)); + bool *pbClusterUsed = CKCALLOC(iNumSeeds, sizeof(bool)); + + Log(&rLog, LOG_FORCED_DEBUG, "%s", "FIXME Experimental feature: K-means on first round embedding to get better seeds"); + Log(&rLog, LOG_FORCED_DEBUG, "%s", "FIXME Reuse seeds from clusters"); + Log(&rLog, LOG_FORCED_DEBUG, "%s", "FIXME Could try log(n) instead of log(n)^2 in first round"); + Log(&rLog, LOG_FORCED_DEBUG, "%s", "FIXME hardcoded iPairDistType PAIRDIST_KTUPLE"); + Log(&rLog, LOG_FORCED_DEBUG, "%s", "FIXME Show that this is fast *and* good"); + + /* + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Overriding iNumSeeds"); + iNumSeeds = (int) pow(log2((double)prMSeq->nseqs), 2); + */ + + ppdSeqVec = (double **) CKMALLOC(prMSeq->nseqs * sizeof(double *)); + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + ppdSeqVec[iSeqIndex] = (double *) CKMALLOC(iNumSeeds * sizeof(double)); + } + if (0 != SeqToVec(ppdSeqVec, prMSeq, piSeeds, iNumSeeds, PAIRDIST_KTUPLE)) { + Log(&rLog, LOG_ERROR, "Could not convert sequences into vectors for mbed"); + return -1; + } + + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + int iDim; + for (iDim=0; iDim<iNumSeeds; ++iDim) { + pdKMeansVectors[iDim*iSeqIndex + iDim] = ppdSeqVec[iSeqIndex][iDim]; + } + } + + + Log(&rLog, LOG_FORCED_DEBUG, "%s\n", "FIXME hardcoded RESTARTS_PER_SPLIT"); + dCost = KMeans(prMSeq->nseqs, iNumSeeds, iNumSeeds, + pdKMeansVectors, + RESTARTS_PER_SPLIT, USE_KMEANS_LLOYDS, + pdKMeansClusterCenters, piKMeansClusterAssignments); + Log(&rLog, LOG_FORCED_DEBUG, "Best split cost = %f", dCost); + + Log(&rLog, LOG_FORCED_DEBUG, "%s", "FIXME Check for Nan in cluster centers"); + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "K-Means output:"); + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + Log(&rLog, LOG_FORCED_DEBUG, " Raw assignment: Seq %u (%s) to cluster %d", + iSeqIndex, prMSeq->sqinfo[iSeqIndex].name, + piKMeansClusterAssignments[iSeqIndex]); + } +#endif + + Log(&rLog, LOG_FORCED_DEBUG, "FIXME %s", "proof of concept implementation: Pick first sequences from each clusters instead of reusing seeds"); + iSeedIndex = 0; + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + int iAssignedCluster = piKMeansClusterAssignments[iSeqIndex]; + if (pbClusterUsed[iAssignedCluster]) { + continue; + } else { + /*LOG_DEBUG("Picked seed %d from cluster %d", iSeqIndex,iAssignedCluster);*/ + piSeeds[iSeedIndex++] = iSeqIndex; + pbClusterUsed[iAssignedCluster] = TRUE; + } + } + CKFREE(pbClusterUsed); + + CKFREE(pdKMeansVectors); + CKFREE(pdKMeansClusterCenters); + CKFREE(piKMeansClusterAssignments); + + } + /* if (1) */ +#endif + + + if (LOG_DEBUG <= rLog.iLogLevelEnabled) { + for (iSeedIndex=0; iSeedIndex<iNumSeeds; iSeedIndex++) { + Log(&rLog, LOG_DEBUG, "Picked sequence %d (%s) as seed no %d", + piSeeds[iSeedIndex], prMSeq->sqinfo[piSeeds[iSeedIndex]].name, iSeedIndex); + } + } + + return 0; +} +/* end of SeedSelection() */ + + + + +/** + * @brief Bisecting K-Means clustering. Repeatedly calls K-Means with + * a K of 2 until no cluster has more than iMaxAllowedObjsPerCluster. + * + * @param[out] prKMeansResult_p + * Result of Bisecting KMeans. Will be allocated here. + * Caller has to free. See @see FreeKMeansResult() + * @param[in] iNObjs + * Number of objects/sequences to cluster + * @param[in] iDim + * Dimensionality of input data + * @param[in] ppdVectors + * each row holds iDim points for this object's coordinates + * @param[in] iMinRequiredObjsPerCluster + * Minimum number of objects per Cluster (inclusive)/ + * @param[in] iMaxAllowedObjsPerCluster + * Maximum number of objects per Cluster (inclusive). Function returns once no + * cluster contains more then this number of objects. Soft limit! + * + * @note Convoluted code. Could use some restructuring. My apologies. + * AW + * + */ +void +BisectingKmeans(bisecting_kmeans_result_t **prKMeansResult_p, + const int iNObjs, const int iDim, double **ppdVectors, + const int iMinRequiredObjsPerCluster, + const int iMaxAllowedObjsPerCluster) +{ + int iN, iD; + /* cluster centers for each cluster created at each split */ + double *pdKClusterCenters; + /* keep track of updated object indices per newly created + * cluster */ + int *piCurObjToUpdate; + /* number of times we called 2-means */ + int iNRounds; + /* flag for unsuccessful cluster split */ + bool bNaNDetected = FALSE; + /* flag for detected small cluster after split */ + bool bSmallClusterDetected; + /* queue of clusters which are to be split */ + int_queue_t rClusterSplitQueue; + +#if TIMING + Stopwatch_t *stopwatch = StopwatchCreate(); +#endif + + + piCurObjToUpdate = (int *) CKMALLOC(2 * sizeof(int)); + + NewKMeansResult(prKMeansResult_p); + + /* new cluster centers created at each split/KMeans run + */ + pdKClusterCenters = (double *) CKCALLOC(2 * iDim, sizeof(double)); + + /* init results by setting a first cluster that contains all objects + */ + (*prKMeansResult_p)->iNClusters = 1; + (*prKMeansResult_p)->iDim = iDim; + /* fake center coordinates of first cluster */ + (*prKMeansResult_p)->ppdClusterCenters = + (double **) CKMALLOC(1 * sizeof(double *)); + (*prKMeansResult_p)->ppdClusterCenters[0] = + (double *) CKMALLOC(iDim * sizeof(double)); + /* objects per cluster */ + (*prKMeansResult_p)->piNObjsPerCluster = + (int *) CKMALLOC(1 * sizeof(int)); + (*prKMeansResult_p)->piNObjsPerCluster[0] = iNObjs; + /* object indices per cluster */ + (*prKMeansResult_p)->ppiObjIndicesPerCluster = + (int **) CKMALLOC(1 * sizeof(int *)); + (*prKMeansResult_p)->ppiObjIndicesPerCluster[0] = (int *) + CKMALLOC(iNObjs * sizeof(int)); + for (iN=0; iN<iNObjs; iN++) { + (*prKMeansResult_p)->ppiObjIndicesPerCluster[0][iN] = iN; + } + + + + /* Starting with the first cluster that now contains all the + * sequences keep splitting until no cluster contains more than + * iMaxAllowedObjsPerCluster + * + * Keep a queue of clusters (rClusterSplitQueue) to split + * + * At each split values/memory of the just split cluster will be + * reused and exactly one new only allocated. + * + * Example: + * Given the following cluster assignments + * 0 0 0 0 1 1 2 2 2 3 3 3 3 3 3 3 4 4 + * and a K-Means split in cluster 3 at |: + * 0 0 0 0 1 1 2 2 2 3 3 3 | 3 3 3 3 4 4 + * The result should be this: + * 0 0 0 0 1 1 2 2 2 3 3 3 | 5 5 5 5 4 4 + * + * + */ + INT_QUEUE_INIT(&rClusterSplitQueue); + if (iNObjs>iMaxAllowedObjsPerCluster) { + /* pish fake first cluster index */ + INT_QUEUE_PUSH(&rClusterSplitQueue, 0); + } + iNRounds = 0; + while (! INT_QUEUE_EMPTY(&rClusterSplitQueue)) { + /* assignments for each seq to the K newly created clusters */ + int *piKClusterAssignments; + /* number of objects in cluster that is to be split */ + int iNObjsInClusterToSplit; + /* coordinates of points in cluster that is to be split + * array of size n*d where [d*i + j] gives coordinate j of point i + */ + double *pdVectorsInClusterToSplit; + /* copy of object indices in split cluster */ + int *piObjIndicesOfSplitCluster; + /* best cost of kmeans rounds */ + double dCost = -1.0; + + /* indices for the two created clusters + */ + /* index of cluster to split */ + int iClusterToSplot; + /* index of newly created cluster at each round. data for the + other created cluster goes to the one just split, + i.e. (*piClusterToSplot) */ + int iNewClusterIdx; + +#if TIMING + StopwatchZero(stopwatch); + StopwatchStart(stopwatch); +#endif + + INT_QUEUE_POP(&rClusterSplitQueue, &iClusterToSplot); + + iNObjsInClusterToSplit = (*prKMeansResult_p)->piNObjsPerCluster[iClusterToSplot]; + piKClusterAssignments = (int *) + CKMALLOC(iNObjsInClusterToSplit * sizeof(int)); + + pdVectorsInClusterToSplit = (double *) + CKMALLOC(iNObjsInClusterToSplit * iDim * sizeof(double)); + for (iN=0; iN<iNObjsInClusterToSplit; iN++) { + for (iD=0; iD<iDim; ++iD) { + int iThisObjIdx = + (*prKMeansResult_p)->ppiObjIndicesPerCluster[iClusterToSplot][iN]; + pdVectorsInClusterToSplit[iDim*iN + iD] = ppdVectors[iThisObjIdx][iD]; + } + } + +#if TRACE + Log(&rLog, LOG_FOCRED_DEBUG, "Round %d: Will split cluster %d which has %d objects", + iNRounds, iClusterToSplot, iNObjsInClusterToSplit); + fprintf(stderr, "DEBUG(%s|%s():%d): Object indices in cluster to split are:", + __FILE__, __FUNCTION__, __LINE__); + for (iN=0; iN<iNObjsInClusterToSplit; iN++) { + fprintf(stderr, " %u", + (*prKMeansResult_p)->ppiObjIndicesPerCluster[iClusterToSplot][iN]); + } + fprintf(stderr, "\n"); + (void) fflush(stderr); +#endif + +#if TRACE + for (iN=0; iN<iNObjsInClusterToSplit; iN++) { + fprintf(stderr, + "DEBUG(%s|%s():%d): Coordinate of object %u (real index %u) in cluster to split:", + __FILE__, __FUNCTION__, __LINE__, iN, + (*prKMeansResult_p)->ppiObjIndicesPerCluster[iClusterToSplot][iN]); + for (iD=0; iD<iDim; iD++) { + fprintf(stderr, " %f", pdVectorsInClusterToSplit[iDim*iN + iD]); + } + fprintf(stderr, "\n"); + (void) fflush(stderr); + } +#endif + + /* KMeans(1 "The number of points in the data set", + * 2 "The number of clusters to look for", + * 3 "The number of dimensions that the data set lives in", + * 4 "points: An array of size n*d where points[d*i + j] gives coordinate j of point i", + * 5 "attempts: The number of times to independently run k-means", + * 6 "use_lloyds_method: uses kmpp if false, otherwise lloyds method", + * 7 "centers: This can either be null or an array of size k*d. + * In the latter case, centers[d*i + j] will give coordinate j of center i. + * If the cluster is unused, it will contain NaN instead.", + * 8 "assignments: This can either be null or an array of size n. + * In the latter case, it will be filled with the cluster that each point is assigned to + * (an integer between 0 and k-1 inclusive)."); + */ + dCost = KMeans(iNObjsInClusterToSplit, 2, iDim, + pdVectorsInClusterToSplit, + RESTARTS_PER_SPLIT, USE_KMEANS_LLOYDS, + pdKClusterCenters, piKClusterAssignments); + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Raw K-Means output:"); + for (iN=0; iN<2; iN++) { + fprintf(stderr, "DEBUG(%s|%s():%d): Cluster Center %u =", + __FILE__, __FUNCTION__, __LINE__, iN); + for (iD=0; iD<iDim; iD++) { + fprintf(stderr, " %f", pdKClusterCenters[iN*iDim+iD]); + } + fprintf(stderr, "\n"); + (void) fflush(stderr); + } + for (iN=0; iN<iNObjsInClusterToSplit; iN++) { + Log(&rLog, LOG_FORCED_DEBUG, " Raw assignment: Seq %u to cluster %d (of #%u)", + iN, piKClusterAssignments[iN], 2); + } +#endif + + /* real index of one of the newly created clusters. the other + * one is iClusterToSplot */ + iNewClusterIdx = (*prKMeansResult_p)->iNClusters; + + + /* We don't want Clusters which are too small. Check here if a + * split created a small cluster and if yes, discard the + * solution. Because the cluster has already been removed from + * the queue, we can just continue. + */ + bSmallClusterDetected = FALSE; + if (iMinRequiredObjsPerCluster>1) { + int iNObjsCluster[2]; + iNObjsCluster[0] = 0; /* first cluster */ + iNObjsCluster[1] = 0; /* second cluster */ + for (iN=0; iN<iNObjsInClusterToSplit; iN++) { + iNObjsCluster[piKClusterAssignments[iN]]+=1; + } + + if (iNObjsCluster[0]<iMinRequiredObjsPerCluster + || + iNObjsCluster[1]<iMinRequiredObjsPerCluster) { + bSmallClusterDetected = TRUE; + Log(&rLog, LOG_FORCED_DEBUG, "Skipping this split because objs in 1st/2nd cluster = %d/%d < %d", + iNObjsCluster[0], iNObjsCluster[1], iMinRequiredObjsPerCluster); + } + } + + /* Same logic as for small clusters applies if KMeans couldn't + * split the cluster. In this case one of its center + * coordinates will be NaN, which we check for in the + * following. + */ + if (! bSmallClusterDetected) { + for (iN=0; iN<2; iN++) { + bNaNDetected = FALSE; + for (iD=0; iD<iDim; iD++) { + if (0 != isnan(pdKClusterCenters[iN*iDim+iN])) { + /* Got NaN as coordinate after splitting */ + Log(&rLog, LOG_WARN, "%s(): Can't split cluster no. %d which has %d objects any further. %s", + __FUNCTION__, + iClusterToSplot, iNObjsInClusterToSplit, + "Hope it's not too big and doesn't slow things down." + ); + bNaNDetected = TRUE; + break; + } + } + if (bNaNDetected) { + break; + } + } + } + + /* Discarding split of this cluster. It has been removed from the + * queue already. so just continue + */ + if (bNaNDetected || bSmallClusterDetected) { + CKFREE(piKClusterAssignments); + CKFREE(pdVectorsInClusterToSplit); + continue; + } + + + /* update cluster centers: pdClusterCenters + * + */ + /* reuse memory of existing/old/split cluster + */ + for (iN=0; iN<iDim; iN++) { + double dCoord = pdKClusterCenters[0*iDim+iN]; + (*prKMeansResult_p)->ppdClusterCenters[iClusterToSplot][iN] = dCoord; + } + /* realloc and set new one + */ + (*prKMeansResult_p)->ppdClusterCenters = (double **) + CKREALLOC((*prKMeansResult_p)->ppdClusterCenters, + ((*prKMeansResult_p)->iNClusters+1) * sizeof(double *)); + (*prKMeansResult_p)->ppdClusterCenters[iNewClusterIdx] = (double *) + CKMALLOC(iDim * sizeof(double)); + for (iD=0; iD<iDim; iD++) { + double dCoord = pdKClusterCenters[1*iDim+iD]; + (*prKMeansResult_p)->ppdClusterCenters[iNewClusterIdx][iD] = dCoord; + } +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "* Update of cluster centers done. Cluster centers so far:"); + for (iN=0; iN<(*prKMeansResult_p)->iNClusters+1; iN++) { + fprintf(stderr, "DEBUG(%s|%s():%d): Center %u =", + __FILE__, __FUNCTION__, __LINE__, iN); + for (iD=0; iD<iDim; iD++) { + fprintf(stderr, " %f", (*prKMeansResult_p)->ppdClusterCenters[iN][iD]); + } + fprintf(stderr, "\n"); + (void) fflush(stderr); + } +#endif + + + /* update #seqs per cluster: piNObjsPerCluster + * + */ + (*prKMeansResult_p)->piNObjsPerCluster = (int *) + CKREALLOC((*prKMeansResult_p)->piNObjsPerCluster, + ((*prKMeansResult_p)->iNClusters+1) * sizeof(int)); + /* init new and old one to zero */ + (*prKMeansResult_p)->piNObjsPerCluster[iClusterToSplot] = 0; + (*prKMeansResult_p)->piNObjsPerCluster[iNewClusterIdx] = 0; + /* now update values */ + for (iN=0; iN<iNObjsInClusterToSplit; iN++) { + if (0 == piKClusterAssignments[iN]) { + (*prKMeansResult_p)->piNObjsPerCluster[iClusterToSplot] += 1; + } else if (1 == piKClusterAssignments[iN]) { + (*prKMeansResult_p)->piNObjsPerCluster[iNewClusterIdx] += 1; + } else { + /* there used to be code for iK>=2 in r101 */ + Log(&rLog, LOG_FATAL, "Internal error: split into more than two clusters (got assignment %d)", + piKClusterAssignments[iN]); + } + } +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "* Update of NObjs per cluster done:"); + for (iN=0; iN<(*prKMeansResult_p)->iNClusters+1; iN++) { + Log(&rLog, LOG_FORCED_DEBUG, "Cluster %d contains %d sequences", + iN, (*prKMeansResult_p)->piNObjsPerCluster[iN]); + } +#endif + /* queue clusters if still they are still too big + */ + if ((*prKMeansResult_p)->piNObjsPerCluster[iClusterToSplot] > iMaxAllowedObjsPerCluster) { + INT_QUEUE_PUSH(&rClusterSplitQueue, iClusterToSplot); + } + if ((*prKMeansResult_p)->piNObjsPerCluster[iNewClusterIdx] > iMaxAllowedObjsPerCluster) { + INT_QUEUE_PUSH(&rClusterSplitQueue, iNewClusterIdx); + } + + + + /* update which objects belong to which cluster: + * + * note: piNObjsPerCluster needs to be already updated + * + */ + /* create a copy of the object indices in the split cluster + * (original will be overwritten) + */ + piObjIndicesOfSplitCluster = (int *) CKMALLOC(iNObjsInClusterToSplit * sizeof(int)); + memcpy(piObjIndicesOfSplitCluster, + (*prKMeansResult_p)->ppiObjIndicesPerCluster[iClusterToSplot], + iNObjsInClusterToSplit * sizeof(int)); + + (*prKMeansResult_p)->ppiObjIndicesPerCluster = (int **) + CKREALLOC((*prKMeansResult_p)->ppiObjIndicesPerCluster, + ((*prKMeansResult_p)->iNClusters+1) * sizeof(int *)); + + + (*prKMeansResult_p)->ppiObjIndicesPerCluster[iClusterToSplot] = + (int *) CKREALLOC((*prKMeansResult_p)->ppiObjIndicesPerCluster[iClusterToSplot], + (*prKMeansResult_p)->piNObjsPerCluster[iClusterToSplot] * sizeof(int)); + + (*prKMeansResult_p)->ppiObjIndicesPerCluster[iNewClusterIdx] = + (int *) CKMALLOC((*prKMeansResult_p)->piNObjsPerCluster[iNewClusterIdx] * sizeof(int)); + + + /* now reassign the object indices to the assigned cluster + */ + piCurObjToUpdate[0] = 0; + piCurObjToUpdate[1] = 0; + for (iN=0; iN<iNObjsInClusterToSplit; iN++) { + int iThisObjIdx = piObjIndicesOfSplitCluster[iN]; + int iThisClusterAssignment = piKClusterAssignments[iN]; + int iThisOffset = piCurObjToUpdate[iThisClusterAssignment]; + int iThisClusterIndex = 0; + + if (0 == iThisClusterAssignment) { + iThisClusterIndex = iClusterToSplot; + } else if (1 == iThisClusterAssignment) { + iThisClusterIndex = iNewClusterIdx; + } else { + /* there used to be code for iK>=2 in r101 */ + Log(&rLog, LOG_FATAL, "Internal error: split into more than two clusters (got assignment %d)", + piKClusterAssignments[iN]); + } +#if 0 + Log(&rLog, LOG_FORCED_DEBUG, "Setting (*prKMeansResult_p)->ppiObjIndicesPerCluster[%d][%d] = %d", + iThisClusterIndex, iThisOffset, iThisObjIdx); +#endif + (*prKMeansResult_p)->ppiObjIndicesPerCluster[iThisClusterIndex][iThisOffset] = iThisObjIdx; + piCurObjToUpdate[iThisClusterAssignment]+=1; + } + CKFREE(piObjIndicesOfSplitCluster); +#if TRACE + for (iN=0; iN<(*prKMeansResult_p)->iNClusters+1; iN++) { + int iObj; + fprintf(stderr, "DEBUG(%s|%s():%d): Objects in cluster %u: ", + __FILE__, __FUNCTION__, __LINE__, iN); + for (iObj=0; iObj<(*prKMeansResult_p)->piNObjsPerCluster[iN]; iObj++) { + fprintf(stderr, " %u", (*prKMeansResult_p)->ppiObjIndicesPerCluster[iN][iObj]); + } + fprintf(stderr, "\n"); + (void) fflush(stderr); + } +#endif + + +#if TIMING + StopwatchStop(stopwatch); + StopwatchDisplay(stdout, "Total time after next round in Bisecting-KMeans: ", stopwatch); +#endif + + + /* finally: increase number of clusters + */ + (*prKMeansResult_p)->iNClusters += 1; + iNRounds += 1; + CKFREE(piKClusterAssignments); + CKFREE(pdVectorsInClusterToSplit); + + } /* while */ + INT_QUEUE_DESTROY(&rClusterSplitQueue); + + + Log(&rLog, LOG_DEBUG, + "Bisecting K-means finished after %d rounds (no more clusters to split)", + iNRounds); + +#if TIMING + StopwatchFree(stopwatch); +#endif + + /* @note could use progress/timer */ + + CKFREE(pdKClusterCenters); + CKFREE(piCurObjToUpdate); + + return; +} +/*** end: BisectingKmeans() ***/ + + + +/** + * + * @brief From scratch reimplementation of mBed: Blackshields et al. + * (2010); PMID 20470396. + * + * Idea is a follows: + * - convert sequences into vectors of distances + * - cluster the vectors using k-means + * - cluster each of the k clusters using upgma (used cached distances + * from above?) + * - join the sub-clusters to create on tree (use UPGMA on k-means + * medoids) + * + * + * @param[out] prMbedTree_p + * Created upgma tree. will be allocated here. use FreeMuscleTree() + * to free + * @param[in] prMSeq + * Multiple sequences + * @param[in] iPairDistType + * Distance measure for pairwise alignments + * @param[in] pcGuidetreeOut + * Passed down to GuideTreeUpgma() + * + * @return Zero on success, non-zero on error + * + */ +int +Mbed(tree_t **prMbedTree_p, mseq_t *prMSeq, const int iPairDistType, + const char *pcGuidetreeOut) +{ + /* number of seeds */ + int iNumSeeds; + /* seed indices matching prMSeq */ + int *piSeeds; + /* seqs represented as distance vectors */ + double **ppdSeqVec; + /* kmeans result */ + bisecting_kmeans_result_t *prKMeansResult = NULL; + /* distance matrix of kmeans (pre-)cluster centers */ + symmatrix_t *prPreClusterDistmat = NULL; + /* auxiliary for symmetric matrix output; tree routines etc */ + char **ppcLabels; + int iNodeIndex; + /* mapping of cluster-center tree node indices to corresponding + cluster */ + int *piClusterToTreeNode; + int iClusterIndex; + int iI, uJ; + FILE *pfOut; + progress_t *prSubClusterDistanceProgress; + bool bPrintCR = (LOG_VERBOSE<=rLog.iLogLevelEnabled) ? FALSE : TRUE; + +#if FULL_WITHIN_CLUSTER_DISTANCES + Log(&rLog, LOG_WARN, + "FULL_WITHIN_CLUSTER_DISTANCES (using min %d / max %d seqs per subcluster) is a quick-hack. Brace yourself...", + MIN_REQUIRED_SEQ_PER_PRECLUSTER, MAX_ALLOWED_SEQ_PER_PRECLUSTER); +#endif + +#if MBED_TIMING + Stopwatch_t *stopwatch = StopwatchCreate(); +#endif + + assert(NULL != prMbedTree_p); + assert(NULL != prMSeq); + + + iNumSeeds = (int) NUMBER_OF_SEEDS(prMSeq->nseqs); + if (iNumSeeds >= prMSeq->nseqs) { + /* -1 is condition for RandomUniqueIntArray */ + iNumSeeds = prMSeq->nseqs-1; + Log(&rLog, LOG_DEBUG, + "Automatically determined number of seeds is bigger (or equal) the number of sequences. Will set it to %d", + iNumSeeds); + } + + + /* Turn sequences into vectors of distances to the seeds + * + */ + piSeeds = (int *) CKMALLOC(iNumSeeds * sizeof(int)); + if (0 != SeedSelection(piSeeds, iNumSeeds, SEED_SELECTION, prMSeq)) { + Log(&rLog, LOG_ERROR, "Something went wrong during seed selection for mbed"); + return -1; + } + ppdSeqVec = (double **) CKMALLOC(prMSeq->nseqs * sizeof(double *)); + for (iI=0; iI<prMSeq->nseqs; iI++) { + ppdSeqVec[iI] = (double *) CKMALLOC(iNumSeeds * sizeof(double)); + } + if (0 != SeqToVec(ppdSeqVec, prMSeq, piSeeds, iNumSeeds, iPairDistType)) { + Log(&rLog, LOG_ERROR, "Could not convert sequences into vectors for mbed"); + return -1; + } + CKFREE(piSeeds); + + + /* Calculate (pre-)clusters of sequence vectors by applying + * bisecting kmeans + * + */ +#if MBED_TIMING + /* start clock only here, to make sure we don't include pairwise + * distance computation */ + StopwatchZero(stopwatch); + StopwatchStart(stopwatch); +#endif + + BisectingKmeans(&prKMeansResult, prMSeq->nseqs, iNumSeeds, ppdSeqVec, + MIN_REQUIRED_SEQ_PER_PRECLUSTER, + MAX_ALLOWED_SEQ_PER_PRECLUSTER); + Log(&rLog, LOG_INFO, + "mBed created %u cluster/s (with a minimum of %d and a soft maximum of %d sequences each)", + prKMeansResult->iNClusters, + MIN_REQUIRED_SEQ_PER_PRECLUSTER, + MAX_ALLOWED_SEQ_PER_PRECLUSTER); + + +#if PRINT_CLUSTER_DISTRIBUTION + Log(&rLog, LOG_FORCED_DEBUG, "Bisecting Kmeans returned %d clusters", prKMeansResult->iNClusters); + for (iI=0; iI<prKMeansResult->iNClusters; iI++) { +#if TRACE + int iD; + Log(&rLog, LOG_FORCED_DEBUG, "Diagnostic output for cluster %d follows:", iI); + fprintf(stderr, "DEBUG(%s|%s():%d): center coordinates =", + __FILE__, __FUNCTION__, __LINE__); + for (iD=0; iD<iNumSeeds; iD++) { + fprintf(stderr, " %f", prKMeansResult->ppdClusterCenters[iI][iD]); + } + fprintf(stderr, "\n"); + fflush(stderr); +#endif + Log(&rLog, LOG_FORCED_DEBUG, "Cluster %d has %d objects assigned", + iI, prKMeansResult->piNObjsPerCluster[iI]); +#if TRACE + for (uJ=0; uJ<prKMeansResult->piNObjsPerCluster[iI]; uJ++) { + int iRealIndex = prKMeansResult->ppiObjIndicesPerCluster[iI][uJ]; + + Log(&rLog, LOG_FORCED_DEBUG, "Cluster %u: object %u has index %u (= seq %s)", + iI, uJ, iRealIndex, prMSeq->sqinfo[iRealIndex].name); + } +#endif + } +#endif + + + /* Cluster pre-clusters produced by k-means. + * + * Do this by calculating the vector distances of the cluster + * centers and applying UPGMA. + * + * @note could try to force-balance the tree here + * + */ + if (0 != NewSymMatrix(&prPreClusterDistmat, + prKMeansResult->iNClusters, prKMeansResult->iNClusters)) { + Log(&rLog, LOG_FATAL, "%s", "Memory allocation for pre-cluster distance-matrix failed"); + } + for (iI=0; iI<prKMeansResult->iNClusters; iI++) { + for (uJ=iI+1; uJ<prKMeansResult->iNClusters; uJ++) { + double dDist; + dDist = EuclDist(prKMeansResult->ppdClusterCenters[iI], + prKMeansResult->ppdClusterCenters[uJ], + iNumSeeds); + SymMatrixSetValue(prPreClusterDistmat, iI, uJ, dDist); + /* Log(&rLog, LOG_FORCED_DEBUG, "Euclidean distance between clusters %d and %d = %f", + iI, uJ, dDist); */ + } + } + + + /* labels needed for the guide tree building routine only */ + ppcLabels = (char **) CKMALLOC(prKMeansResult->iNClusters * sizeof(char*)); + for (iI=0; iI<prKMeansResult->iNClusters; iI++) { + ppcLabels[iI] = (char *) CKMALLOC(32 * sizeof(char)); + (void) snprintf(ppcLabels[iI], 32, "Subcluster-%u", iI); + } +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Distance matrix for pre-cluster centers:"); + SymMatrixPrint(prPreClusterDistmat, ppcLabels, NULL); +#endif + + GuideTreeUpgma(prMbedTree_p, + ppcLabels, prPreClusterDistmat, NULL); + + for (iI=0; iI<prKMeansResult->iNClusters; iI++) { + CKFREE(ppcLabels[iI]); + } + CKFREE(ppcLabels); +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Cluster-center guide-tree:"); + LogTree(*prMbedTree_p); +#endif + + + + /* Now replace each leaf in the pre-cluster-center tree + * appropriately, i.e. with the corresponding sub-cluster. + * + * For each leaf/sub-cluster, create a distance matrix for the + * corresponding sequences. Use distances between vectors as + * approximated distances between sequences. Then create a + * guide-tree by applying UPGMA. + * + */ + + /* Get a mapping of (pre)cluster number and leaf-node indices in + * the cluster-center tree. We can add trees to prMbedTree_p + * because AppendTrees() guarantees that no other than the node to + * append to changes. + */ + piClusterToTreeNode = (int*) + CKMALLOC(prKMeansResult->iNClusters * sizeof(int)); + iNodeIndex = FirstDepthFirstNode(*prMbedTree_p); + do { + if (IsLeaf(iNodeIndex, *prMbedTree_p)) { + int iLeafId = GetLeafId(iNodeIndex, *prMbedTree_p); + piClusterToTreeNode[iLeafId] = iNodeIndex; + } + iNodeIndex = NextDepthFirstNode(iNodeIndex, *prMbedTree_p); + } while (NULL_NEIGHBOR != iNodeIndex); + + + + + /* Now step through all the leafs and replace them with the + * corresponding sub-trees + */ + NewProgress(&prSubClusterDistanceProgress, LogGetFP(&rLog, LOG_INFO), + "Distance calculation within sub-clusters", bPrintCR); + /* for each cluster */ + for (iClusterIndex=0; + iClusterIndex < prKMeansResult->iNClusters; iClusterIndex++) { + /* distance matrix for the sub-cluster */ + symmatrix_t *prWithinClusterDistances = NULL; + int iNSeqInCluster; + tree_t *prSubClusterTree = NULL; + + ProgressLog(prSubClusterDistanceProgress, + iClusterIndex, prKMeansResult->iNClusters, FALSE); + +#if FULL_WITHIN_CLUSTER_DISTANCES + mseq_t *prSubClusterMSeq; + int iPairDistType; + int iSeqIndex; + + Log(&rLog, LOG_DEBUG, + "%s\n", "Calling new Mbed use makes only sense if nseq>MAX_ALLOWED_SEQ_PER_PRECLUSTER"); + + if (TRUE == prMSeq->aligned) { + iPairDistType = PAIRDIST_SQUIDID_KIMURA; + } else { + iPairDistType = PAIRDIST_KTUPLE; + } +#endif + + iNSeqInCluster = prKMeansResult->piNObjsPerCluster[iClusterIndex]; +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "#seqs in subcluster no %d = %d", + iClusterIndex, iNSeqInCluster); +#endif + +#if FULL_WITHIN_CLUSTER_DISTANCES + /* create an mseq structure for sequences in this cluster + * don't need most of the members (e.g. orig_seq) but copy + * them anyway for the sake of completeness + */ + NewMSeq(&prSubClusterMSeq); + + prSubClusterMSeq->nseqs = iNSeqInCluster; + prSubClusterMSeq->seqtype = prMSeq->seqtype; + if (NULL!=prMSeq->filename) { + prSubClusterMSeq->filename = CkStrdup(prMSeq->filename); + } + prSubClusterMSeq->seq = (char **) + CKMALLOC(prSubClusterMSeq->nseqs * sizeof(char *)); + prSubClusterMSeq->orig_seq = (char **) + CKMALLOC(prSubClusterMSeq->nseqs * sizeof(char *)); + prSubClusterMSeq->sqinfo = (SQINFO *) + CKMALLOC(prSubClusterMSeq->nseqs * sizeof(SQINFO)); + + for (iSeqIndex=0; iSeqIndex<iNSeqInCluster; iSeqIndex++) { + int iRealSeqIndex = prKMeansResult->ppiObjIndicesPerCluster[iClusterIndex][iSeqIndex]; + prSubClusterMSeq->seq[iSeqIndex] = CkStrdup(prMSeq->seq[iRealSeqIndex]); + prSubClusterMSeq->orig_seq[iSeqIndex] = CkStrdup(prMSeq->orig_seq[iRealSeqIndex]); + SeqinfoCopy(&prSubClusterMSeq->sqinfo[iSeqIndex], &prMSeq->sqinfo[iRealSeqIndex]); +#if TRACE + Log(&rLog, LOG_DEBUG, "seq no %d in cluster %d is %s (real index = %d)", + iSeqIndex, iClusterIndex, prSubClusterMSeq->sqinfo[iSeqIndex].name, + iRealSeqIndex); +#endif + } +#endif + + + /* Create a distance matrix for this sub-cluster + * (prWithinClusterDistances) by using the vector distances or + * ktuple distances. + * + * Then apply UPGMA to get a subcluster tree + * (prSubClusterTree) and append created tree to the + * pre-cluster-tree (prMbedTree_p) + * + */ +#if FULL_WITHIN_CLUSTER_DISTANCES + + /* compute distances, but be quiet */ + if (PairDistances(&prWithinClusterDistances, prSubClusterMSeq, iPairDistType, + 0, prSubClusterMSeq->nseqs, 0, prSubClusterMSeq->nseqs, + NULL, NULL)) { + Log(&rLog, LOG_ERROR, "Couldn't compute pair distances"); + return -1; + } +#else + if (NewSymMatrix(&prWithinClusterDistances, iNSeqInCluster, iNSeqInCluster)!=0) { + Log(&rLog, LOG_FATAL, "%s", "Memory allocation for disparity matrix failed"); + } + for (iI=0; iI<iNSeqInCluster; iI++) { + int iRealIndexI = prKMeansResult->ppiObjIndicesPerCluster[iClusterIndex][iI]; + + for (uJ=iI+1; uJ<iNSeqInCluster; uJ++) { + int iRealIndexJ = prKMeansResult->ppiObjIndicesPerCluster[iClusterIndex][uJ]; + double dist; + + /* Log(&rLog, LOG_FORCED_DEBUG, "Cluster %d: compute distance between %d:%s and %d:%s", + iClusterIndex, i, prMSeq->sqinfo[iRealIndexI].name, + uJ, prMSeq->sqinfo[iRealIndexJ].name); */ + + if (1 == USE_EUCLIDEAN_DISTANCE) { + dist = EuclDist(ppdSeqVec[iRealIndexI], + ppdSeqVec[iRealIndexJ], iNumSeeds); + } else { + dist = CosDist(ppdSeqVec[iRealIndexI], + ppdSeqVec[iRealIndexJ], iNumSeeds); + } + SymMatrixSetValue(prWithinClusterDistances, iI, uJ, dist); + } + } +#endif + + /* labels needed for the guide tree building routine only */ + ppcLabels = (char**) CKMALLOC(iNSeqInCluster * sizeof(char*)); + for (iI=0; iI<iNSeqInCluster; iI++) { +#if FULL_WITHIN_CLUSTER_DISTANCES + ppcLabels[iI] = prSubClusterMSeq->sqinfo[iI].name; +#else + int iRealIndex = prKMeansResult->ppiObjIndicesPerCluster[iClusterIndex][iI]; + ppcLabels[iI] = prMSeq->sqinfo[iRealIndex].name; +#endif + } +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Distance matrix for seqs within sub cluster %d/%d", + iClusterIndex, prKMeansResult->iNClusters); + SymMatrixPrint(prWithinClusterDistances, ppcLabels, NULL); +#endif + + + GuideTreeUpgma(&prSubClusterTree, ppcLabels, + prWithinClusterDistances, NULL); + + CKFREE(ppcLabels); /* don't free members, they just point */ +#if 0 + Log(&rLog, LOG_FORCED_DEBUG, "Cluster %d guide-tree:", iClusterIndex); + LogTree(prSubClusterTree); +#endif + + + /* The guide tree id's (that point to the sequences) now start + * from 0, i.e. the association with the prMSeq numbering is + * broken and fixed in the following + */ + for (iNodeIndex = 0; iNodeIndex < (int)GetNodeCount(prSubClusterTree); iNodeIndex++) { + if (IsLeaf(iNodeIndex, prSubClusterTree)) { + int iLeafId = GetLeafId(iNodeIndex, prSubClusterTree); + int iRealId = prKMeansResult->ppiObjIndicesPerCluster[iClusterIndex][iLeafId]; +#if 0 + Log(&rLog, LOG_FORCED_DEBUG, "Correcting leaf node %d which has (wrong) id %d and name %s to id %d (prMSeq name %s)", + iNodeIndex, iLeafId, + GetLeafName(iNodeIndex, prSubClusterTree), + iRealId, prMSeq->sqinfo[iRealId].name); +#endif + SetLeafId(prSubClusterTree, iNodeIndex, iRealId); + } + } + + + /* Append the newly created tree (prSubClusterTree) to the + * corresponding node index of prMbedTree_p. + */ +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Will join trees at leaf node %d = %s", + piClusterToTreeNode[iClusterIndex], + GetLeafName(piClusterToTreeNode[iClusterIndex], *prMbedTree_p)); +#endif + + AppendTree(*prMbedTree_p, + piClusterToTreeNode[iClusterIndex], + prSubClusterTree); + /* Note: piClusterToTreeNode is still valid, because + * AppendTrees() guarantees that no other than the node to + * append to changes. */ + +#if 0 + Log(&rLog, LOG_FORCED_DEBUG, "%s", "prMbedTree_p after cluster %d has appended:", iClusterIndex); + LogTree(*prMbedTree_p); + + if (0) { + char fname[] = "mbed-joined-tree.dnd"; + FILE *pfOut; + if (NULL == (pfOut = fopen(fname, "w"))) { + Log(&rLog, LOG_FATAL, "Couldn't open %s for writing", fname); + } + MuscleTreeToFile(pfOut, *prMbedTree_p); + Log(&rLog, LOG_FORCED_DEBUG, "Joined tree written to %s", fname); + fclose(pfOut); + Log(&rLog, LOG_FATAL, "DEBUG EXIT"); + } +#endif + + /* cleanup + */ + FreeMuscleTree(prSubClusterTree); + FreeSymMatrix(&prWithinClusterDistances); +#if FULL_WITHIN_CLUSTER_DISTANCES + FreeMSeq(&prSubClusterMSeq); +#endif + } /* end for each cluster */ + ProgressDone(prSubClusterDistanceProgress); + FreeProgress(&prSubClusterDistanceProgress); + + + if (NULL != pcGuidetreeOut) { + if (NULL == (pfOut = fopen(pcGuidetreeOut, "w"))) { + Log(&rLog, LOG_ERROR, "Couldn't open %s for writing", pcGuidetreeOut); + } else { + MuscleTreeToFile(pfOut, *prMbedTree_p); + Log(&rLog, LOG_INFO, "Guide tree written to %s", pcGuidetreeOut); + (void) fclose(pfOut); + } + } + + + /* cleanup + * + */ +#if MBED_TIMING + StopwatchStop(stopwatch); + StopwatchDisplay(stdout, "mBed time (without pairwise distance computation): ", stopwatch); + StopwatchFree(stopwatch); +#endif + + FreeKMeansResult(&prKMeansResult); + FreeSymMatrix(&prPreClusterDistmat); + for (iI=0; iI<prMSeq->nseqs; iI++) { + CKFREE(ppdSeqVec[iI]); + } + CKFREE(ppdSeqVec); + CKFREE(piClusterToTreeNode); + +#ifndef NDEBUG + TreeValidate(*prMbedTree_p); +#endif + + return 0; +} +/*** end: Mbed() ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/mbed.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,30 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: mbed.h 193 2011-02-07 15:45:21Z andreas $ + */ + +#ifndef CLUSTALO_MBED_H +#define CLUSTALO_MBED_H + +#include "muscle_tree.h" +#include "seq.h" + + +extern int +Mbed(tree_t **tree, mseq_t *prMSeq, + const int iPairDistType, const char *pcGuidetreeOutfile); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/muscle_tree.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,2017 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/* This a mix of tree functions and data-structures from + * Bob Edgar's Muscle (version 3.7) ported to pure C, topped up with + * some of our own stuff. + * + * Used files: phy.cpp, tree.h, phytofile.cpp and phyfromclust.cpp + * + * Muscle's code is public domain and so is this code here. + + * From http://www.drive5.com/muscle/license.htm: + * """ + * MUSCLE is public domain software + * + * The MUSCLE software, including object and source code and + * documentation, is hereby donated to the public domain. + * + * Disclaimer of warranty + * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * """ + * + */ + +/* + * RCS $Id: muscle_tree.c 230 2011-04-09 15:37:50Z andreas $ + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <limits.h> +#include <assert.h> +#include <ctype.h> + +#include "util.h" +#include "log.h" +#include "muscle_tree.h" + + +static const double VERY_NEGATIVE_DOUBLE = -9e29; +/*const double dInsane = VERY_NEGATIVE_DOUBLE;*/ +static const double dInsane = -9e29; +static const unsigned uInsane = 8888888; + +typedef enum +{ + NTT_Unknown, + + /* Returned from Tree::GetToken: */ + NTT_Lparen, + NTT_Rparen, + NTT_Colon, + NTT_Comma, + NTT_Semicolon, + NTT_String, + + /* Following are never returned from Tree::GetToken: */ + NTT_SingleQuotedString, + NTT_DoubleQuotedString, + NTT_Comment +} NEWICK_TOKEN_TYPE; + + +static void +InitCache(uint uCacheCount, tree_t *tree); +static void +TreeZero(tree_t *tree); +static uint +GetNeighborCount(unsigned uNodeIndex, tree_t *tree); +static bool +IsEdge(unsigned uNodeIndex1, unsigned uNodeIndex2, tree_t *tree); +static bool +HasEdgeLength(uint uNodeIndex1, uint uNodeIndex2, tree_t *tree); +static void +TreeToFileNodeRooted(tree_t *tree, uint m_uRootNodeIndex, FILE *fp); +static void +ValidateNode(uint uNodeIndex, tree_t *tree); +static void +AssertAreNeighbors(unsigned uNodeIndex1, unsigned uNodeIndex2, tree_t *tree); +static void +ExpandCache(tree_t *tree); +static void +TreeCreateRooted(tree_t *tree); +static bool +GetGroupFromFile(FILE *fp, uint uNodeIndex, double *ptrdEdgeLength, tree_t *tree); +static NEWICK_TOKEN_TYPE +GetToken(FILE *fp, char szToken[], uint uBytes); +/* stuff from textfile.cpp */ +static void +FileSkipWhite(FILE *fp); +static bool +FileSkipWhiteX(FILE *fp); +static void +SetLeafName(uint uNodeIndex, const char *ptrName, tree_t *tree); +uint +AppendBranch(tree_t *tree, uint uExistingLeafIndex); +static void +SetEdgeLength(uint uNodeIndex1, uint uNodeIndex2, + double dLength, tree_t *tree); +static uint +UnrootFromFile(tree_t *tree); +uint +GetNeighbor(uint uNodeIndex, uint uNeighborSubscript, tree_t *tree); +static void +InitNode(tree_t *prTree, uint uNodeIndex); + + +/** + * @param[in] uNodeIndex + * node to examine + * @param[in] tree + * tree to examine + * @return id of left node + * @note called GetRight in Muscle3.7 + */ +uint +GetLeft(uint uNodeIndex, tree_t *tree) +{ + assert(NULL != tree); + assert(tree->m_bRooted && uNodeIndex < tree->m_uNodeCount); + return tree->m_uNeighbor2[uNodeIndex]; +} +/*** end: GetLeft ***/ + + + +/** + * @param[in] uNodeIndex + * node to examine + * @param[in] tree + * tree to examine + * @return id of right node + * @note called GetRight in Muscle3.7 + */ +uint +GetRight(uint uNodeIndex, tree_t *tree) +{ + assert(NULL != tree); + assert(tree->m_bRooted && uNodeIndex < tree->m_uNodeCount); + return tree->m_uNeighbor3[uNodeIndex]; +} +/*** end: GetRight ***/ + + + +/** + * @param[in] uNodeIndex + * node to examine + * @param[in] tree + * tree to examine + * @return leaf id of current node + */ +uint +GetLeafId(uint uNodeIndex, tree_t *tree) +{ + assert(NULL != tree); + assert(uNodeIndex < tree->m_uNodeCount); + assert(IsLeaf(uNodeIndex, tree)); + + return tree->m_Ids[uNodeIndex]; +} +/*** end: GetLeafId ***/ + + + +/** + * @note originally called GetLeafName + * + */ +char * +GetLeafName(unsigned uNodeIndex, tree_t *tree) +{ + assert(NULL != tree); + assert(uNodeIndex < tree->m_uNodeCount); + assert(IsLeaf(uNodeIndex, tree)); + return tree->m_ptrName[uNodeIndex]; +} +/*** end: GetLeafName ***/ + + + +/** + * @brief returns first leaf node for a depth-first traversal of tree + * + * @param[in] tree + * tree to traverse + * + * @return node index of first leaf node for depth-first traversal + * + * @note called FirstDepthFirstNode in Muscle3.7 + * + */ +uint +FirstDepthFirstNode(tree_t *tree) +{ + uint uNodeIndex; + + assert(NULL != tree); + assert(IsRooted(tree)); + + /* Descend via left branches until we hit a leaf */ + uNodeIndex = tree->m_uRootNodeIndex; + while (!IsLeaf(uNodeIndex, tree)) + uNodeIndex = GetLeft(uNodeIndex, tree); + return uNodeIndex; +} +/*** end: FirstDepthFirstNode ***/ + + +/** + * @brief returns next leaf node index for depth-first traversal of + * tree + * + * @param[in] tree + * tree to traverse + * @param[in] uNodeIndex + * Current node index + * + * @return node index of next leaf node during depth-first traversal + * + * @note called NextDepthFirstNode in Muscle3.7 + */ +uint +NextDepthFirstNode(uint uNodeIndex, tree_t *tree) +{ + uint uParent; + + assert(NULL != tree); + assert(IsRooted(tree)); + assert(uNodeIndex < tree->m_uNodeCount); + + if (IsRoot(uNodeIndex, tree)) + { + /* Node uNodeIndex is root, end of traversal */ + return NULL_NEIGHBOR; + } + + uParent = GetParent(uNodeIndex, tree); + if (GetRight(uParent, tree) == uNodeIndex) { + /* Is right branch, return parent=uParent */ + return uParent; + } + + uNodeIndex = GetRight(uParent, tree); + /* Descend left from right sibling uNodeIndex */ + while (!IsLeaf(uNodeIndex, tree)) { + uNodeIndex = GetLeft(uNodeIndex, tree); + } + + /* bottom out at leaf uNodeIndex */ + return uNodeIndex; +} +/*** end: NextDepthFirstNode ***/ + + + +/** + * @brief check if tree is a rooted tree + * @param[in] tree + * tree to check + * @return TRUE if given tree is rooted, FALSE otherwise + * + */ +bool +IsRooted(tree_t *tree) +{ + assert(NULL != tree); + return tree->m_bRooted; +} +/*** end: IsRooted ***/ + + +/** + * + */ +void +FreeMuscleTree(tree_t *tree) +{ + uint i; + + assert(tree!=NULL); + + + /* FIXME use GetLeafNodeIndex? or + for (unsigned uNodeIndex = 0; uNodeIndex < m_uNodeCount; ++uNodeIndex) + { + if (tree.IsLeaf(uNodeIndex)) + { + const char *ptrName = + tree.GetLeafName(uNodeIndex); + */ + /* IsLeaf needs m_uNodeCount and all m_uNeighbor's + * so free first + */ + for (i=0; i<tree->m_uNodeCount; i++) { + /* IsLeaf needs neighbour count, so free those guys later */ + if (IsLeaf(i, tree)) { + CKFREE(tree->m_ptrName[i]); + } + } + CKFREE(tree->m_ptrName); + + CKFREE(tree->m_uNeighbor1); + CKFREE(tree->m_uNeighbor2); + CKFREE(tree->m_uNeighbor3); + + CKFREE(tree->m_Ids); + + CKFREE(tree->m_dEdgeLength1); + CKFREE(tree->m_dEdgeLength2); + CKFREE(tree->m_dEdgeLength3); +#if USE_HEIGHT + CKFREE(tree->m_dHeight); + CKFREE(tree->m_bHasHeight); +#endif + CKFREE(tree->m_bHasEdgeLength1); + CKFREE(tree->m_bHasEdgeLength2); + CKFREE(tree->m_bHasEdgeLength3); + + TreeZero(tree); + + free(tree); +} +/*** end: FreeMuscleTree ***/ + + + +/** + * @brief create a muscle tree + * + * @note Original comment in Muscle code: "Create rooted tree from a + * vector description. Node indexes are 0..N-1 for leaves, N..2N-2 for + * internal nodes. Vector subscripts are i-N and have values for + * internal nodes only, but those values are node indexes 0..2N-2. So + * e.g. if N=6 and Left[2]=1, this means that the third internal node + * (node index 8) has the second leaf (node index 1) as its left + * child. uRoot gives the vector subscript of the root, so add N to + * get the node index." + * + * @param[out] tree + * newly created tree + * @param[in] uLeafCount + * number of leaf nodes + * @param[in] uRoot + * Internal node index of root node + * @param[in] Left + * Node index of left sibling of an internal node. + * Index range: 0--uLeafCount-1 + * @param[in] Right + * Node index of right sibling of an internal node. + * Index range: 0--uLeafCount-1 + * @param[in] LeftLength + * Branch length of left branch of an internal node. + * Index range: 0--uLeafCount-1 + * @param[in] RightLength + * Branch length of right branch of an internal node. + * Index range: 0--uLeafCount-1 + * @param[in] LeafIds + * Leaf id. Index range: 0--uLeafCount + * @param[in] LeafNames + * Leaf label. Index range: 0--uLeafCount + * + */ +void +MuscleTreeCreate(tree_t *tree, + uint uLeafCount, uint uRoot, + const uint *Left, const uint *Right, + const float *LeftLength, const float* RightLength, + const uint *LeafIds, char **LeafNames) +{ + uint uNodeIndex; + + TreeZero(tree); + tree->m_uNodeCount = 2*uLeafCount - 1; + InitCache(tree->m_uNodeCount, tree); + + for (uNodeIndex = 0; uNodeIndex < uLeafCount; ++uNodeIndex) { + tree->m_Ids[uNodeIndex] = LeafIds[uNodeIndex]; + tree->m_ptrName[uNodeIndex] = CkStrdup(LeafNames[uNodeIndex]); + } + + for (uNodeIndex = uLeafCount; uNodeIndex < tree->m_uNodeCount; ++uNodeIndex) { + uint v = uNodeIndex - uLeafCount; + uint uLeft = Left[v]; + uint uRight = Right[v]; + float fLeft = LeftLength[v]; + float fRight = RightLength[v]; + + tree->m_uNeighbor2[uNodeIndex] = uLeft; + tree->m_uNeighbor3[uNodeIndex] = uRight; + + tree->m_bHasEdgeLength2[uNodeIndex] = TRUE; + tree->m_bHasEdgeLength3[uNodeIndex] = TRUE; + + tree->m_dEdgeLength2[uNodeIndex] = fLeft; + tree->m_dEdgeLength3[uNodeIndex] = fRight; + + tree->m_uNeighbor1[uLeft] = uNodeIndex; + tree->m_uNeighbor1[uRight] = uNodeIndex; + + tree->m_dEdgeLength1[uLeft] = fLeft; + tree->m_dEdgeLength1[uRight] = fRight; + + tree->m_bHasEdgeLength1[uLeft] = TRUE; + tree->m_bHasEdgeLength1[uRight] = TRUE; + } + + tree->m_bRooted = TRUE; + tree->m_uRootNodeIndex = uRoot + uLeafCount; +#ifndef NDEBUG + TreeValidate(tree); +#endif +} +/*** end: MuscleTreeCreate ***/ + + + +/** + * @param[in] tree + * tree to write + * @param[out] fp + * filepointer to write to2 + * + * @brief write a muscle tree to a file in newick format (distances + * and all names) + * + * + */ +void +MuscleTreeToFile(FILE *fp, tree_t *tree) +{ + assert(NULL != tree); + if (IsRooted(tree)) { + TreeToFileNodeRooted(tree, tree->m_uRootNodeIndex, fp); + fprintf(fp, ";\n"); + return; + } else { + Log(&rLog, LOG_FATAL, "FIXME: output of unrooted muscle trees not implemented"); + } +} +/*** end: MuscleTreeToFile ***/ + + + +/** + * @brief check if given node is a leaf node + * + * @param[in] uNodeIndex + * the node index + * @param tree + * the tree + * + * @return TRUE if given node is a leaf, FALSE otherwise + * + * @note called IsLeaf in Muscle3.7. See tree.h in original code + */ +bool +IsLeaf(uint uNodeIndex, tree_t *tree) +{ + assert(NULL != tree); + assert(uNodeIndex < tree->m_uNodeCount); + if (1 == tree->m_uNodeCount) + return TRUE; + return 1 == GetNeighborCount(uNodeIndex, tree); +} +/*** end: IsLeaf ***/ + + + +/** + */ +bool +IsRoot(uint uNodeIndex, tree_t *tree) +{ + assert(NULL != tree); + return IsRooted(tree) && tree->m_uRootNodeIndex == uNodeIndex; +} +/*** end: IsRoot ***/ + + + +/** + */ +uint +GetNeighborCount(uint uNodeIndex, tree_t *tree) +{ + uint n1, n2, n3; + assert(uNodeIndex < tree->m_uNodeCount); + assert(NULL != tree); + assert(NULL != tree->m_uNeighbor1); + assert(NULL != tree->m_uNeighbor2); + assert(NULL != tree->m_uNeighbor3); + n1 = tree->m_uNeighbor1[uNodeIndex]; + n2 = tree->m_uNeighbor2[uNodeIndex]; + n3 = tree->m_uNeighbor3[uNodeIndex]; + return (NULL_NEIGHBOR != n1) + (NULL_NEIGHBOR != n2) + (NULL_NEIGHBOR != n3); +} +/*** end: GetNeighborCount ***/ + + +/** + */ +uint +GetParent(unsigned uNodeIndex, tree_t *tree) +{ + assert(NULL != tree); + assert(tree->m_bRooted && uNodeIndex < tree->m_uNodeCount); + return tree->m_uNeighbor1[uNodeIndex]; +} +/*** end: GetParent ***/ + + + +/** + */ +bool +IsEdge(unsigned uNodeIndex1, unsigned uNodeIndex2, tree_t *tree) +{ + assert(uNodeIndex1 < tree->m_uNodeCount && uNodeIndex2 < tree->m_uNodeCount); + assert(NULL != tree); + + return tree->m_uNeighbor1[uNodeIndex1] == uNodeIndex2 || + tree->m_uNeighbor2[uNodeIndex1] == uNodeIndex2 || + tree->m_uNeighbor3[uNodeIndex1] == uNodeIndex2; +} +/*** end: IsEdge ***/ + + + +/** + */ +bool +HasEdgeLength(uint uNodeIndex1, uint uNodeIndex2, tree_t *tree) +{ + assert(NULL != tree); + assert(uNodeIndex1 < tree->m_uNodeCount); + assert(uNodeIndex2 < tree->m_uNodeCount); + assert(IsEdge(uNodeIndex1, uNodeIndex2, tree)); + + if (tree->m_uNeighbor1[uNodeIndex1] == uNodeIndex2) + return tree->m_bHasEdgeLength1[uNodeIndex1]; + else if (tree->m_uNeighbor2[uNodeIndex1] == uNodeIndex2) + return tree->m_bHasEdgeLength2[uNodeIndex1]; + assert(tree->m_uNeighbor3[uNodeIndex1] == uNodeIndex2); + return tree->m_bHasEdgeLength3[uNodeIndex1]; +} +/*** end: ***/ + + +/** + */ +double +GetEdgeLength(uint uNodeIndex1, uint uNodeIndex2, tree_t *tree) +{ + assert(NULL != tree); + assert(uNodeIndex1 < tree->m_uNodeCount && uNodeIndex2 < tree->m_uNodeCount); + if (!HasEdgeLength(uNodeIndex1, uNodeIndex2, tree)) + { + Log(&rLog, LOG_FATAL, "Missing edge length in tree %u-%u", uNodeIndex1, uNodeIndex2); + } + + if (tree->m_uNeighbor1[uNodeIndex1] == uNodeIndex2) + return tree->m_dEdgeLength1[uNodeIndex1]; + else if (tree->m_uNeighbor2[uNodeIndex1] == uNodeIndex2) + return tree->m_dEdgeLength2[uNodeIndex1]; + assert(tree->m_uNeighbor3[uNodeIndex1] == uNodeIndex2); + return tree->m_dEdgeLength3[uNodeIndex1]; +} +/*** end: GetEdgeLength ***/ + + +/** + * + */ +void +InitNode(tree_t *prTree, uint uNodeIndex) +{ + prTree->m_uNeighbor1[uNodeIndex] = NULL_NEIGHBOR; + prTree->m_uNeighbor2[uNodeIndex] = NULL_NEIGHBOR; + prTree->m_uNeighbor3[uNodeIndex] = NULL_NEIGHBOR; + prTree->m_bHasEdgeLength1[uNodeIndex] = FALSE; + prTree->m_bHasEdgeLength2[uNodeIndex] = FALSE; + prTree->m_bHasEdgeLength3[uNodeIndex] = FALSE; +#if USE_HEIGHT + prTree->m_bHasHeight[uNodeIndex] = FALSE; + prTree->m_dHeight[uNodeIndex] = dInsane; +#endif + prTree->m_dEdgeLength1[uNodeIndex] = dInsane; + prTree->m_dEdgeLength2[uNodeIndex] = dInsane; + prTree->m_dEdgeLength3[uNodeIndex] = dInsane; + + prTree->m_ptrName[uNodeIndex] = NULL; + prTree->m_Ids[uNodeIndex] = uInsane; +} +/*** end: InitNode ***/ + + +/** + * + */ +void +InitCache(uint uCacheCount, tree_t *tree) +{ + uint uNodeIndex; + + tree->m_uCacheCount = uCacheCount; + + tree->m_uNeighbor1 = (uint *) CKMALLOC(sizeof(uint) * tree->m_uCacheCount); + tree->m_uNeighbor2 = (uint *) CKMALLOC(sizeof(uint) * tree->m_uCacheCount); + tree->m_uNeighbor3 = (uint *) CKMALLOC(sizeof(uint) * tree->m_uCacheCount); + + tree->m_Ids = (uint *) CKMALLOC(sizeof(uint) * tree->m_uCacheCount); + + tree->m_dEdgeLength1 = (double *) CKMALLOC(sizeof(double) * tree->m_uCacheCount); + tree->m_dEdgeLength2 = (double *) CKMALLOC(sizeof(double) * tree->m_uCacheCount); + tree->m_dEdgeLength3 = (double *) CKMALLOC(sizeof(double) * tree->m_uCacheCount); +#if USE_HEIGHT + tree->m_dHeight = (double *) CKMALLOC(sizeof(double) * tree->m_uCacheCount); + tree->m_bHasHeight = (bool *) CKMALLOC(sizeof(bool) * tree->m_uCacheCount); +#endif + tree->m_bHasEdgeLength1 = (bool *) CKMALLOC(sizeof(bool) * tree->m_uCacheCount); + tree->m_bHasEdgeLength2 = (bool *) CKMALLOC(sizeof(bool) * tree->m_uCacheCount); + tree->m_bHasEdgeLength3 = (bool *) CKMALLOC(sizeof(bool) * tree->m_uCacheCount); + + tree->m_ptrName = (char **) CKMALLOC(sizeof(char *) * tree->m_uCacheCount); + + for (uNodeIndex = 0; uNodeIndex < tree->m_uNodeCount; ++uNodeIndex) { + InitNode(tree, uNodeIndex); + } +} +/*** end: InitCache ***/ + + + + +/** + * + * @note Replacing Tree::Clear but no freeing of memory! Just setting + * everything to 0/NULL + */ +void +TreeZero(tree_t *tree) +{ + assert(NULL != tree); + tree->m_uNodeCount = 0; + tree->m_uCacheCount = 0; + + tree->m_uNeighbor1 = NULL; + tree->m_uNeighbor2 = NULL; + tree->m_uNeighbor3 = NULL; + + tree->m_dEdgeLength1 = NULL; + tree->m_dEdgeLength2 = NULL; + tree->m_dEdgeLength3 = NULL; + +#if USE_HEIGHT + tree->m_dHeight = NULL; + tree->m_bHasHeight = NULL; +#endif + tree->m_bHasEdgeLength1 = NULL; + tree->m_bHasEdgeLength2 = NULL; + tree->m_bHasEdgeLength3 = NULL; + + tree->m_ptrName = NULL; + tree->m_Ids = NULL; + + tree->m_bRooted = FALSE; + tree->m_uRootNodeIndex = 0; +} +/* end: TreeZero */ + + + +/** + * + */ +void +TreeToFileNodeRooted(tree_t *tree, uint uNodeIndex, FILE *fp) +{ + bool bGroup; + + assert(IsRooted(tree)); + assert(NULL != tree); + bGroup = !IsLeaf(uNodeIndex, tree) || IsRoot(uNodeIndex, tree); + + if (bGroup) + fprintf(fp, "(\n"); + + + if (IsLeaf(uNodeIndex, tree)) { + /* File.PutString(GetName(uNodeIndex)); */ + fprintf(fp, "%s", tree->m_ptrName[uNodeIndex]); + } else { + TreeToFileNodeRooted(tree, GetLeft(uNodeIndex, tree), fp); + fprintf(fp, ",\n"); + TreeToFileNodeRooted(tree, GetRight(uNodeIndex, tree), fp); + } + + if (bGroup) + fprintf(fp, ")"); + + if (!IsRoot(uNodeIndex, tree)) { + uint uParent = GetParent(uNodeIndex, tree); + if (HasEdgeLength(uNodeIndex, uParent, tree)) + fprintf(fp, ":%g", GetEdgeLength(uNodeIndex, uParent, tree)); + } + fprintf(fp, "\n"); +} +/*** end: TreeToFileNodeRooted ***/ + + +/** + * + * + */ +void +TreeValidate(tree_t *tree) +{ + uint uNodeIndex; + assert(NULL != tree); + for (uNodeIndex = 0; uNodeIndex < tree->m_uNodeCount; ++uNodeIndex) { + ValidateNode(uNodeIndex, tree); + } + /* FIXME: maybe set negative length to zero? What impact would + * that have? */ +} +/*** end TreeValidate ***/ + + + +/** + * + * + */ +void +ValidateNode(uint uNodeIndex, tree_t *tree) +{ + uint uNeighborCount; + uint n1, n2, n3; + assert(NULL != tree); + + if (uNodeIndex >= tree->m_uNodeCount) + Log(&rLog, LOG_FATAL, "ValidateNode(%u), %u nodes", uNodeIndex, tree->m_uNodeCount); + + uNeighborCount = GetNeighborCount(uNodeIndex, tree); + + + if (2 == uNeighborCount) { + if (!tree->m_bRooted) { + Log(&rLog, LOG_FATAL, "Tree::ValidateNode: Node %u has two neighbors, tree is not rooted", + uNodeIndex); + } + if (uNodeIndex != tree->m_uRootNodeIndex) { + Log(&rLog, LOG_FATAL, "Tree::ValidateNode: Node %u has two neighbors, but not root node=%u", + uNodeIndex, tree->m_uRootNodeIndex); + } + } + + n1 = tree->m_uNeighbor1[uNodeIndex]; + n2 = tree->m_uNeighbor2[uNodeIndex]; + n3 = tree->m_uNeighbor3[uNodeIndex]; + + if (NULL_NEIGHBOR == n2 && NULL_NEIGHBOR != n3) { + Log(&rLog, LOG_FATAL, "Tree::ValidateNode, n2=null, n3!=null", uNodeIndex); + } + if (NULL_NEIGHBOR == n3 && NULL_NEIGHBOR != n2) { + Log(&rLog, LOG_FATAL, "Tree::ValidateNode, n3=null, n2!=null", uNodeIndex); + } + + if (n1 != NULL_NEIGHBOR) + AssertAreNeighbors(uNodeIndex, n1, tree); + if (n2 != NULL_NEIGHBOR) + AssertAreNeighbors(uNodeIndex, n2, tree); + if (n3 != NULL_NEIGHBOR) + AssertAreNeighbors(uNodeIndex, n3, tree); + + + + if (n1 != NULL_NEIGHBOR && (n1 == n2 || n1 == n3)) { + Log(&rLog, LOG_FATAL, "Tree::ValidateNode, duplicate neighbors in node %u", uNodeIndex); + } + if (n2 != NULL_NEIGHBOR && (n2 == n1 || n2 == n3)) { + Log(&rLog, LOG_FATAL, "Tree::ValidateNode, duplicate neighbors in node %u", uNodeIndex); + } + if (n3 != NULL_NEIGHBOR && (n3 == n1 || n3 == n2)) { + Log(&rLog, LOG_FATAL, "Tree::ValidateNode, duplicate neighbors in node %u", uNodeIndex); + } + + + if (IsRooted(tree)) { + if (NULL_NEIGHBOR == GetParent(uNodeIndex, tree)) { + if (uNodeIndex != tree->m_uRootNodeIndex) { + Log(&rLog, LOG_FATAL, "Tree::ValiateNode(%u), no parent", uNodeIndex); + } + } else if (GetLeft(GetParent(uNodeIndex, tree), tree) != uNodeIndex && + GetRight(GetParent(uNodeIndex, tree), tree) != uNodeIndex) { + Log(&rLog, LOG_FATAL, "Tree::ValidateNode(%u), parent / child mismatch", uNodeIndex); + } + } +} +/*** end: ValidateNode ***/ + + +/** + * + * + */ +void +AssertAreNeighbors(unsigned uNodeIndex1, unsigned uNodeIndex2, tree_t *tree) +{ + bool Has12, Has21; + assert(NULL != tree); + + if (uNodeIndex1 >= tree->m_uNodeCount || uNodeIndex2 >= tree->m_uNodeCount) + Log(&rLog, LOG_FATAL, "AssertAreNeighbors(%u,%u), are %u nodes", + uNodeIndex1, uNodeIndex2, tree->m_uNodeCount); + + if (tree->m_uNeighbor1[uNodeIndex1] != uNodeIndex2 && + tree->m_uNeighbor2[uNodeIndex1] != uNodeIndex2 && + tree->m_uNeighbor3[uNodeIndex1] != uNodeIndex2) { + Log(&rLog, LOG_FATAL, "AssertAreNeighbors(%u,%u) failed", uNodeIndex1, uNodeIndex2); + } + + + if (tree->m_uNeighbor1[uNodeIndex2] != uNodeIndex1 && + tree->m_uNeighbor2[uNodeIndex2] != uNodeIndex1 && + tree->m_uNeighbor3[uNodeIndex2] != uNodeIndex1) { + Log(&rLog, LOG_FATAL, "AssertAreNeighbors(%u,%u) failed", uNodeIndex1, uNodeIndex2); + } + + + Has12 = HasEdgeLength(uNodeIndex1, uNodeIndex2, tree); + Has21 = HasEdgeLength(uNodeIndex2, uNodeIndex1, tree); + if (Has12 != Has21) { + HasEdgeLength(uNodeIndex1, uNodeIndex2, tree); + HasEdgeLength(uNodeIndex2, uNodeIndex1, tree); + Log(&rLog, LOG_ERROR, "HasEdgeLength(%u, %u)=%c HasEdgeLength(%u, %u)=%c\n", + uNodeIndex1, + uNodeIndex2, + Has12 ? 'T' : 'F', + uNodeIndex2, + uNodeIndex1, + Has21 ? 'T' : 'F'); + Log(&rLog, LOG_FATAL, "Tree::AssertAreNeighbors, HasEdgeLength not symmetric"); + } + + + if (Has12) { + double d12 = GetEdgeLength(uNodeIndex1, uNodeIndex2, tree); + double d21 = GetEdgeLength(uNodeIndex2, uNodeIndex1, tree); + if (d12 != d21) { + Log(&rLog, LOG_FATAL, "Tree::AssertAreNeighbors, Edge length disagrees %u-%u=%.3g, %u-%u=%.3g", + uNodeIndex1, uNodeIndex2, d12, + uNodeIndex2, uNodeIndex1, d21); + } + } +} +/*** end: AssertAreNeighbors ***/ + + + +/** + * + * @note see phyfromfile.cpp in Muscle3.7. Tree has to be a pointer to + * an already allocated tree structure. + * + * return non-Zero on failure + * + * leafids will not be set here (FIXME:CHECK if true) + */ +int +MuscleTreeFromFile(tree_t *tree, char *ftree) +{ + double dEdgeLength; + bool bEdgeLength; + char szToken[16]; + NEWICK_TOKEN_TYPE NTT; + unsigned uThirdNode; + FILE *fp = NULL; + + assert(tree!=NULL); + assert(ftree!=NULL); + + if (NULL == (fp=fopen(ftree, "r"))) { + Log(&rLog, LOG_ERROR, "Couldn't open tree-file '%s' for reading. Skipping", ftree); + return -1; + } + + /* Assume rooted. + * If we discover that it is unrooted, will convert on the fly. + */ + TreeCreateRooted(tree); + + bEdgeLength = GetGroupFromFile(fp, 0, &dEdgeLength, tree); + + + /* Next token should be either ';' for rooted tree or ',' for + * unrooted. + */ + NTT = GetToken(fp, szToken, sizeof(szToken)); + + /* If rooted, all done. */ + if (NTT_Semicolon == NTT) { + if (bEdgeLength) + Log(&rLog, LOG_WARN, " *** Warning *** edge length on root group in Newick file %s\n", ftree); + TreeValidate(tree); + fclose(fp); + return 0; + } + + if (NTT_Comma != NTT) + Log(&rLog, LOG_FATAL, "Tree::FromFile, expected ';' or ',', got '%s'", szToken); + + uThirdNode = UnrootFromFile(tree); + bEdgeLength = GetGroupFromFile(fp, uThirdNode, &dEdgeLength, tree); + if (bEdgeLength) + SetEdgeLength(0, uThirdNode, dEdgeLength, tree); + TreeValidate(tree); + + fclose(fp); + return 0; +} +/*** end MuscleTreeFromFile ***/ + + + +/** + * + */ +void +ExpandCache(tree_t *tree) +{ + const uint uNodeCount = 100; + uint uNewCacheCount; + uint *uNewNeighbor1, *uNewNeighbor2, *uNewNeighbor3; + uint *uNewIds; + double *dNewEdgeLength1, *dNewEdgeLength2, *dNewEdgeLength3; +#if USE_HEIGHT + double *dNewHeight; + bool *bNewHasHeight; +#endif + bool *bNewHasEdgeLength1, *bNewHasEdgeLength2, *bNewHasEdgeLength3; + char **ptrNewName; + + assert(NULL != tree); + uNewCacheCount = tree->m_uCacheCount + uNodeCount; + uNewNeighbor1 = (uint *) CKMALLOC( + uNewCacheCount * sizeof(uint)); + uNewNeighbor2 = (uint *) CKMALLOC( + uNewCacheCount * sizeof(uint)); + uNewNeighbor3 = (uint *) CKMALLOC( + uNewCacheCount * sizeof(uint)); + + uNewIds = (uint *) CKCALLOC( + uNewCacheCount, sizeof(uint)); + + dNewEdgeLength1 = (double *) CKMALLOC( + uNewCacheCount * sizeof(double)); + dNewEdgeLength2 = (double *) CKMALLOC( + uNewCacheCount * sizeof(double)); + dNewEdgeLength3 = (double *) CKMALLOC( + uNewCacheCount * sizeof(double)); +#if USE_HEIGHT + dNewHeight = (double *) CKMALLOC( + uNewCacheCount * sizeof(double)); + bNewHasHeight = (bool *) CKMALLOC( + uNewCacheCount * sizeof(bool)); +#endif + + bNewHasEdgeLength1 = (bool *) CKMALLOC( + uNewCacheCount * sizeof(bool)); + bNewHasEdgeLength2 = (bool *) CKMALLOC( + uNewCacheCount * sizeof(bool)); + bNewHasEdgeLength3 = (bool *) CKMALLOC( + uNewCacheCount * sizeof(bool)); + ptrNewName = (char **) CKCALLOC(uNewCacheCount, sizeof(char*)); + + if (tree->m_uCacheCount > 0) { + uint uUnsignedBytes, uEdgeBytes; + uint uBoolBytes, uNameBytes; + + uUnsignedBytes = tree->m_uCacheCount*sizeof(uint); + + memcpy(uNewNeighbor1, tree->m_uNeighbor1, uUnsignedBytes); + memcpy(uNewNeighbor2, tree->m_uNeighbor2, uUnsignedBytes); + memcpy(uNewNeighbor3, tree->m_uNeighbor3, uUnsignedBytes); + + memcpy(uNewIds, tree->m_Ids, uUnsignedBytes); + + uEdgeBytes = tree->m_uCacheCount*sizeof(double); + memcpy(dNewEdgeLength1, tree->m_dEdgeLength1, uEdgeBytes); + memcpy(dNewEdgeLength2, tree->m_dEdgeLength2, uEdgeBytes); + memcpy(dNewEdgeLength3, tree->m_dEdgeLength3, uEdgeBytes); +#if USE_HEIGHT + memcpy(dNewHeight, tree->m_dHeight, uEdgeBytes); +#endif + + uBoolBytes = tree->m_uCacheCount*sizeof(bool); + memcpy(bNewHasEdgeLength1, tree->m_bHasEdgeLength1, uBoolBytes); + memcpy(bNewHasEdgeLength2, tree->m_bHasEdgeLength2, uBoolBytes); + memcpy(bNewHasEdgeLength3, tree->m_bHasEdgeLength3, uBoolBytes); +#if USE_HEIGHT + memcpy(bNewHasHeight, tree->m_bHasHeight, uBoolBytes); +#endif + uNameBytes = tree->m_uCacheCount*sizeof(char *); + memcpy(ptrNewName, tree->m_ptrName, uNameBytes); + + /* similiar to FreeMuscleTree + */ + + /* IsLeaf needs m_uNodeCount and all m_uNeighbor's + * so free first + */ +#if 0 + for (i=0; i<tree->m_uNodeCount; i++) { + if (IsLeaf(i, tree)) { +#ifndef NDEBUG + if (NULL==tree->m_ptrName[i]) { + Log(&rLog, LOG_WARN, "FIXME tree->m_ptrName[%d] is already NULL", i); + } +#endif + CKFREE(tree->m_ptrName[i]); + } + } +#endif + CKFREE(tree->m_ptrName); + + CKFREE(tree->m_uNeighbor1); + CKFREE(tree->m_uNeighbor2); + CKFREE(tree->m_uNeighbor3); + + CKFREE(tree->m_Ids); + + CKFREE(tree->m_dEdgeLength1); + CKFREE(tree->m_dEdgeLength2); + CKFREE(tree->m_dEdgeLength3); + + CKFREE(tree->m_bHasEdgeLength1); + CKFREE(tree->m_bHasEdgeLength2); + CKFREE(tree->m_bHasEdgeLength3); +#if USE_HEIGHT + CKFREE(tree->m_bHasHeight); + CKFREE(tree->m_dHeight); +#endif + } + + tree->m_uCacheCount = uNewCacheCount; + tree->m_uNeighbor1 = uNewNeighbor1; + tree->m_uNeighbor2 = uNewNeighbor2; + tree->m_uNeighbor3 = uNewNeighbor3; + tree->m_Ids = uNewIds; + tree->m_dEdgeLength1 = dNewEdgeLength1; + tree->m_dEdgeLength2 = dNewEdgeLength2; + tree->m_dEdgeLength3 = dNewEdgeLength3; + +#ifdef USE_HEIGHT + tree->m_dHeight = dNewHeight; + tree->m_bHasHeight = bNewHasHeight; +#endif + tree->m_bHasEdgeLength1 = bNewHasEdgeLength1; + tree->m_bHasEdgeLength2 = bNewHasEdgeLength2; + tree->m_bHasEdgeLength3 = bNewHasEdgeLength3; + + tree->m_ptrName = ptrNewName; + +} +/*** end: ExpandCache ***/ + + + +/** + * + * Tree must be pointer to an already allocated tree structure + * + */ +void +TreeCreateRooted(tree_t *tree) +{ + TreeZero(tree); + ExpandCache(tree); + tree->m_uNodeCount = 1; + + tree->m_uNeighbor1[0] = NULL_NEIGHBOR; + tree->m_uNeighbor2[0] = NULL_NEIGHBOR; + tree->m_uNeighbor3[0] = NULL_NEIGHBOR; + + tree->m_bHasEdgeLength1[0] = FALSE; + tree->m_bHasEdgeLength2[0] = FALSE; + tree->m_bHasEdgeLength3[0] = FALSE; +#if USE_HEIGHT + tree->m_bHasHeight[0] = FALSE; +#endif + + tree->m_uRootNodeIndex = 0; + tree->m_bRooted = TRUE; + +#ifndef NDEBUG + TreeValidate(tree); +#endif +} +/*** end: TreeCreateRooted ***/ + + +/** + * + */ +uint +UnrootFromFile(tree_t *tree) +{ + uint uThirdNode; +#if TRACE + Log("Before unroot:\n"); + LogMe(); +#endif + + if (!tree->m_bRooted) + Log(&rLog, LOG_FATAL, "Tree::Unroot, not rooted"); + + /* Convention: root node is always node zero */ + assert(IsRoot(0, tree)); + assert(NULL_NEIGHBOR == tree->m_uNeighbor1[0]); + + uThirdNode = tree->m_uNodeCount++; + + tree->m_uNeighbor1[0] = uThirdNode; + tree->m_uNeighbor1[uThirdNode] = 0; + + tree->m_uNeighbor2[uThirdNode] = NULL_NEIGHBOR; + tree->m_uNeighbor3[uThirdNode] = NULL_NEIGHBOR; + + tree->m_dEdgeLength1[0] = 0; + tree->m_dEdgeLength1[uThirdNode] = 0; + tree->m_bHasEdgeLength1[uThirdNode] = TRUE; + + tree->m_bRooted = FALSE; + +#if TRACE + Log("After unroot:\n"); + LogMe(); +#endif + + return uThirdNode; +} +/*** end: UnrootFromFile ***/ + + + +/** + * + * + */ +bool +GetGroupFromFile(FILE *fp, uint uNodeIndex, double *ptrdEdgeLength, tree_t *tree) +{ + char szToken[1024]; + NEWICK_TOKEN_TYPE NTT = GetToken(fp, szToken, sizeof(szToken)); + bool bRightLength; + bool bEof; + char c; + + /* Group is either leaf name or (left, right). */ + if (NTT_String == NTT) { + SetLeafName(uNodeIndex, szToken, tree); +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Group is leaf '%s'", szToken); +#endif + } else if (NTT_Lparen == NTT) { + const unsigned uLeft = AppendBranch(tree, uNodeIndex); + const unsigned uRight = uLeft + 1; + double dEdgeLength; + bool bLeftLength = GetGroupFromFile(fp, uLeft, &dEdgeLength, tree); + + /* Left sub-group... + */ +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Got '(', group is compound, expect left sub-group"); + + if (bLeftLength) { + Log(&rLog, LOG_FORCED_DEBUG, "Edge length for left sub-group: %.3g", dEdgeLength); + } else { + Log(&rLog, LOG_FORCED_DEBUG, "%s", "No edge length for left sub-group"); + } +#endif + if (bLeftLength) + SetEdgeLength(uNodeIndex, uLeft, dEdgeLength, tree); + + /* ... then comma ... + */ +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Expect comma"); +#endif + NTT = GetToken(fp, szToken, sizeof(szToken)); + if (NTT_Comma != NTT) + Log(&rLog, LOG_FATAL, "Tree::GetGroupFromFile, expected ',', got '%s'", szToken); + + /* ...then right sub-group... + */ +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Expect right sub-group"); +#endif + bRightLength = GetGroupFromFile(fp, uRight, &dEdgeLength, tree); + if (bRightLength) + SetEdgeLength(uNodeIndex, uRight, dEdgeLength, tree); + +#if TRACE + if (bRightLength) + Log(&rLog, LOG_FORCED_DEBUG, "Edge length for right sub-group: %.3g", dEdgeLength); + else + Log(&rLog, LOG_FORCED_DEBUG, "%s", "No edge length for right sub-group"); +#endif + + /* ... then closing parenthesis. + */ +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Expect closing parenthesis (or comma if > 2-ary)"); +#endif + NTT = GetToken(fp, szToken, sizeof(szToken)); + if (NTT_Rparen == NTT) + ; + else if (NTT_Comma == NTT) { + if (ungetc(',', fp)==EOF) + Log(&rLog, LOG_FATAL, "%s" "ungetc failed"); + return FALSE; + } else + Log(&rLog, LOG_FATAL, "Tree::GetGroupFromFile, expected ')' or ',', got '%s'", szToken); + } else { + Log(&rLog, LOG_FATAL, "Tree::GetGroupFromFile, expected '(' or leaf name, got '%s'", + szToken); + } + + /* Group may optionally be followed by edge length. + */ + bEof = FileSkipWhiteX(fp); + if (bEof) + return FALSE; + if ((c = fgetc(fp))==EOF) /* GetCharX */ + Log(&rLog, LOG_FATAL, "%s", "fgetc reached end of file"); +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Character following group, could be colon, is '%c'", c); +#endif + if (':' == c) { + NTT = GetToken(fp, szToken, sizeof(szToken)); + if (NTT_String != NTT) + Log(&rLog, LOG_FATAL, "Tree::GetGroupFromFile, expected edge length, got '%s'", szToken); + *ptrdEdgeLength = atof(szToken); + return TRUE; + } + if (ungetc(c, fp)==EOF) + Log(&rLog, LOG_FATAL, "%s" "ungetc failed"); + + return FALSE; +} +/*** end: GetGroupFromFile ***/ + + + + +/** + * + */ +void +FileSkipWhite(FILE *fp) +{ + bool bEof = FileSkipWhiteX(fp); + if (bEof) + Log(&rLog, LOG_FATAL, "%s", "End-of-file skipping white space"); +} +/*** end: FileSkipWhite ***/ + + + + +/** + * + */ +bool +FileSkipWhiteX(FILE *fp) +{ + for (;;) { + int c; + bool bEof; + + /* GetChar */ + if ((c = fgetc(fp))==EOF) { + bEof = TRUE; + } else { + bEof = FALSE; + } + + if (bEof) + return TRUE; + if (!isspace(c)) { + if (ungetc(c, fp)==EOF) + Log(&rLog, LOG_FATAL, "%s" "ungetc failed"); + break; + } + } + return FALSE; +} +/*** end: FileSkipWhiteX ***/ + + + + +/** + * + */ +NEWICK_TOKEN_TYPE +GetToken(FILE *fp, char szToken[], uint uBytes) +{ + char c; + unsigned uBytesCopied = 0; + NEWICK_TOKEN_TYPE TT; + + /* Skip leading white space */ + FileSkipWhite(fp); + + if ((c = fgetc(fp))==EOF) /* GetCharX */ + Log(&rLog, LOG_FATAL, "%s", "fgetc reached end of file"); + + /* In case a single-character token */ + szToken[0] = c; + szToken[1] = 0; + + switch (c) { + + case '(': + return NTT_Lparen; + + case ')': + return NTT_Rparen; + + case ':': + return NTT_Colon; + + case ';': + return NTT_Semicolon; + + case ',': + return NTT_Comma; + + case '\'': + TT = NTT_SingleQuotedString; + if ((c = fgetc(fp))==EOF) /* GetCharX */ + Log(&rLog, LOG_FATAL, "%s", "fgetc reached end of file"); + break; + + case '"': + TT = NTT_DoubleQuotedString; + if ((c = fgetc(fp))==EOF) /* GetCharX */ + Log(&rLog, LOG_FATAL, "%s", "fgetc reached end of file"); + break; + + case '[': + TT = NTT_Comment; + break; + + default: + TT = NTT_String; + break; + } + + for (;;) + { + bool bEof; + if (TT != NTT_Comment) { + if (uBytesCopied < uBytes - 2) { + szToken[uBytesCopied++] = c; + szToken[uBytesCopied] = 0; + } else { + Log(&rLog, LOG_FATAL, "Tree::GetToken: input buffer too small, token so far='%s'", szToken); + } + } + c = fgetc(fp); /* GetChar */ + bEof = (c==EOF ? TRUE : FALSE); + if (bEof) + return TT; + + switch (TT) { + + case NTT_String: + if (0 != strchr("():;,", c)) { + if (ungetc(c, fp)==EOF) + Log(&rLog, LOG_FATAL, "%s" "ungetc failed"); + return NTT_String; + } + if (isspace(c)) + return NTT_String; + break; + + case NTT_SingleQuotedString: + if ('\'' == c) + return NTT_String; + break; + + case NTT_DoubleQuotedString: + if ('"' == c) + return NTT_String; + break; + + case NTT_Comment: + if (']' == c) + return GetToken(fp, szToken, uBytes); + break; + + default: + Log(&rLog, LOG_FATAL, "Tree::GetToken, invalid TT=%u", TT); + } + } +} +/*** end: GetToken ***/ + + + +/*** SetLeafName + * + */ +void +SetLeafName(unsigned uNodeIndex, const char *ptrName, tree_t *tree) +{ + assert(uNodeIndex < tree->m_uNodeCount); + assert(IsLeaf(uNodeIndex, tree)); + free(tree->m_ptrName[uNodeIndex]); + /*LOG_DEBUG("Setting tree->m_ptrName[uNodeIndex=%d] to %s", uNodeIndex, ptrName);*/ + tree->m_ptrName[uNodeIndex] = CkStrdup(ptrName); +} +/*** end: SetLeafName ***/ + + + + +/** + * + * Append a new branch. This adds two new nodes and joins them to an + * existing leaf node. Return value is k, new nodes have indexes k and + * k+1 respectively. + * + */ +uint +AppendBranch(tree_t *tree, uint uExistingLeafIndex) +{ + uint uNewLeaf1; + uint uNewLeaf2; + + assert(tree!=NULL); + if (0 == tree->m_uNodeCount) { + Log(&rLog, LOG_FATAL, "%s(): %s", __FUNCTION__, "tree has not been created"); + } + assert(NULL_NEIGHBOR == tree->m_uNeighbor2[uExistingLeafIndex]); + assert(NULL_NEIGHBOR == tree->m_uNeighbor3[uExistingLeafIndex]); + assert(uExistingLeafIndex < tree->m_uNodeCount); +#ifndef NDEBUG + if (!IsLeaf(uExistingLeafIndex, tree)) { + Log(&rLog, LOG_FATAL, "AppendBranch(%u): not leaf", uExistingLeafIndex); + } +#endif + + if (tree->m_uNodeCount >= tree->m_uCacheCount - 2) { + ExpandCache(tree); + } + uNewLeaf1 = tree->m_uNodeCount; + uNewLeaf2 = tree->m_uNodeCount + 1; + + tree->m_uNodeCount += 2; + + tree->m_uNeighbor2[uExistingLeafIndex] = uNewLeaf1; + tree->m_uNeighbor3[uExistingLeafIndex] = uNewLeaf2; + + tree->m_uNeighbor1[uNewLeaf1] = uExistingLeafIndex; + tree->m_uNeighbor1[uNewLeaf2] = uExistingLeafIndex; + + tree->m_uNeighbor2[uNewLeaf1] = NULL_NEIGHBOR; + tree->m_uNeighbor2[uNewLeaf2] = NULL_NEIGHBOR; + + tree->m_uNeighbor3[uNewLeaf1] = NULL_NEIGHBOR; + tree->m_uNeighbor3[uNewLeaf2] = NULL_NEIGHBOR; + + tree->m_dEdgeLength2[uExistingLeafIndex] = 0; + tree->m_dEdgeLength3[uExistingLeafIndex] = 0; + + tree->m_dEdgeLength1[uNewLeaf1] = 0; + tree->m_dEdgeLength2[uNewLeaf1] = 0; + tree->m_dEdgeLength3[uNewLeaf1] = 0; + + tree->m_dEdgeLength1[uNewLeaf2] = 0; + tree->m_dEdgeLength2[uNewLeaf2] = 0; + tree->m_dEdgeLength3[uNewLeaf2] = 0; + + tree->m_bHasEdgeLength1[uNewLeaf1] = FALSE; + tree->m_bHasEdgeLength2[uNewLeaf1] = FALSE; + tree->m_bHasEdgeLength3[uNewLeaf1] = FALSE; + + tree->m_bHasEdgeLength1[uNewLeaf2] = FALSE; + tree->m_bHasEdgeLength2[uNewLeaf2] = FALSE; + tree->m_bHasEdgeLength3[uNewLeaf2] = FALSE; + +#if USE_HEIGHT + tree->m_bHasHeight[uNewLeaf1] = FALSE; + tree->m_bHasHeight[uNewLeaf2] = FALSE; +#endif + tree->m_Ids[uNewLeaf1] = uInsane; + tree->m_Ids[uNewLeaf2] = uInsane; + + return uNewLeaf1; +} +/*** end: AppendBranch ***/ + + +/** + * + * + */ +void +SetEdgeLength(uint uNodeIndex1, uint uNodeIndex2, + double dLength, tree_t *tree) +{ + assert(uNodeIndex1 < tree->m_uNodeCount && uNodeIndex2 < tree->m_uNodeCount); + assert(IsEdge(uNodeIndex1, uNodeIndex2, tree)); + + if (tree->m_uNeighbor1[uNodeIndex1] == uNodeIndex2) { + tree->m_dEdgeLength1[uNodeIndex1] = dLength; + tree->m_bHasEdgeLength1[uNodeIndex1] = TRUE; + } else if (tree->m_uNeighbor2[uNodeIndex1] == uNodeIndex2) { + tree->m_dEdgeLength2[uNodeIndex1] = dLength; + tree->m_bHasEdgeLength2[uNodeIndex1] = TRUE; + + } else { + assert(tree->m_uNeighbor3[uNodeIndex1] == uNodeIndex2); + tree->m_dEdgeLength3[uNodeIndex1] = dLength; + tree->m_bHasEdgeLength3[uNodeIndex1] = TRUE; + } + + if (tree->m_uNeighbor1[uNodeIndex2] == uNodeIndex1) { + tree->m_dEdgeLength1[uNodeIndex2] = dLength; + tree->m_bHasEdgeLength1[uNodeIndex2] = TRUE; + } else if (tree->m_uNeighbor2[uNodeIndex2] == uNodeIndex1) { + tree->m_dEdgeLength2[uNodeIndex2] = dLength; + tree->m_bHasEdgeLength2[uNodeIndex2] = TRUE; + } else { + assert(tree->m_uNeighbor3[uNodeIndex2] == uNodeIndex1); + tree->m_dEdgeLength3[uNodeIndex2] = dLength; + tree->m_bHasEdgeLength3[uNodeIndex2] = TRUE; + } +} +/*** end: SetEdgeLength ***/ + + + +/** + * + * Debug output + * + * LogMe in phy.cpp + * + */ +void +LogTree(tree_t *tree, FILE *fp) +{ + uint uNodeIndex; + uint n1, n2, n3; + char *ptrName; + + fprintf(fp, "This is a tree with %u nodes, which is ", tree->m_uNodeCount); + + if (IsRooted(tree)) { + fprintf(fp, "rooted:\n"); + fprintf(fp, "Index Parnt LengthP Left LengthL Right LengthR Id Name\n"); + fprintf(fp, "----- ----- ------- ---- ------- ----- ------- ----- ----\n"); + + } else { + fprintf(fp, "unrooted;\n"); + fprintf(fp, "Index Nbr_1 Length1 Nbr_2 Length2 Nbr_3 Length3 Id Name\n"); + fprintf(fp, "----- ----- ------- ----- ------- ----- ------- ----- ----\n"); + } + + for (uNodeIndex = 0; uNodeIndex < tree->m_uNodeCount; ++uNodeIndex) { + fprintf(fp, "%5u ", uNodeIndex); + n1 = tree->m_uNeighbor1[uNodeIndex]; + n2 = tree->m_uNeighbor2[uNodeIndex]; + n3 = tree->m_uNeighbor3[uNodeIndex]; + + if (NULL_NEIGHBOR != n1) { + fprintf(fp, "%5u ", n1); + if (tree->m_bHasEdgeLength1[uNodeIndex]) + fprintf(fp, "%7.3g ", tree->m_dEdgeLength1[uNodeIndex]); + else + fprintf(fp, " * "); + } else { + fprintf(fp, " "); + } + + if (NULL_NEIGHBOR != n2) { + fprintf(fp, "%5u ", n2); + if (tree->m_bHasEdgeLength2[uNodeIndex]) + fprintf(fp, "%7.3g ", tree->m_dEdgeLength2[uNodeIndex]); + else + fprintf(fp, " * "); + } else { + fprintf(fp, " "); + } + + if (NULL_NEIGHBOR != n3) { + fprintf(fp, "%5u ", n3); + if (tree->m_bHasEdgeLength3[uNodeIndex]) + fprintf(fp, "%7.3g ", tree->m_dEdgeLength3[uNodeIndex]); + else + fprintf(fp, " * "); + } else { + fprintf(fp, " "); + } + + if (tree->m_Ids != 0 && IsLeaf(uNodeIndex, tree)) { + unsigned uId = tree->m_Ids[uNodeIndex]; + if (uId == uInsane) + fprintf(fp, " *"); + else + fprintf(fp, "%5u", uId); + } else { + fprintf(fp, " "); + } + + if (tree->m_bRooted && uNodeIndex == tree->m_uRootNodeIndex) + fprintf(fp, " [ROOT] "); + ptrName = tree->m_ptrName[uNodeIndex]; + if (ptrName != 0) + fprintf(fp, " %s", ptrName); + + fprintf(fp, "\n"); + } +} +/*** end: LogTree ***/ + + + +/** + * + * replaces m_uLeafCount + */ +uint +GetLeafCount(tree_t *tree) +{ + assert(tree!=NULL); + + return (tree->m_uNodeCount+1)/2; +} +/*** GetLeafCount ***/ + + + +/** + * + */ +uint +GetNodeCount(tree_t *tree) +{ + assert(tree!=NULL); + + return 2*(GetLeafCount(tree)) - 1; +} +/*** end: GetNodeCount ***/ + + +/** + * + */ +uint +GetNeighbor(uint uNodeIndex, uint uNeighborSubscript, tree_t *prTree) +{ + assert(uNodeIndex < prTree->m_uNodeCount); + switch (uNeighborSubscript) + { + case 0: + return prTree->m_uNeighbor1[uNodeIndex]; + case 1: + return prTree->m_uNeighbor2[uNodeIndex]; + case 2: + return prTree->m_uNeighbor3[uNodeIndex]; + } + Log(&rLog, LOG_FATAL, "Internal error in %s: sub=%u", __FUNCTION__, uNeighborSubscript); + return NULL_NEIGHBOR; +} +/*** end: GetNeighbor ***/ + + + + + +/** + * + */ +void +SetLeafId(tree_t *tree, uint uNodeIndex, uint uId) +{ + assert(uNodeIndex < tree->m_uNodeCount); + assert(IsLeaf(uNodeIndex, tree)); + tree->m_Ids[uNodeIndex] = uId; +} +/*** end: SetLeafId ***/ + + +/** + * + */ +uint +GetRootNodeIndex(tree_t *tree) +{ + assert(NULL!=tree); + return tree->m_uRootNodeIndex; +} +/*** end: GetRootNodeIndex ***/ + + + +/** + * @note avoid usage if you want to iterate over all indices, because + * this will be slow + * + */ +uint +LeafIndexToNodeIndex(uint uLeafIndex, tree_t *prTree) { + uint uLeafCount = 0; + unsigned uNodeCount = GetNodeCount(prTree); + uint uNodeIndex; + + for (uNodeIndex = 0; uNodeIndex < uNodeCount; uNodeIndex++) { + if (IsLeaf(uNodeIndex, prTree)) { + if (uLeafCount == uLeafIndex) { + return uNodeIndex; + } else { + uLeafCount++; + } + } + } + Log(&rLog, LOG_FATAL, "Internal error: node index out of range"); + return 0; +} +/*** end: LeafIndexToNodeIndex ***/ + + + + +/** + * @brief Append a (source) tree to a (dest) tree to a given node + * which will be replaced. All other nodes in that tree will stay the + * same. + * + * @param[out] prDstTree + * The tree to append to + * @param[in] uDstTreeReplaceNodeIndex + * Dest tree node to which source tree will be appended + * @param[in] prSrcTree + * The tree to append + * + * @note No nodes inside prDstTree will change except + * uDstTreeReplaceNodeIndex + * + * + * @warning: Function won't check or touch the m_Ids/leaf-indices! + * That means if you want to join two trees with leaf indices 1-10 and + * 1-10 your m_Ids/leaf-indices won't be unique anymore and the + * association between your sequences and the tree are broken. Make + * sure m_Ids are unique before calling me. + * + * The easiest would have been to do this by recursively calling + * AppendBranch() (after adding uSrcTreeNodeIndex as extra argument to + * this function). But recursion is evil. Yet another version would be + * to setup all the data and call MuscleTreeCreate() to create a third + * tree, which seems complicated and wasteful. The approach taken here + * is the following: increase dest tree memory, copy over each src + * tree node data and update the indices and counters. This is tricky + * and has a lot of potential for bugs if tree interface is changed + * (and even if it isn't). + * + */ +void +AppendTree(tree_t *prDstTree, uint uDstTreeReplaceNodeIndex, tree_t *prSrcTree) +{ + uint uSrcTreeNodeIndex; + uint uOrgDstTreeNodeCount; + + assert(NULL!=prDstTree); + assert(NULL!=prSrcTree); + assert(uDstTreeReplaceNodeIndex < prDstTree->m_uNodeCount); + assert(IsLeaf(uDstTreeReplaceNodeIndex, prDstTree)); + assert(IsRooted(prDstTree) && IsRooted(prSrcTree)); + + + uOrgDstTreeNodeCount = prDstTree->m_uNodeCount; + + + /* increase dest tree memory + */ + while (prDstTree->m_uCacheCount + < + (GetNodeCount(prDstTree) + GetNodeCount(prSrcTree))) { + ExpandCache(prDstTree); + } + + + /* copy all src tree nodes + * + */ + for (uSrcTreeNodeIndex=0; + uSrcTreeNodeIndex<GetNodeCount(prSrcTree); uSrcTreeNodeIndex++) { + uint uNewDstNodeIndex = prDstTree->m_uNodeCount; + + /* distinguish 4 cases for src nodes to copy: + * + * 1. src node is the only node, i.e. root & leaf + * + * 2. src node is root: set only left & right, but not parent + * and just replace the given dest index + * + * 3. src node is leaf: set only parent + * + * 4. src node is internal node: update all three neighbours + * + * FIXME: this is messy. Is there a cleaner way to do this by + * merging all cases? + * + */ + if (IsRoot(uSrcTreeNodeIndex, prSrcTree) && IsLeaf(uSrcTreeNodeIndex, prSrcTree)) { + /* special case: if this is the only member in + * tree, i.e. it's root and leaf. Copy leaf name and leaf + * id. No neighbours to update + */ + + /* free dst node name if set */ + if (NULL != prDstTree->m_ptrName[uDstTreeReplaceNodeIndex]) { + CKFREE(prDstTree->m_ptrName[uDstTreeReplaceNodeIndex]); + } + + prDstTree->m_ptrName[uDstTreeReplaceNodeIndex] = + CkStrdup(GetLeafName(uSrcTreeNodeIndex, prSrcTree)); + + prDstTree->m_Ids[uDstTreeReplaceNodeIndex] = + prSrcTree->m_Ids[uSrcTreeNodeIndex]; + + /* no updated of uNodeCount, because we used the replace node */ + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Updated dst rpl node %d with the only src leaf node: parent=%d (%f)", + uDstTreeReplaceNodeIndex, + prDstTree->m_uNeighbor1[uDstTreeReplaceNodeIndex], prDstTree->m_dEdgeLength1[uDstTreeReplaceNodeIndex]); +#endif + + } else if (IsRoot(uSrcTreeNodeIndex, prSrcTree)) { + /* src node is root: replace uDstTreeReplaceNodeIndex + * (not uNewDstNodeIndex) with src root, i.e. the + * uDstTreeReplaceNodeIndex becomes an internal node now. + * + * We only have two neighbours 2 & 3 (no parent). Keep old + * parent info (neighbor 1). + */ + + /* free dst node name if set */ + if (NULL != prDstTree->m_ptrName[uDstTreeReplaceNodeIndex]) { + CKFREE(prDstTree->m_ptrName[uDstTreeReplaceNodeIndex]); + } + + prDstTree->m_uNeighbor2[uDstTreeReplaceNodeIndex] = + prSrcTree->m_uNeighbor2[uSrcTreeNodeIndex] + uOrgDstTreeNodeCount; + prDstTree->m_uNeighbor3[uDstTreeReplaceNodeIndex] = + prSrcTree->m_uNeighbor3[uSrcTreeNodeIndex] + uOrgDstTreeNodeCount; + + prDstTree->m_bHasEdgeLength2[uDstTreeReplaceNodeIndex] = + prSrcTree->m_bHasEdgeLength2[uSrcTreeNodeIndex]; + prDstTree->m_bHasEdgeLength3[uDstTreeReplaceNodeIndex] = + prSrcTree->m_bHasEdgeLength3[uSrcTreeNodeIndex]; + + prDstTree->m_dEdgeLength2[uDstTreeReplaceNodeIndex] = + prSrcTree->m_dEdgeLength2[uSrcTreeNodeIndex]; + prDstTree->m_dEdgeLength3[uDstTreeReplaceNodeIndex] = + prSrcTree->m_dEdgeLength3[uSrcTreeNodeIndex]; + + /* make Id invalid */ + prDstTree->m_Ids[uDstTreeReplaceNodeIndex] = uInsane; + + /* no updated of uNodeCount, because we used the replace node */ + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Updated dst rpl node %d with the src root node: (untouched) parent=%d (%f) left=%d (%f) right=%d (%f)", + uDstTreeReplaceNodeIndex, + prDstTree->m_uNeighbor1[uDstTreeReplaceNodeIndex], prDstTree->m_dEdgeLength1[uDstTreeReplaceNodeIndex], + prDstTree->m_uNeighbor2[uDstTreeReplaceNodeIndex], prDstTree->m_dEdgeLength2[uDstTreeReplaceNodeIndex], + prDstTree->m_uNeighbor3[uDstTreeReplaceNodeIndex], prDstTree->m_dEdgeLength3[uDstTreeReplaceNodeIndex]); +#endif + + } else if (IsLeaf(uSrcTreeNodeIndex, prSrcTree)) { + /* src node is a leaf, which means we only have one + * neighbour, and that is its parent, i.e. n1 + * + */ + + /* initialise/zero new node to default values + */ + InitNode(prDstTree, uNewDstNodeIndex); + + + /* update m_ptrName/leaf name + */ + prDstTree->m_ptrName[uNewDstNodeIndex] = + CkStrdup(GetLeafName(uSrcTreeNodeIndex, prSrcTree)); + + /* update parent node (beware of special case: parent was + src tree root */ + if (IsRoot(prSrcTree->m_uNeighbor1[uSrcTreeNodeIndex], prSrcTree)) { + prDstTree->m_uNeighbor1[uNewDstNodeIndex] = + uDstTreeReplaceNodeIndex; + } else { + prDstTree->m_uNeighbor1[uNewDstNodeIndex] = + prSrcTree->m_uNeighbor1[uSrcTreeNodeIndex] + uOrgDstTreeNodeCount; + } + + /* update edge length info to parent + */ + prDstTree->m_bHasEdgeLength1[uNewDstNodeIndex] = + prSrcTree->m_bHasEdgeLength1[uSrcTreeNodeIndex]; + prDstTree->m_dEdgeLength1[uNewDstNodeIndex] = + prSrcTree->m_dEdgeLength1[uSrcTreeNodeIndex]; + + /* update sequence/object id + */ + prDstTree->m_Ids[uNewDstNodeIndex] = + prSrcTree->m_Ids[uSrcTreeNodeIndex]; + + /* we used a new node so increase their count */ + prDstTree->m_uNodeCount += 1; + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Updated dst node %d with a src leaf node: parent=%d (%f)", + uNewDstNodeIndex, + prDstTree->m_uNeighbor1[uNewDstNodeIndex], prDstTree->m_dEdgeLength1[uNewDstNodeIndex]); +#endif + + } else { + /* src node is not root neither leaf, means we have an + * internal node. Update all neighbour info + * + */ + + /* initialise/zero node values to default values + */ + InitNode(prDstTree, uNewDstNodeIndex); + + /* update neigbours + */ + /* parent: special case if parent was src tree root */ + if (IsRoot(prSrcTree->m_uNeighbor1[uSrcTreeNodeIndex], prSrcTree)) { + prDstTree->m_uNeighbor1[uNewDstNodeIndex] = + uDstTreeReplaceNodeIndex; + } else { + prDstTree->m_uNeighbor1[uNewDstNodeIndex] = + prSrcTree->m_uNeighbor1[uSrcTreeNodeIndex] + uOrgDstTreeNodeCount; + } + /* left */ + prDstTree->m_uNeighbor2[uNewDstNodeIndex] = + prSrcTree->m_uNeighbor2[uSrcTreeNodeIndex] + uOrgDstTreeNodeCount; + /* right */ + prDstTree->m_uNeighbor3[uNewDstNodeIndex] = + prSrcTree->m_uNeighbor3[uSrcTreeNodeIndex] + uOrgDstTreeNodeCount; + + /* update edge length info + */ + /* parent */ + prDstTree->m_bHasEdgeLength1[uNewDstNodeIndex] = + prSrcTree->m_bHasEdgeLength1[uSrcTreeNodeIndex]; + prDstTree->m_dEdgeLength1[uNewDstNodeIndex] = + prSrcTree->m_dEdgeLength1[uSrcTreeNodeIndex]; + /* left */ + prDstTree->m_bHasEdgeLength2[uNewDstNodeIndex] = + prSrcTree->m_bHasEdgeLength2[uSrcTreeNodeIndex]; + prDstTree->m_dEdgeLength2[uNewDstNodeIndex] = + prSrcTree->m_dEdgeLength2[uSrcTreeNodeIndex]; + /* right */ + prDstTree->m_bHasEdgeLength3[uNewDstNodeIndex] = + prSrcTree->m_bHasEdgeLength3[uSrcTreeNodeIndex]; + prDstTree->m_dEdgeLength3[uNewDstNodeIndex] = + prSrcTree->m_dEdgeLength3[uSrcTreeNodeIndex]; + + /* we used a new node so increase their count */ + prDstTree->m_uNodeCount += 1; + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Updated dst node %d with an internal src node: parent=%d (%f) left=%d (%f) right=%d (%f)", + uNewDstNodeIndex, + prDstTree->m_uNeighbor1[uNewDstNodeIndex], prDstTree->m_dEdgeLength1[uNewDstNodeIndex], + prDstTree->m_uNeighbor2[uNewDstNodeIndex], prDstTree->m_dEdgeLength2[uNewDstNodeIndex], + prDstTree->m_uNeighbor3[uNewDstNodeIndex], prDstTree->m_dEdgeLength3[uNewDstNodeIndex]); +#endif + } + + } + /* end for each src tree node */ + + + /* + * m_uRootNodeIndex stays the same. + * + * No need to touch m_uCacheCount. + * + */ +#if USE_HEIGHT + Log(&rLog, LOG_FATAL, "Internal error: Height usage not implemented in %s", __FUNCTION__); +#endif + + +#ifndef NDEBUG + TreeValidate(prDstTree); +#endif + + return; +} +/*** end: AppendTree() ***/ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/muscle_tree.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,173 @@ +/* This a mix of tree functions and data-structures from + * Bob Edgar's Muscle (version 3.7) ported to pure C. + * + * Used files: phy.cpp, tree.h, phytofile.cpp and phyfromclust.cpp + * + * Muscle's code is public domain and so is this code here. + + * From http://www.drive5.com/muscle/license.htm: + * """ + * MUSCLE is public domain software + * + * The MUSCLE software, including object and source code and + * documentation, is hereby donated to the public domain. + * + * Disclaimer of warranty + * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * """ + * + */ + +/* + * RCS $Id: muscle_tree.h 230 2011-04-09 15:37:50Z andreas $ + */ + + +#ifndef CLUSTALO_MUSCLE_CLUSTALO_TREE_H +#define CLUSTALO_MUSCLE_CLUSTALO_TREE_H + +#include <stdio.h> +#include "util.h" + +#ifndef uint +/* limit use of uint (see coding_style_guideline.txt) */ +typedef unsigned int uint; +#endif + +static const uint NULL_NEIGHBOR = UINT_MAX; + +/** + * @brief guide-tree structure + * + * @note We kept the original variable names here, to make it easy to + * search through Muscle's source code. + * From phy.cpp: + * Node has 0 to 3 neighbors: + * 0 neighbors: singleton root + * 1 neighbor: leaf, neighbor is parent + * 2 neigbors: non-singleton root + * 3 neighbors: internal node (other than root) + * + * Minimal rooted tree is single node. + * Minimal unrooted tree is single edge. + * Leaf node always has nulls in neighbors 2 and 3, neighbor 1 is parent. + * When tree is rooted, neighbor 1=parent, 2=left, 3=right. + * + */ +typedef struct { + uint m_uNodeCount;/**< number of nodes */ + uint m_uCacheCount;/**< reserved memory */ + + uint *m_uNeighbor1;/**< parent node */ + uint *m_uNeighbor2;/**< left node */ + uint *m_uNeighbor3;/**< right node */ + + /* do we have edge lengths info stored (m_dEdgeLength[123]) */ + bool *m_bHasEdgeLength1; + bool *m_bHasEdgeLength2; + bool *m_bHasEdgeLength3; + + double *m_dEdgeLength1; + double *m_dEdgeLength2; + double *m_dEdgeLength3; + +#if USE_HEIGHT + /* unused in our version of the code. we might need it at some + * stage so keep it in here, but disable via USE_HEIGHT throughout + * the code */ + double *m_dHeight; + bool *m_bHasHeight; +#endif + + /** + * leaf labels. + * index range: 0 -- (m_uNodeCount+1)/2 + */ + char **m_ptrName; + + /** + * node id. + * index range: 0 -- m_uNodeCount + */ + uint *m_Ids; + + bool m_bRooted; /**< tree is rooted */ + uint m_uRootNodeIndex; +} tree_t; + + +extern void +MuscleTreeCreate(tree_t *tree, uint uLeafCount, uint uRoot, const uint *Left, + const uint *Right, const float *LeftLength, const float* RightLength, + const uint *LeafIds, char **LeafNames); + +extern void +MuscleTreeToFile(FILE *fp, tree_t *tree); + +extern int +MuscleTreeFromFile(tree_t *tree, char *ftree); + +extern void +FreeMuscleTree(tree_t *tree); + +extern void +LogTree(tree_t *tree, FILE *fp); + +extern bool +IsRooted(tree_t *tree); + +extern uint +GetNodeCount(tree_t *tree); + +extern uint +GetLeafCount(tree_t *tree); + +extern uint +FirstDepthFirstNode(tree_t *tree); + +extern uint +NextDepthFirstNode(uint nodeindex, tree_t *tree); + +extern bool +IsLeaf(uint nodeindex, tree_t *tree); + +extern void +SetLeafId(tree_t *tree, uint uNodeIndex, uint uId); + +extern uint +GetLeafId(uint nodeindex, tree_t *tree); + +extern char * +GetLeafName(unsigned uNodeIndex, tree_t *tree); + +extern uint +GetLeft(uint nodeindex, tree_t *tree); + +extern uint +GetRight(uint nodeindex, tree_t *tree); + +extern uint +GetRootNodeIndex(tree_t *tree); + +extern bool +IsRoot(uint uNodeIndex, tree_t *tree); + +extern uint +GetParent(unsigned uNodeIndex, tree_t *tree); + +extern double +GetEdgeLength(uint uNodeIndex1, uint uNodeIndex2, tree_t *tree); + +extern uint +LeafIndexToNodeIndex(uint uLeafIndex, tree_t *prTree); + +extern void +AppendTree(tree_t *prDstTree, + uint uDstTreeNodeIndex, tree_t *prSrcTree); + +extern void +TreeValidate(tree_t *tree); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/muscle_upgma.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,502 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/* This the fast UPGMA algorithm (O(N^2)) as implemented in Bob Edgar's + * Muscle (UPGMA2.cpp; version 3.7) ported to pure C. + * + * Muscle's code is public domain and so is this code here. + * + * From http://www.drive5.com/muscle/license.htm: + * """ + * MUSCLE is public domain software + * + * The MUSCLE software, including object and source code and + * documentation, is hereby donated to the public domain. + * + * Disclaimer of warranty + * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * """ + * + */ + +/* + * RCS $Id: muscle_upgma.c 230 2011-04-09 15:37:50Z andreas $ + * + * + * Notes: + * ------ + * LINKAGE become linkage_t here + * + * Replaced the the following member functions for DistCalc DC: + * DC.GetId = sequence id as int + * DC.GetName = sequence name + * DC.GetCount = matrix dim + * DC.DistRange = vector / matrix row for object i with index j<i + * + * Log() has been replaced with Clustal's Info(), Quiet() with Log(&rLog, LOG_FATAL) + * + * Made TriangleSubscript() and g_ulTriangleSize ulong to prevent overflow for many sequences + */ + +#ifndef ulint +/* limit use of unsigned vars (see coding_style_guideline.txt) */ +typedef unsigned long int ulong; +#endif + + + +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> + +#include "util.h" +#include "log.h" +#include "symmatrix.h" + +#include "muscle_tree.h" +#include "muscle_upgma.h" + +/* from distcalc.h */ +typedef float dist_t; +static const dist_t BIG_DIST = (dist_t) 1e29; +/* from muscle.h */ +static const unsigned uInsane = 8888888; + + + + +/*static inline*/ +ulong TriangleSubscript(uint uIndex1, uint uIndex2); + + + + +#define TRACE 0 + +#ifndef MIN +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#endif +#ifndef MIN +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +#endif +#define AVG(x, y) (((x) + (y))/2) + +static uint g_uLeafCount; +static ulong g_ulTriangleSize; +static uint g_uInternalNodeCount; +static uint g_uInternalNodeIndex; + +/* Triangular distance matrix is g_Dist, which is allocated + * as a one-dimensional vector of length g_ulTriangleSize. + * TriangleSubscript(i,j) maps row,column=i,j to the subscript + * into this vector. + * Row / column coordinates are a bit messy. + * Initially they are leaf indexes 0..N-1. + * But each time we create a new node (=new cluster, new subtree), + * we re-use one of the two rows that become available (the children + * of the new node). This saves memory. + * We keep track of this through the g_uNodeIndex vector. + */ +static dist_t *g_Dist; + +/* Distance to nearest neighbor in row i of distance matrix. + * Subscript is distance matrix row. + */ +static dist_t *g_MinDist; + +/* Nearest neighbor to row i of distance matrix. + * Subscript is distance matrix row. + */ +static uint *g_uNearestNeighbor; + +/* Node index of row i in distance matrix. + * Node indexes are 0..N-1 for leaves, N..2N-2 for internal nodes. + * Subscript is distance matrix row. + */ +static uint *g_uNodeIndex; + +/* The following vectors are defined on internal nodes, + * subscripts are internal node index 0..N-2. + * For g_uLeft/Right, value is the node index 0 .. 2N-2 + * because a child can be internal or leaf. + */ +static uint *g_uLeft; +static uint *g_uRight; +static dist_t *g_Height; +static dist_t *g_LeftLength; +static dist_t *g_RightLength; + + +/*** CalcDistRange + * + * Imitation of DistCalc.DistRange + * + * Sets values of row (vector / matrix row) to distances for object i with index j<i + * + * row must be preallocated + */ +void CalcDistRange(symmatrix_t *distmat, uint i, dist_t *row) +{ + uint j; + for (j = 0; j < i; ++j) { + row[j] = SymMatrixGetValue(distmat, i, j); + } +} +/* end of CalcDistRange */ + + + +/*static inline*/ +ulong +TriangleSubscript(uint uIndex1, uint uIndex2) +{ + ulong v; +#ifndef NDEBUG + if (uIndex1 >= g_uLeafCount || uIndex2 >= g_uLeafCount) + Log(&rLog, LOG_FATAL, "TriangleSubscript(%u,%u) %u", uIndex1, uIndex2, g_uLeafCount); +#endif + if (uIndex1 >= uIndex2) + v = uIndex2 + (uIndex1*(uIndex1 - 1))/2; + else + v = uIndex1 + (uIndex2*(uIndex2 - 1))/2; + assert(v < (g_uLeafCount*(g_uLeafCount - 1))/2); + return v; +} + +#ifdef UNUSED +static void ListState() +{ + uint i, j; + Info("Dist matrix\n"); + Info(" "); + for (i = 0; i < g_uLeafCount; ++i) + { + if (uInsane == g_uNodeIndex[i]) + continue; + Info(" %5u", g_uNodeIndex[i]); + } + Info("\n"); + + for (i = 0; i < g_uLeafCount; ++i) + { + if (uInsane == g_uNodeIndex[i]) + continue; + Info("%5u ", g_uNodeIndex[i]); + for (j = 0; j < g_uLeafCount; ++j) + { + if (uInsane == g_uNodeIndex[j]) + continue; + if (i == j) + Info(" "); + else + { + ulong v = TriangleSubscript(i, j); + Info("%5.2g ", g_Dist[v]); + } + } + Info("\n"); + } + + Info("\n"); + Info(" i Node NrNb Dist\n"); + Info("----- ----- ----- --------\n"); + for (i = 0; i < g_uLeafCount; ++i) + { + if (uInsane == g_uNodeIndex[i]) + continue; + Info("%5u %5u %5u %8.3f\n", + i, + g_uNodeIndex[i], + g_uNearestNeighbor[i], + g_MinDist[i]); + } + + Info("\n"); + Info(" Node L R Height LLength RLength\n"); + Info("----- ----- ----- ------ ------- -------\n"); + for (i = 0; i <= g_uInternalNodeIndex; ++i) + Info("%5u %5u %5u %6.2g %6.2g %6.2g\n", + i, + g_uLeft[i], + g_uRight[i], + g_Height[i], + g_LeftLength[i], + g_RightLength[i]); +} +#endif +/* ifdef UNUSED */ + +/** + * @brief Creates a UPGMA in O(N^2) tree from given distmat + * + * @param[out] tree + * newly created rooted UPGMA tree + * @param[in] distmat + * distance matrix to be clustered + * @param[in] linkage + * linkage type + * @param[in] names + * leaf names, will be copied + * + * @note called UPGMA2() in Muscle3.7. + * caller has to free with FreeMuscleTree() + * + * @see FreeMuscleTree() + */ +void +MuscleUpgma2(tree_t *tree, symmatrix_t *distmat, linkage_t linkage, char **names) +{ + int i, j; + uint *Ids; + + /* only works on full symmetric matrices */ + assert (distmat->nrows==distmat->ncols); + + g_uLeafCount = distmat->ncols; + g_ulTriangleSize = (g_uLeafCount*(g_uLeafCount - 1))/2; + g_uInternalNodeCount = g_uLeafCount - 1; + + g_Dist = (dist_t *) CKMALLOC(g_ulTriangleSize * sizeof(dist_t)); + + g_uNodeIndex = (uint*) CKMALLOC(sizeof(uint) * g_uLeafCount); + g_uNearestNeighbor = (uint*) CKMALLOC(sizeof(uint) * g_uLeafCount); + g_MinDist = (dist_t *) CKMALLOC(sizeof(dist_t) * g_uLeafCount); + Ids = (uint*) CKMALLOC(sizeof(uint) * g_uLeafCount); + /* NOTE: we replaced Names with argument names */ + + /** + * left and right node indices, as well as left and right + * branch-length and height for for internal nodes + */ + g_uLeft = (uint*) CKMALLOC(sizeof(uint) * g_uInternalNodeCount); + g_uRight = (uint*) CKMALLOC(sizeof(uint) * g_uInternalNodeCount); + g_Height = (dist_t*) CKMALLOC(sizeof(dist_t) * g_uInternalNodeCount); + g_LeftLength = (dist_t*) CKMALLOC(sizeof(dist_t) * g_uInternalNodeCount); + g_RightLength = (dist_t*) CKMALLOC(sizeof(dist_t) * g_uInternalNodeCount); + + for (i = 0; i < g_uLeafCount; ++i) { + g_MinDist[i] = BIG_DIST; + g_uNodeIndex[i] = i; + g_uNearestNeighbor[i] = uInsane; + Ids[i] = i; + } + + for (i = 0; i < g_uInternalNodeCount; ++i) { + g_uLeft[i] = uInsane; + g_uRight[i] = uInsane; + g_LeftLength[i] = BIG_DIST; + g_RightLength[i] = BIG_DIST; + g_Height[i] = BIG_DIST; + } + +/* Compute initial NxN triangular distance matrix. + * Store minimum distance for each full (not triangular) row. + * Loop from 1, not 0, because "row" is 0, 1 ... i-1, + * so nothing to do when i=0. + */ + for (i = 1; i < g_uLeafCount; ++i) { + dist_t *Row = g_Dist + TriangleSubscript(i, 0); + CalcDistRange(distmat, i, Row); + for (j = 0; j < i; ++j) { + const dist_t d = Row[j]; + if (d < g_MinDist[i]) { + g_MinDist[i] = d; + g_uNearestNeighbor[i] = j; + } + if (d < g_MinDist[j]) { + g_MinDist[j] = d; + g_uNearestNeighbor[j] = i; + } + } + } + +#if TRACE + Info("Initial state:\n"); + ListState(); +#endif + + for (g_uInternalNodeIndex = 0; + g_uInternalNodeIndex < g_uLeafCount - 1; + ++g_uInternalNodeIndex) { + + dist_t dtNewMinDist = BIG_DIST; + uint uNewNearestNeighbor = uInsane; + +#if TRACE + Info("\n"); + Info("Internal node index %5u\n", g_uInternalNodeIndex); + Info("-------------------------\n"); +#endif + + /* Find nearest neighbors */ + uint Lmin = uInsane; + uint Rmin = uInsane; + dist_t dtMinDist = BIG_DIST; + for (j = 0; j < g_uLeafCount; ++j) { + dist_t d; + if (uInsane == g_uNodeIndex[j]) + continue; + + d = g_MinDist[j]; + if (d < dtMinDist) { + dtMinDist = d; + Lmin = j; + Rmin = g_uNearestNeighbor[j]; + assert(uInsane != Rmin); + assert(uInsane != g_uNodeIndex[Rmin]); + } + } + + assert(Lmin != uInsane); + assert(Rmin != uInsane); + assert(dtMinDist != BIG_DIST); + +#if TRACE + Info("Nearest neighbors Lmin %u[=%u] Rmin %u[=%u] dist %.3g\n", + Lmin, + g_uNodeIndex[Lmin], + Rmin, + g_uNodeIndex[Rmin], + dtMinDist); +#endif + + /* Compute distances to new node + * New node overwrites row currently assigned to Lmin + */ + for ( j = 0; j < g_uLeafCount; ++j) { + ulong vL, vR; + dist_t dL, dR; + dist_t dtNewDist; + + if (j == Lmin || j == Rmin) + continue; + if (uInsane == g_uNodeIndex[j]) + continue; + + vL = TriangleSubscript(Lmin, j); + vR = TriangleSubscript(Rmin, j); + dL = g_Dist[vL]; + dR = g_Dist[vR]; + dtNewDist = 0.0; + + switch (linkage) { + case LINKAGE_AVG: + dtNewDist = AVG(dL, dR); + break; + + case LINKAGE_MIN: + dtNewDist = MIN(dL, dR); + break; + + case LINKAGE_MAX: + dtNewDist = MAX(dL, dR); + break; +/* couldn't be arsed to figure out proper usage of g_dSUEFF */ +#if 0 + case LINKAGE_BIASED: + dtNewDist = g_dSUEFF*AVG(dL, dR) + (1 - g_dSUEFF)*MIN(dL, dR); + break; +#endif + default: + Log(&rLog, LOG_FATAL, "UPGMA2: Invalid LINKAGE_%u", linkage); + } + + /* Nasty special case. + * If nearest neighbor of j is Lmin or Rmin, then make the new + * node (which overwrites the row currently occupied by Lmin) + * the nearest neighbor. This situation can occur when there are + * equal distances in the matrix. If we don't make this fix, + * the nearest neighbor pointer for j would become invalid. + * (We don't need to test for == Lmin, because in that case + * the net change needed is zero due to the change in row + * numbering). + */ + if (g_uNearestNeighbor[j] == Rmin) + g_uNearestNeighbor[j] = Lmin; + +#if TRACE + Info("New dist to %u = (%u/%.3g + %u/%.3g)/2 = %.3g\n", + j, Lmin, dL, Rmin, dR, dtNewDist); +#endif + g_Dist[vL] = dtNewDist; + if (dtNewDist < dtNewMinDist) { + dtNewMinDist = dtNewDist; + uNewNearestNeighbor = j; + } + } + + assert(g_uInternalNodeIndex < g_uLeafCount - 1 || BIG_DIST != dtNewMinDist); + assert(g_uInternalNodeIndex < g_uLeafCount - 1 || uInsane != uNewNearestNeighbor); + + const ulong v = TriangleSubscript(Lmin, Rmin); + const dist_t dLR = g_Dist[v]; + const dist_t dHeightNew = dLR/2; + const uint uLeft = g_uNodeIndex[Lmin]; + const uint uRight = g_uNodeIndex[Rmin]; + const dist_t HeightLeft = + uLeft < g_uLeafCount ? 0 : g_Height[uLeft - g_uLeafCount]; + const dist_t HeightRight = + uRight < g_uLeafCount ? 0 : g_Height[uRight - g_uLeafCount]; + + g_uLeft[g_uInternalNodeIndex] = uLeft; + g_uRight[g_uInternalNodeIndex] = uRight; + g_LeftLength[g_uInternalNodeIndex] = dHeightNew - HeightLeft; + g_RightLength[g_uInternalNodeIndex] = dHeightNew - HeightRight; + g_Height[g_uInternalNodeIndex] = dHeightNew; + + /* Row for left child overwritten by row for new node */ + g_uNodeIndex[Lmin] = g_uLeafCount + g_uInternalNodeIndex; + g_uNearestNeighbor[Lmin] = uNewNearestNeighbor; + g_MinDist[Lmin] = dtNewMinDist; + + /* Delete row for right child */ + g_uNodeIndex[Rmin] = uInsane; + +#if TRACE + Info("\nInternalNodeIndex=%u Lmin=%u Rmin=%u\n", + g_uInternalNodeIndex, Lmin, Rmin); + ListState(); +#endif + } + + uint uRoot = g_uLeafCount - 2; + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "uRoot=%d g_uLeafCount=%d g_uInternalNodeCount=%d", uRoot, g_uLeafCount, g_uInternalNodeCount); + for (i=0; i<g_uInternalNodeCount; i++) { + Log(&rLog, LOG_FORCED_DEBUG, "internal node=%d: g_uLeft=%d g_uRight=%d g_LeftLength=%f g_RightLength=%f g_Height=%f", + i, g_uLeft[i], g_uRight[i], + g_LeftLength[i], g_RightLength[i], + g_Height[i]); + } + for (i=0; i<g_uLeafCount; i++) { + Log(&rLog, LOG_FORCED_DEBUG, "leaf node=%d: Ids=%d names=%s", + i, Ids[i], names[i]); + } +#endif + + MuscleTreeCreate(tree, g_uLeafCount, uRoot, + g_uLeft, g_uRight, + g_LeftLength, g_RightLength, + Ids, names); +#if TRACE + tree.LogMe(); +#endif + + free(g_Dist); + + free(g_uNodeIndex); + free(g_uNearestNeighbor); + free(g_MinDist); + free(g_Height); + + free(g_uLeft); + free(g_uRight); + free(g_LeftLength); + free(g_RightLength); + + /* NOTE: Muscle's "Names" variable is here the argument "names" */ + free(Ids); +} +/*** end of UPGMA2 ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/muscle_upgma.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,43 @@ +/* This the fast UPGMA algorithm (O(N^2)) as implemented in Bob Edgar's + * Muscle (UPGMA2.cpp; version 3.7) ported to pure C. + * + * Muscle's code is public domain and so is this code here. + * + * From http://www.drive5.com/muscle/license.htm: + * """ + * MUSCLE is public domain software + * + * The MUSCLE software, including object and source code and + * documentation, is hereby donated to the public domain. + * + * Disclaimer of warranty + * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * """ + * + */ + +/* + * RCS $Id: muscle_upgma.h 193 2011-02-07 15:45:21Z andreas $ + */ + +#ifndef CLUSTALO_UPGMA_H +#define CLUSTALO_UPGMA_H + +#include "symmatrix.h" +#include "muscle_tree.h" + +enum linkage_e { + LINKAGE_MIN, + LINKAGE_AVG, + LINKAGE_MAX, + LINKAGE_NEIGHBORJOINING, + LINKAGE_BIASED +}; +typedef enum linkage_e linkage_t; + +void MuscleUpgma2(tree_t *tree, symmatrix_t *distmat, + linkage_t linkage, char **names); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/pair_dist.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,425 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: pair_dist.c 242 2011-05-27 14:04:21Z andreas $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <ctype.h> +#include <assert.h> +#include <time.h> + +/* only neededfor iNumberOfThreads */ +#include "clustal-omega.h" + +#include "ktuple_pair.h" +#include "pair_dist.h" +#include "progress.h" +#include "util.h" + + +/* Up to rev 173 we had a USE_SYM_KTUPLE switch implemented here. When active + * ktuple distances were computed twice for each pair and averaged. Idea was + * to avoid assymmetries in the pairwise scores (score(a, b) is often not the + * same as score(b, a)). Results on BAliBASE indicate that this is overkill: + * + * r92_default core columns: avg-sp=0.800656 avg-tc=0.47711 (of total 218) + * r93-mod--norm-ktuple/ core columns: avg-sp=0.800656 avg-tc=0.47711 (of total 218) + * r93-mod--sym-ktuple/ core columns: avg-sp=0.801083 avg-tc=0.476544 (of total 217) + * r93-mod--rand-ktuple-1 core columns: avg-sp=0.799289 avg-tc=0.468028 (of total 218) + * r93-mod--rand-ktuple-2 core columns: avg-sp=0.801654 avg-tc=0.47659 (of total 217) + * r93-mod--rand-ktuple-3 core columns: avg-sp=0.800234 avg-tc=0.474908 (of total 218) + * r93-mod--rand-ktuple-4 core columns: avg-sp=0.800573 avg-tc=0.476514 (of total 218) + * r93-mod--rand-ktuple-5 core columns: avg-sp=0.799679 avg-tc=0.468716 (of total 218) + * + */ + +static double +KimuraCorrection(double frac_id); + +static int +SquidIdPairDist(symmatrix_t *tmat, mseq_t *mseq, + int istart, int iend, + int jstart, int jend, + bool use_KimuraCorrection, progress_t *prProgress, + unsigned long int *ulStepNo, unsigned long int ulTotalStepNo); + +/* Taken from Muscle's msadistkimura.cpp */ +static int DAYHOFF_PAMS[]={ + 195, /* 75.0% observed d; 195 PAMs estimated = 195% estimated d */ + 196, /* 75.1% observed d; 196 PAMs estimated */ + 197, 198, 199, 200, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 236, 237, 238, 239, 240, 241, 243, 244, 245, + 246, 248, 249, 250, /* 250 PAMs = 80.3% observed d */ + 252, 253, 254, 255, 257, 258, + 260, 261, 262, 264, 265, 267, 268, 270, 271, 273, + 274, 276, 277, 279, 281, 282, 284, 285, 287, 289, + 291, 292, 294, 296, 298, 299, 301, 303, 305, 307, + 309, 311, 313, 315, 317, 319, 321, 323, 325, 328, + 330, 332, 335, 337, 339, 342, 344, 347, 349, 352, + 354, 357, 360, 362, 365, 368, 371, 374, 377, 380, + 383, 386, 389, 393, 396, 399, 403, 407, 410, 414, + 418, 422, 426, 430, 434, 438, 442, 447, 451, 456, + 461, 466, 471, 476, 482, 487, 493, 498, 504, 511, + 517, 524, 531, 538, 545, 553, 560, 569, 577, 586, + 595, 605, 615, 626, 637, 649, 661, 675, 688, 703, + 719, 736, 754, 775, 796, 819, 845, 874, 907, 945, + /* 92.9% observed; 945 PAMs */ + 988 /* 93.0% observed; 988 PAMs */ +}; +static int DAYHOFF_TABLE_ENTRIES = sizeof(DAYHOFF_PAMS)/sizeof(DAYHOFF_PAMS[0]); + + + +/** + * + * @brief Compute Kimura corrected distance. + * + * Original Muscle documentation following: + * """ + * This is defined to be: + * log_e(1 - p - p*p/5) + * where p is the fraction of residues that differ, i.e.: + * p = (1 - fractional_conservation) + * This measure is infinite for p = 0.8541 and is considered + * unreliable for p >= 0.75 (according to the ClustalW docs). + * ClustalW uses a table lookup for values > 0.75. The following table + * was copied from the ClustalW file dayhoff.h. + * """ + * + * @note copied from Muscle's msadistkimura.cpp:KimuraDist() + * + * @warning For protein only (uses Dayhoff substitution parameters) + * + * @param[in] p + * distance, e.g. 1.0 - fractional/relative identity + * + * @return The Kimura corrected distance + * + */ +double +KimuraCorrection(double p) +{ + int table_index; + + /* Typical case: use Kimura's empirical formula */ + if (p < 0.75) + return -log(1 - p - (p*p)/5); + + /* Per ClustalW, return 10.0 for anything over 93% */ + if (p > 0.93) + return 10.0; + + /* If 0.75 >= p <= 0.93, use table lookup */ + table_index = (int) ((p - 0.75)*1000 + 0.5); + if (table_index < 0 || table_index >= DAYHOFF_TABLE_ENTRIES) + Log(&rLog, LOG_FATAL, "Internal error in %s:%s", __FILE__, __FUNCTION__); + + return DAYHOFF_PAMS[table_index] / 100.0; +} +/*** end: KimuraCorrection() ***/ + + + + +/** + * @brief Compute distances between all aligned sequence pairs using + * squid's PairwiseIdentity, which is: idents / MIN(len1, len2) + * + * @param[out] tmat + * Where to store the computed distances + * @param[in] mseq + * The aligned sequences + * @param[in] istart + * For distances [i][j] i>=istart, i<j + * @param[in] iend + * For distances [i][j] i<iend, i<j + * @param[in] jstart + * For distances [i][j] j>=jstart, i<j + * @param[in] jend + * For distances [i][j] i<j<jend, i<j + * @param[in] use_kimura + * Use Kimura corrected values (Proteins only) + * + * @return Non-zero on error + * + */ +int +SquidIdPairDist(symmatrix_t *tmat, mseq_t *mseq, + int istart, int iend, + int jstart, int jend, + bool use_kimura, progress_t *prProgress, + unsigned long int *ulStepNo, unsigned long int ulTotalStepNo) +{ + int i, j; /* aux */ + /* progress_t *prProgress; */ + bool bPrintCR = (rLog.iLogLevelEnabled<=LOG_VERBOSE) ? FALSE : TRUE; + /* unsigned long int ulStepNo; + unsigned long ulTotalStepNo; */ + + assert(NULL != tmat); + assert(NULL != mseq); + + if (TRUE != mseq->aligned) { + Log(&rLog, LOG_ERROR, "Sequences need to be aligned (%s)", __FUNCTION__); + return -1; + } + if (SEQTYPE_PROTEIN != mseq->seqtype && TRUE == use_kimura) { + Log(&rLog, LOG_WARN, "Using Kimura distance corretion which includes Dayhoff substitution table lookup for non-protein sequences"); + } + + NewProgress(&prProgress, LogGetFP(&rLog, LOG_INFO), + "Pairwise distance calculation progress", bPrintCR); + /* estimation of total number of steps (if istart and jstart are + * both 0) + */ + /* ulTotalStepNo = iend*jend - iend*iend/2 + iend/2; + ulStepNo = 0; */ + /*LOG_DEBUG("istart=%d iend=%d jstart=%d jend=%d", istart, iend, jstart, jend);*/ + for (i=istart; i<iend; ++i) { + /* by definition a sequence compared to itself should give a + score of 0 */ + SymMatrixSetValue(tmat, i, i, 0.0); +#ifdef HAVE_OPENMP + #pragma omp critical(squidid) +#endif + { + ProgressLog(prProgress, *ulStepNo, ulTotalStepNo, FALSE); + } + + for (j=MAX(i+1, jstart); j<jend; ++j) { + float dist; + dist = 1.0 - PairwiseIdentity(mseq->seq[i], mseq->seq[j]); + + +#ifdef HAVE_OPENMP + #pragma omp atomic +#endif + (*ulStepNo)++; + /*LOG_DEBUG("%d:%d raw dist = %f", i, j, dist);*/ + if (use_kimura) { + dist = KimuraCorrection(dist); + /*LOG_DEBUG("cor dist = %f", dist);*/ + } + SymMatrixSetValue(tmat, i, j, dist); +#ifdef HAVE_OPENMP + #pragma omp critical(squidid) +#endif + { + Log(&rLog, LOG_DEBUG, "Aligned distance for sequence pair %d:%d= %lg", + i+1, j+1, dist); + } + } + } + + return 0; +} +/*** end: SquidIdPairDist() ***/ + + + + +/** + * @brief compute or read precomputed distances for given sequences + * + * @param[out] distmat + * Distances will be written to this matrix. will be allocated here as + * well. Caller must free with FreeSymMatrix() + * @param[in] mseq + * Distances will be computed for these sequences + * @param[in] pairdist_type + * Type of pairwise distance comparison + * @param[in] fdist_in + * If not NULL, sequences will be written from this file instead of + * computing them + * @param[in] istart + * Compute distances for sequences i:j, i>=istart, i<j. + * Usually 0. + * @param[in] iend + * Compute distances for sequences i:j, i<iend, i<j + * Usually mseq->nseqs. + * @param[in] jstart + * Compute distances for sequences i:j, j>=jstart, i<j + * Usually 0. + * @param[in] jend + * Compute distances for sequences i:j, j<iend, i<j + * Usually mseq->nseqs. + * @param[in] fdist_out + * If not NULL, distances will be written to this files + * + * + */ +int +PairDistances(symmatrix_t **distmat, mseq_t *mseq, int pairdist_type, + int istart, int iend, + int jstart, int jend, + char *fdist_in, char *fdist_out) +{ + int uSeqIndex; + unsigned long int ulStepNo = 0, ulTotalStepNo; /* DD: moved from SquidIdPairDist so progress bar works multithreaded */ + int iChunk, iChunkStart, iChunkEnd; + int iChunkStarts[iNumberOfThreads]; + int iChunkEnds[iNumberOfThreads]; + progress_t *prProgress = NULL; + int iSquidSuccess = 0; + bool bPrintCR = (rLog.iLogLevelEnabled<=LOG_VERBOSE) ? FALSE : TRUE; + + assert(NULL!=distmat); + assert(NULL!=mseq); + assert(istart<iend); + assert(jstart<jend); + + if (NewSymMatrix(distmat, iend, jend)!=0) { + Log(&rLog, LOG_FATAL, "%s", "Memory allocation for distance matrix failed"); + } + + + /* compute pairwise distances or read from file + * + */ +#if 0 +#include "random-dist.h" +#else + if (NULL != fdist_in) { + Log(&rLog, LOG_FATAL, "FIXME: reading of distance matrix from file not implemented"); + + } else { + + /* break into chunks, one for each thread + matrix is a triangle, not a square + hence making even chunk sizes is slightly fiddlier + */ + ulTotalStepNo = iend*jend - iend*iend/2 + iend/2; + + /* FIXME: can get rid of iChunkStart, iChunkEnd now that we're using the arrays */ + iChunkStart = iend; + for(iChunk = 0; iChunk <= iNumberOfThreads; iChunk++) + { + iChunkEnd = iChunkStart; + if(iChunk == iNumberOfThreads - 1) + iChunkStart = 0; + else + iChunkStart = iend - ((double)(iend - istart) * sqrt(((double)iChunk + 1.0)/(double)iNumberOfThreads)); + iChunkStarts[iChunk] = iChunkStart; + iChunkEnds[iChunk] = iChunkEnd; + } + + if (PAIRDIST_KTUPLE == pairdist_type) { + + Log(&rLog, LOG_INFO, "Calculating pairwise ktuple-distances..."); + + NewProgress(&prProgress, LogGetFP(&rLog, LOG_INFO), + "Ktuple-distance calculation progress", bPrintCR); +#ifdef HAVE_OPENMP + #pragma omp parallel for private(iChunk) schedule(dynamic) +#endif + for(iChunk = 0; iChunk < iNumberOfThreads; iChunk++) + { + KTuplePairDist((*distmat), mseq, iChunkStarts[iChunk], + iChunkEnds[iChunk], jstart, jend, NULL, prProgress, + &ulStepNo, ulTotalStepNo); + } + +#if 0 + printf("total ops %d\n", ulStepNo); +#endif + /* old format: + KTuplePairDist((*distmat), mseq, + istart, iend, + jstart, jend, NULL); */ + + } else if (PAIRDIST_SQUIDID == pairdist_type) { + Log(&rLog, LOG_INFO, "Calculating pairwise aligned identity distances..."); + + NewProgress(&prProgress, LogGetFP(&rLog, LOG_INFO), + "Pairwise identity calculation progress", bPrintCR); +#ifdef HAVE_OPENMP + #pragma omp parallel for private(iChunk) schedule(dynamic) +#endif + for(iChunk = 0; iChunk < iNumberOfThreads; iChunk++) + { + iSquidSuccess = SquidIdPairDist((*distmat), mseq, + iChunkStarts[iChunk], iChunkEnds[iChunk], + jstart, jend, FALSE, prProgress, + &ulStepNo, ulTotalStepNo); + } + if(iSquidSuccess != 0) + return -1; + + } else if (PAIRDIST_SQUIDID_KIMURA == pairdist_type) { + Log(&rLog, LOG_INFO, "Calculating Kimura-corrected pairwise aligned identity distances..."); + NewProgress(&prProgress, LogGetFP(&rLog, LOG_INFO), + "Pairwise identity calculation progress", bPrintCR); +#ifdef HAVE_OPENMP + #pragma omp parallel for private(iChunk) schedule(dynamic) +#endif + for(iChunk = 0; iChunk < iNumberOfThreads; iChunk++) + { + iSquidSuccess = SquidIdPairDist((*distmat), mseq, + iChunkStarts[iChunk], iChunkEnds[iChunk], + jstart, jend, TRUE, prProgress, + &ulStepNo, ulTotalStepNo); + } + if(iSquidSuccess != 0) + return -1; + } else { + Log(&rLog, LOG_FATAL, "INTERNAL ERROR: don't know about pairdist_type %d", + pairdist_type); + } + } +#endif /* random/proper distance calculation */ + + + /* optional printing of matrix to file + */ + if (NULL != fdist_out) { + /* need a copy of sequence names for printing */ + char **names; + names = (char **)CKMALLOC(mseq->nseqs * sizeof(char*)); + for (uSeqIndex=0; uSeqIndex<mseq->nseqs; uSeqIndex++) { + names[uSeqIndex] = mseq->sqinfo[uSeqIndex].name; + } + + SymMatrixPrint((*distmat), names, fdist_out); + + Log(&rLog, LOG_INFO, "Pairwise distance matrix written to %s", + fdist_out); + CKFREE(names); + } + +#if 0 +#include "distance-distrib.h" +#endif + + if (NULL != prProgress) { + ProgressDone(prProgress); + FreeProgress(&prProgress); + } + + return 0; +} +/*** end: PairDistances() ***/ + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/pair_dist.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,42 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: pair_dist.h 193 2011-02-07 15:45:21Z andreas $ + */ + + +#ifndef CLUSTALO_PAIR_DIST_H +#define CLUSTALO_PAIR_DIST_H + +#define PAIRDIST_UNKNOWN 0 +/* k-tuple distances: Wilbur and Lipman (1983) */ +#define PAIRDIST_KTUPLE 1 +/* fractional identity between aligned sequences. denominator is + * minimum seq len (see squid:aligneval.c) */ +#define PAIRDIST_SQUIDID 2 +/* SQUIDID + Kimura correction */ +#define PAIRDIST_SQUIDID_KIMURA 3 + +#include "seq.h" +#include "symmatrix.h" + +extern int +PairDistances(symmatrix_t **distmat, mseq_t *mseq, const int pairdist_type, + const int istart, const int iend, + const int jstart, const int jend, + char *fdist_in, char *fdist_out); + +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/progress.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,177 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: progress.c 230 2011-04-09 15:37:50Z andreas $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> + +#include "util.h" +#include "log.h" +#include "progress.h" + +#define LOGLEVEL_THRESHOLD LOG_INFO + +/** + * @brief Allocates a new progress structure and initialises its members. + * Free with FreeProgress() + * + * @note Starts the internal stopwatch immediatly! + * + * @see FreeProgress() + * + * @param[out] pprProgress + * Pointer pointer to progress structure. Progress structure will be + * allocated here. + * @param[in] prFile + * Where to log messages to + * @param[in] pcPrefix + * What prefix to use for messages + * @param[in] bPrintCR + * If TRUE carriage return instead of newline will be printed between log messages + */ +void +NewProgress(progress_t **pprProgress, FILE *prFile, + char *pcPrefix, bool bPrintCR) +{ + assert(NULL!=pprProgress); + assert(NULL!=prFile); + assert(NULL!=pcPrefix); + + (*pprProgress) = (progress_t *) CKMALLOC(1*sizeof(progress_t)); + (*pprProgress)->prFile = prFile; + (*pprProgress)->bPrintCR = bPrintCR; + (*pprProgress)->pcPrefix = CkStrdup(pcPrefix); + strcpy((*pprProgress)->pcLastLogMsg, "\0"); + (*pprProgress)->prStopwatch = StopwatchCreate(); + StopwatchZero((*pprProgress)->prStopwatch); + StopwatchStart((*pprProgress)->prStopwatch); + + return; +} +/*** end: NewProgress() ***/ + + + +/** + * @brief Frees progress structure and its members + * + * @param[out] pprProgress + * Pointer pointer to progress structure + * + * @see NewProgress() + * + */ +void +FreeProgress(progress_t **pprProgress) +{ + (*pprProgress)->prFile = NULL; + CKFREE((*pprProgress)->pcPrefix); + StopwatchFree((*pprProgress)->prStopwatch); + + CKFREE(*pprProgress); + return; +} +/*** end: FreeProgress() ***/ + + + + +/** + * @brief Prints a progress update (and a carriage return) + * + * @param[in] prProgress + * Pointer to the progress structure + * @param[in] iStep + * Current step number + * @param[in] iTotalSteps + * Total step number + * @param[in] bForceOutput + * If percentage hasn't changed output is normally supressed + * normally. Output can be forced with this flag. + * + */ +void +ProgressLog(progress_t *prProgress, + unsigned long int iStep, unsigned long int iTotalSteps, + bool bForceOutput) +{ + char pcLogMsg[1024]; + assert(0!=iTotalSteps); + + if (rLog.iLogLevelEnabled>LOGLEVEL_THRESHOLD) { + return; + } + + (void) snprintf(pcLogMsg, sizeof(pcLogMsg), "%s: %lu %%", + prProgress->pcPrefix, (unsigned long int)(iStep/(float)iTotalSteps*100.0)); + + if (! bForceOutput) { + /* Skip logging, if we've just logged the same message */ + if (STR_EQ(pcLogMsg, prProgress->pcLastLogMsg)) { + return; + } + } + + strncpy(prProgress->pcLastLogMsg, pcLogMsg, + sizeof(prProgress->pcLastLogMsg)); + + fprintf(prProgress->prFile, "%s (%lu out of %lu)", pcLogMsg, iStep, iTotalSteps); + if (prProgress->bPrintCR) { + fprintf(prProgress->prFile, "\r"); + } else { + fprintf(prProgress->prFile, "\n"); + + } + (void) fflush(prProgress->prFile); + + return; +} +/*** end: ProgressLog() ***/ + + +/** + * @brief Finishes progress output by printing the elapsed time + * + * @param[in] prProgress + * Pointer to the progress structure + * + */ +void +ProgressDone(progress_t *prProgress) +{ + char pcBuf[1024]; + + if (rLog.iLogLevelEnabled>LOGLEVEL_THRESHOLD) { + return; + } + + (void) snprintf(pcBuf, sizeof(pcBuf), "%s done. CPU time: ", + prProgress->pcPrefix); + StopwatchStop(prProgress->prStopwatch); + StopwatchDisplay(prProgress->prFile, pcBuf, prProgress->prStopwatch); + (void) fflush(prProgress->prFile); + + return; +} +/*** end: ProgressDone() ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/progress.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,50 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: progress.h 193 2011-02-07 15:45:21Z andreas $ + */ + + +#ifndef CLUSTALO_PROGRESS_H +#define CLUSTALO_PROGRESS_H + +#include "squid/stopwatch.h" + +typedef struct { + /* where to write to */ + FILE *prFile; + /* prefix printed before each step */ + char *pcPrefix; + bool bPrintCR; + char pcLastLogMsg[1024]; + Stopwatch_t *prStopwatch; +} progress_t; + + +extern void +NewProgress(progress_t **pprProgress, FILE *prFile, char *pcPrefix, bool bPrintCR); + +extern void +FreeProgress(progress_t **pprProgress); + +extern void +ProgressLog(progress_t *prProgress, + unsigned long int iStep, unsigned long int iTotalSteps, + bool bForceOutput); + +extern void +ProgressDone(progress_t *pprProgress); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/queue.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,75 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: queue.h 193 2011-02-07 15:45:21Z andreas $ + * + * Functions/Macros for FIFOs/Queues + * + */ + +#ifndef CLUSTALO_QUEUE_H +#define CLUSTALO_QUEUE_H + +#include "list.h" + + + +/* FIFO/Queue as list_t, storing data pointers + * + */ + +typedef list_t queue_t; + +/* setup queue */ +#define QUEUE_INIT(prQueue, destroy_func) ListInit((prQueue), (destroy_func)) + +/* free all elements from queue */ +#define QUEUE_DESTROY(prQueue) ListDestroy((prQueue)) + +/* enqueue */ +#define QUEUE_PUSH(prQueue, data) LIST_APPEND((prQueue), (data)) + +/* dequeue */ +#define QUEUE_POP(prQueue, data) ListRemoveNext((prQueue), NULL, (data)) + +/* is queue empty ? */ +#define QUEUE_EMPTY(prQueue) (0==LIST_SIZE((prQueue))) + + + +/* Special int FIF/Queue, storing ints by copying them instead of + * keeping pointers only + */ + +typedef queue_t int_queue_t; + +/* setup queue */ +#define INT_QUEUE_INIT(prQueue) INT_LIST_INIT((prQueue)) + +/* free all elements from queue */ +#define INT_QUEUE_DESTROY(prQueue) INT_LIST_DESTROY((prQueue)) + +/* enqueue */ +#define INT_QUEUE_PUSH(prQueue, data) INT_LIST_APPEND((prQueue), (data)) + +/* dequeue */ +#define INT_QUEUE_POP(prQueue, data) IntListRemoveNext((prQueue), NULL, (data)) + +/* is queue empty ? */ +#define INT_QUEUE_EMPTY(prQueue) (0==INT_LIST_SIZE((prQueue))) + + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/seq.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1185 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: seq.c 241 2011-05-04 14:37:17Z fabian $ + * + * + * Module for sequence/alignment IO and misc. + * + * This depends heavily on Sean Eddy's squid library, which is obsoleted by + * HMMER3's Easel. However, easel doesn't support that many non-aligned input + * formats. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <assert.h> +#include "squid/squid.h" +#include <ctype.h> + +#include "util.h" +#include "log.h" +#include "seq.h" + + +#define ALLOW_ONLY_PROTEIN 1 + + + + +/** + * @brief Stripped down version of squid's alistat + * + * + * @param[in] prMSeq + * The alignment to analyse + * @param[in] bSampling + * For many sequences: samples from pool + * @param[in] bReportAll + * Report identities for all sequence pairs + * + * Don't have to worry about sequence case because our version of PairwiseIdentity is case insensitive + */ +void +AliStat(mseq_t *prMSeq, bool bSampling, bool bReportAll) { + + /* + * bSampling = squid's do_fast + * bReportAll = squid's allreport + */ + float **ppdIdentMx; /* identity matrix (squid: imx) */ + const int iNumSample = 1000; /* sample size (squid: nsample) */ + int iAux; + + MSA *msa; /* squid's alignment structure */ + int small, large; + int bestj, worstj; + float sum; + float worst_worst, worst_best, best_best; + float avgid; + int i, j; + int nres; /* number of residues */ + + if (bSampling && bReportAll) { + Log(&rLog, LOG_WARN, + "Cannot report all and sample at the same time. Skipping %s()", __FUNCTION__); + return; + } + if (FALSE == prMSeq->aligned) { + Log(&rLog, LOG_WARN, + "Sequences are not aligned. Skipping %s()", __FUNCTION__); + return; + } + + /* silence gcc warnings about uninitialized variables + */ + worst_worst = worst_best = best_best = 0.0; + bestj = worstj = -1; + + + /** mseq to squid msa + * + * FIXME code overlap with WriteAlignment. Make it a function and take + * code there (contains more comments) as template + * + */ + msa = MSAAlloc(prMSeq->nseqs, + /* derive alignment length from first seq */ + strlen(prMSeq->seq[0])); + for (i=0; i<prMSeq->nseqs; i++) { + int key; /* MSA struct internal index for sequence */ + char *this_name = prMSeq->sqinfo[i].name; /* prMSeq sequence name */ + char *this_seq = prMSeq->seq[i]; /* prMSeq sequence */ + SQINFO *this_sqinfo = &prMSeq->sqinfo[i]; /* prMSeq sequence name */ + + key = GKIStoreKey(msa->index, this_name); + msa->sqname[key] = sre_strdup(this_name, strlen(this_name)); + /* setting msa->sqlen[idx] and msa->aseq[idx] */ + msa->sqlen[key] = sre_strcat(&(msa->aseq[key]), msa->sqlen[key], + this_seq, strlen(this_seq)); + if (this_sqinfo->flags & SQINFO_DESC) { + MSASetSeqDescription(msa, key, this_sqinfo->desc); + } + msa->nseq++; + } + + + + nres = 0; + small = large = -1; + for (i = 0; i < msa->nseq; i++) { + int rlen; /* raw sequence length */ + rlen = DealignedLength(msa->aseq[i]); + nres += rlen; + if (small == -1 || rlen < small) small = rlen; + if (large == -1 || rlen > large) large = rlen; + } + + + if (bSampling) { + avgid = AlignmentIdentityBySampling(msa->aseq, msa->alen, + msa->nseq, iNumSample); + + } else { + float best, worst; + + /* this might be slow...could use openmp inside squid */ + MakeIdentityMx(msa->aseq, msa->nseq, &ppdIdentMx); + if (bReportAll) { + printf(" %-15s %5s %7s %-15s %7s %-15s\n", + "NAME", "LEN", "HIGH ID", "(TO)", "LOW ID", "(TO)"); + printf(" --------------- ----- ------- --------------- ------- ---------------\n"); + } + + sum = 0.0; + worst_best = 1.0; + best_best = 0.0; + worst_worst = 1.0; + for (i = 0; i < msa->nseq; i++) { + worst = 1.0; + best = 0.0; + for (j = 0; j < msa->nseq; j++) { + /* closest seq to this one = best */ + if (i != j && ppdIdentMx[i][j] > best) { + best = ppdIdentMx[i][j]; bestj = j; + } + if (ppdIdentMx[i][j] < worst) { + worst = ppdIdentMx[i][j]; worstj = j; + } + } + + if (bReportAll) { + printf("* %-15s %5d %7.1f %-15s %7.1f %-15s\n", + msa->sqname[i], DealignedLength(msa->aseq[i]), + best * 100., msa->sqname[bestj], + worst * 100., msa->sqname[worstj]); + } + if (best > best_best) best_best = best; + if (best < worst_best) worst_best = best; + if (worst < worst_worst) worst_worst = worst; + for (j = 0; j < i; j++) + sum += ppdIdentMx[i][j]; + } + avgid = sum / (float) (msa->nseq * (msa->nseq-1)/2.0); + if (bReportAll) + puts(""); + FMX2Free(ppdIdentMx); + } /* else bSampling */ + + + + /* Print output + */ + if (msa->name != NULL) + printf("Alignment name: %s\n", msa->name); + /*printf("Format: %s\n", SeqfileFormat2String(afp->format));*/ + printf("Number of sequences: %d\n", msa->nseq); + printf("Total # residues: %d\n", nres); + printf("Smallest: %d\n", small); + printf("Largest: %d\n", large); + printf("Average length: %.1f\n", (float) nres / (float) msa->nseq); + printf("Alignment length: %d\n", msa->alen); + printf("Average identity: %.2f%%\n", 100.*avgid); + + if (! bSampling) { + printf("Most related pair: %.2f%%\n", 100.*best_best); + printf("Most unrelated pair: %.2f%%\n", 100.*worst_worst); + printf("Most distant seq: %.2f%%\n", 100.*worst_best); + } + + /* + char *cs; + cs = MajorityRuleConsensus(msa->aseq, msa->nseq, msa->alen); + printf cs; + */ + + MSAFree(msa); +} +/* end of AliStat() */ + + + + + +/** + * @brief Shuffle mseq order + * + * @param[out] mseq + * mseq structure to shuffle + * + */ +void +ShuffleMSeq(mseq_t *mseq) +{ + int iSeqIndex; + int *piPermArray; + + + /* quick and dirty: create an array with permuted indices and + * swap accordingly (which amounts to shuffling twice) + */ + + PermutationArray(&piPermArray, mseq->nseqs); + + for (iSeqIndex=0; iSeqIndex<mseq->nseqs; iSeqIndex++) { + SeqSwap(mseq, piPermArray[iSeqIndex], iSeqIndex); + } + + CKFREE(piPermArray); +} +/*** end: ShuffleMSeq() ***/ + + +/** + * @brief Swap two sequences in an mseq_t structure. + * + * @param[out] prMSeq + * Multiple sequence struct + * @param[in] i + * Index of first sequence + * @param[in] j + * Index of seconds sequence + * + * + */ +void +SeqSwap(mseq_t *prMSeq, int i, int j) +{ + char *pcTmp; + SQINFO rSqinfoTmp; + + assert(NULL!=prMSeq); + assert(i<prMSeq->nseqs && j<prMSeq->nseqs); + + if (i==j) { + return; + } + + pcTmp = prMSeq->seq[i]; + prMSeq->seq[i] = prMSeq->seq[j]; + prMSeq->seq[j] = pcTmp; + + pcTmp = prMSeq->orig_seq[i]; + prMSeq->orig_seq[i] = prMSeq->orig_seq[j]; + prMSeq->orig_seq[j] = pcTmp; + + rSqinfoTmp = prMSeq->sqinfo[i]; + prMSeq->sqinfo[i] = prMSeq->sqinfo[j]; + prMSeq->sqinfo[j] = rSqinfoTmp; + + return; +} +/*** end: SeqSwap() ***/ + + + + +/** + * @brief Dealigns all sequences in mseq structure, updates the + * sequence length info and sets aligned to FALSE + * + * @param[out] mseq + * The mseq structure to dealign + * + */ +void +DealignMSeq(mseq_t *mseq) +{ + int i; /* aux */ + for (i=0; i<mseq->nseqs; i++) { + DealignSeq(mseq->seq[i]); + mseq->sqinfo[i].len = strlen(mseq->seq[i]); + } + mseq->aligned = FALSE; + + return; +} +/*** end: DealinMSeq() ***/ + + + +/** + * @brief debug output of sqinfo struct + * + * @param[in] sqinfo + * Squid's SQINFO struct for a certain seqeuence + * + * @note useful for debugging only + * + */ +void +LogSqInfo(SQINFO *sqinfo) +{ + + /*LOG_DEBUG("sqinfo->flags = %d", sqinfo->flags);*/ + if (sqinfo->flags & SQINFO_NAME) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->name = %s", sqinfo->name); + + if (sqinfo->flags & SQINFO_ID) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->id = %s", sqinfo->id); + + if (sqinfo->flags & SQINFO_ACC) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->acc = %s", sqinfo->acc); + + if (sqinfo->flags & SQINFO_DESC) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->desc = %s", sqinfo->desc); + + if (sqinfo->flags & SQINFO_LEN) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->len = %d", sqinfo->len); + + if (sqinfo->flags & SQINFO_START) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->start = %d", sqinfo->start); + + if (sqinfo->flags & SQINFO_STOP) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->stop = %d", sqinfo->stop); + + if (sqinfo->flags & SQINFO_OLEN) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->olen = %d", sqinfo->olen); + + if (sqinfo->flags & SQINFO_TYPE) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->type = %d", sqinfo->type); + + if (sqinfo->flags & SQINFO_SS) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->ss = %s", sqinfo->ss); + + if (sqinfo->flags & SQINFO_SA) + Log(&rLog, LOG_FORCED_DEBUG, "sqinfo->sa = %s", sqinfo->sa); +} +/*** end: log_sqinfo ***/ + + +/** + * @brief convert int-encoded seqtype to string + * + * @param[in] seqtype int-encoded sequence type + * + * @return character pointer describing the sequence type + * + */ +const char* +SeqTypeToStr(int seqtype) +{ + switch (seqtype) { + case SEQTYPE_DNA: + return "DNA"; + case SEQTYPE_RNA: + return "RNA"; + case SEQTYPE_PROTEIN: + return "Protein"; + case SEQTYPE_UNKNOWN: + return "UNKNOWN"; + default: + Log(&rLog, LOG_FATAL, "Internal error in %s", __FUNCTION__); + } + return "Will never get here"; +} +/*** end: seqtype_to_str ***/ + + + +/** + * @brief reads sequences from file + * + * @param[out] prMSeq + * Multiple sequence struct. Must be preallocated. + * FIXME: would make more sense to allocate it here. + * @param[in] seqfile + * Sequence file name. If '-' sequence will be read from stdin. + * @param[in] seqtype + * int-encoded sequence type. Set to + * SEQTYPE_UNKNOWN for autodetect (guessed from first sequence) + * @param[in] iMaxNumSeq + * Return an error, if more than iMaxNumSeq have been read + * @param[in] iMaxSeqLen + * Return an error, if a seq longer than iMaxSeqLen has been read + * + * @return 0 on success, -1 on error + * + * @note + * - Depends heavily on squid + * - Sequence file format will be guessed + * - If supported by squid, gzipped files can be read as well. + */ +int +ReadSequences(mseq_t *prMSeq, char *seqfile, int seqtype, + int iMaxNumSeq, int iMaxSeqLen) +{ + int fmt = SQFILE_UNKNOWN; /* file format: auto detect if unknown */ + SQFILE *dbfp; /* sequence file descriptor */ + char *cur_seq; + SQINFO cur_sqinfo; + int iSeqIdx; /* sequence counter */ + int iSeqPos; /* sequence string position counter */ + + assert(NULL!=seqfile); + + + /* Try to work around inability to autodetect from a pipe or .gz: + * assume FASTA format + */ + if (SQFILE_UNKNOWN == fmt && + (Strparse("^.*\\.gz$", seqfile, 0) || strcmp(seqfile, "-") == 0)) { + fmt = SQFILE_FASTA; + } + + /* Using squid routines to read input. taken from seqstat_main.c. we don't + * know if input is aligned, so we use SeqfileOpen instead of MSAFileOpen + * etc. NOTE this also means we discard some information, e.g. when + * reading from and writing to a stockholm file, all extra MSA + * info/annotation will be lost. + * + */ + + if (NULL == (dbfp = SeqfileOpen(seqfile, fmt, NULL))) { + Log(&rLog, LOG_ERROR, "Failed to open sequence file %s for reading", seqfile); + return -1; + } + + + /* FIXME squid's ReadSeq() will exit with fatal error if format is + * unknown. This will be a problem for a GUI. Same is true for many squid + * other functions. + * + * The original squid:ReadSeq() dealigns sequences on input. We + * use a patched version. + * + */ + while (ReadSeq(dbfp, dbfp->format, + &cur_seq, + &cur_sqinfo)) { + + if (prMSeq->nseqs+1>iMaxNumSeq) { + Log(&rLog, LOG_ERROR, "Maximum number of sequences (=%d) exceeded after reading sequence '%s' from '%s'", + iMaxNumSeq, cur_sqinfo.name, seqfile); + return -1; + } + if ((int)strlen(cur_seq)>iMaxSeqLen) { + Log(&rLog, LOG_ERROR, "Sequence '%s' has %d residues and is therefore longer than allowed (max. sequence length is %d)", + cur_sqinfo.name, strlen(cur_seq), iMaxSeqLen); + return -1; + } + + /* FIXME: use modified version of AddSeq() that allows handing down SqInfo + */ + + prMSeq->seq = (char **) + CKREALLOC(prMSeq->seq, (prMSeq->nseqs+1) * sizeof(char *)); + prMSeq->seq[prMSeq->nseqs] = CkStrdup(cur_seq); + + + prMSeq->sqinfo = (SQINFO *) + CKREALLOC(prMSeq->sqinfo, (prMSeq->nseqs+1) * sizeof(SQINFO)); + SeqinfoCopy(&prMSeq->sqinfo[prMSeq->nseqs], &cur_sqinfo); + +#ifdef TRACE + Log(&rLog, LOG_FORCED_DEBUG, "seq no %d: seq = %s", prMSeq->nseqs, prMSeq->seq[prMSeq->nseqs]); + LogSqInfo(&prMSeq->sqinfo[prMSeq->nseqs]); +#endif + /* always guess type from first seq. use squid function and + * convert value + */ + if (0 == prMSeq->nseqs) { + int type = Seqtype(prMSeq->seq[prMSeq->nseqs]); + switch (type) { + case kDNA: + prMSeq->seqtype = SEQTYPE_DNA; + break; + case kRNA: + prMSeq->seqtype = SEQTYPE_RNA; + break; + case kAmino: + prMSeq->seqtype = SEQTYPE_PROTEIN; + break; + case kOtherSeq: + prMSeq->seqtype = SEQTYPE_UNKNOWN; + break; + default: + Log(&rLog, LOG_FATAL, "Internal error in %s", __FUNCTION__); + } + + /* override with given sequence type but check with + * automatically detected type and warn if necessary + */ + if (SEQTYPE_UNKNOWN != seqtype) { + if (prMSeq->seqtype != seqtype) { + Log(&rLog, LOG_WARN, "Overriding automatically determined seq-type %s to %s as requested", + SeqTypeToStr(prMSeq->seqtype), SeqTypeToStr(seqtype)); + prMSeq->seqtype = seqtype; + } + } + /* if type could not be determined and was not set return error */ + if (SEQTYPE_UNKNOWN == seqtype && SEQTYPE_UNKNOWN == prMSeq->seqtype) { + Log(&rLog, LOG_ERROR, "Couldn't guess sequence type from first sequence"); + FreeSequence(cur_seq, &cur_sqinfo); + SeqfileClose(dbfp); + return -1; + } + } + + Log(&rLog, LOG_DEBUG, "seq-no %d: type=%s name=%s len=%d seq=%s", + prMSeq->nseqs, SeqTypeToStr(prMSeq->seqtype), + prMSeq->sqinfo[prMSeq->nseqs].name, prMSeq->sqinfo[prMSeq->nseqs].len, + prMSeq->seq[prMSeq->nseqs]); + + /* FIXME IPUAC and/or case conversion? If yes see + * corresponding squid functions. Special treatment of + * Stockholm tilde-gaps for ktuple code? + */ + + prMSeq->nseqs++; + + FreeSequence(cur_seq, &cur_sqinfo); + } + SeqfileClose(dbfp); + +#if ALLOW_ONLY_PROTEIN + if (SEQTYPE_PROTEIN != prMSeq->seqtype) { + Log(&rLog, LOG_FATAL, "Sequence type is %s. %s only works on protein.", + SeqTypeToStr(prMSeq->seqtype), PACKAGE_NAME); + } +#endif + + /* Check if sequences are aligned */ + prMSeq->aligned = SeqsAreAligned(prMSeq); + + + /* keep original sequence as copy and convert "working" sequence + * + */ + prMSeq->orig_seq = (char**) CKMALLOC(prMSeq->nseqs * sizeof(char *)); + for (iSeqIdx=0; iSeqIdx<prMSeq->nseqs; iSeqIdx++) { + + prMSeq->orig_seq[iSeqIdx] = CkStrdup(prMSeq->seq[iSeqIdx]); + + + /* convert unknown characters according to set seqtype + * be conservative, i.e. don't allow any fancy ambiguity + * characters to make sure that ktuple code etc. works. + */ + + /* first on the fly conversion between DNA and RNA + */ + if (prMSeq->seqtype==SEQTYPE_DNA) + ToDNA(prMSeq->seq[iSeqIdx]); + if (prMSeq->seqtype==SEQTYPE_RNA) + ToRNA(prMSeq->seq[iSeqIdx]); + + /* then check of each character + */ + for (iSeqPos=0; iSeqPos<(int)strlen(prMSeq->seq[iSeqIdx]); iSeqPos++) { + char *res = &(prMSeq->seq[iSeqIdx][iSeqPos]); + if (isgap(*res)) + continue; + + if (prMSeq->seqtype==SEQTYPE_PROTEIN) { + if (NULL == strchr(AMINO_ALPHABET, toupper(*res))) { + *res = AMINOACID_ANY; + } + } else if (prMSeq->seqtype==SEQTYPE_DNA) { + if (NULL == strchr(DNA_ALPHABET, toupper(*res))) { + *res = NUCLEOTIDE_ANY; + } + } else if (prMSeq->seqtype==SEQTYPE_RNA) { + if (NULL == strchr(RNA_ALPHABET, toupper(*res))) { + *res = NUCLEOTIDE_ANY; + } + } + } + } + + + prMSeq->filename = CkStrdup(seqfile); + Log(&rLog, LOG_INFO, "Read %d sequences (type: %s) from %s", + prMSeq->nseqs, SeqTypeToStr(prMSeq->seqtype), prMSeq->filename); + + return 0; +} +/*** end: ReadSequences ***/ + + +/** + * @brief allocate and initialise new mseq_t + * + * @param[out] prMSeq + * newly allocated and initialised mseq_t + * + * @note caller has to free by calling FreeMSeq() + * + * @see FreeMSeq + * + */ +void +NewMSeq(mseq_t **prMSeq) +{ + *prMSeq = (mseq_t *) CKMALLOC(1 * sizeof(mseq_t)); + + (*prMSeq)->nseqs = 0; + (*prMSeq)->seq = NULL; + (*prMSeq)->orig_seq = NULL; + (*prMSeq)->seqtype = SEQTYPE_UNKNOWN; + (*prMSeq)->sqinfo = NULL; + (*prMSeq)->filename = NULL; +} +/*** end: NewMSeq ***/ + + + +/** + * @brief copies an mseq structure + * + * @param[out] prMSeqDest_p + * Copy of mseq structure + * @param[in] prMSeqSrc + * Source mseq structure to copy + * + * @note caller has to free copy by calling FreeMSeq() + * + */ +void +CopyMSeq(mseq_t **prMSeqDest_p, mseq_t *prMSeqSrc) +{ + int i; + assert(prMSeqSrc != NULL && prMSeqDest_p != NULL); + + NewMSeq(prMSeqDest_p); + + (*prMSeqDest_p)->nseqs = prMSeqSrc->nseqs; + (*prMSeqDest_p)->seqtype = prMSeqSrc->seqtype; + if (prMSeqSrc->filename!=NULL) { + (*prMSeqDest_p)->filename = CkStrdup(prMSeqSrc->filename); + } + + (*prMSeqDest_p)->seq = (char **) + CKMALLOC((*prMSeqDest_p)->nseqs * sizeof(char *)); + (*prMSeqDest_p)->orig_seq = (char **) + CKMALLOC((*prMSeqDest_p)->nseqs * sizeof(char *)); + (*prMSeqDest_p)->sqinfo = (SQINFO *) + CKMALLOC((*prMSeqDest_p)->nseqs * sizeof(SQINFO)); + + + + for (i=0; i<(*prMSeqDest_p)->nseqs; i++) { + (*prMSeqDest_p)->seq[i] = CkStrdup(prMSeqSrc->seq[i]); + (*prMSeqDest_p)->orig_seq[i] = CkStrdup(prMSeqSrc->orig_seq[i]); + SeqinfoCopy(&(*prMSeqDest_p)->sqinfo[i], &prMSeqSrc->sqinfo[i]); + } +} +/*** end: CopyMSeq ***/ + + + +/** + * @brief + * + * @param[in] seqname + * The sequence name to search for + * @param[in] mseq + * The multiple sequence structure to search in + * + * @return -1 on failure, sequence index of matching name otherwise + * + * @warning If sequence name happens to be used twice, only the first + * one will be reported back + * + */ +int +FindSeqName(char *seqname, mseq_t *mseq) +{ + int i; /* aux */ + + assert(NULL!=mseq); + + for (i=0; i<mseq->nseqs; i++) { + if (STR_EQ(mseq->sqinfo[i].name, seqname)) { + return i; + } + } + + return -1; +} +/*** end: FindSeqName() ***/ + + +/** + * @brief Frees an mseq_t and it's members and zeros all members + * + * @param[in] mseq mseq_to to free + * + * @note use in conjunction with NewMSeq() + * @see new_mseq + */ +void +FreeMSeq(mseq_t **mseq) +{ + int i; + + if (NULL==(*mseq)) { + return; + } + + if ((*mseq)->filename) { + (*mseq)->filename = CKFREE((*mseq)->filename); + } + + for (i=0; i<(*mseq)->nseqs; i++) { + FreeSequence((*mseq)->seq[i], &(*mseq)->sqinfo[i]); + CKFREE((*mseq)->orig_seq[i]); + } + if ((*mseq)->seq) { + CKFREE((*mseq)->seq); + } + if ((*mseq)->orig_seq) { /* FIXME (FS): only ptr to ptr freed, actual sequences NOT freed*/ + CKFREE((*mseq)->orig_seq); + } + if ((*mseq)->sqinfo) { + CKFREE((*mseq)->sqinfo); + } + + (*mseq)->seqtype = SEQTYPE_UNKNOWN; + (*mseq)->nseqs = 0; + + CKFREE((*mseq)); +} +/*** end: FreeMSeq ***/ + + +/** + * @brief Write alignment to file. + * + * @param[in] mseq + * The mseq_t struct containing the aligned sequences + * @param[in] pcAlnOutfile + * The name of the output file + * @param[in] outfmt + * The alignment output format (defined in squid.h) + * + * @return Non-zero on error + * + * @note We create a temporary squid MSA struct in here because we never + * use it within clustal. We might be better of using the old clustal + * output routines instead. + * + */ +int +WriteAlignment(mseq_t *mseq, const char *pcAlnOutfile, int outfmt) +{ + int i; /* aux */ + MSA *msa; /* squid's alignment structure */ + FILE *pfOut = NULL; + int key; /* MSA struct internal index for sequence */ + int alen; /* alignment length */ + bool use_stdout; + + assert(mseq!=NULL); + + if (MSAFILE_UNKNOWN == outfmt) { + Log(&rLog, LOG_ERROR, "Unknown output format chosen"); + return -1; + } + + if (NULL == pcAlnOutfile) { + pfOut = stdout; + use_stdout = TRUE; + } else { + use_stdout = FALSE; + if (NULL == (pfOut = fopen(pcAlnOutfile, "w"))) { + Log(&rLog, LOG_ERROR, "Could not open file %s for writing", pcAlnOutfile); + return -1; + } + } + + + /* derive alignment length from first seq */ + alen = strlen(mseq->seq[0]); + + msa = MSAAlloc(mseq->nseqs, alen); + + /* basic structure borrowed code from squid-1.9g/a2m.c:ReadA2M() + * we actually create a copy of mseq. keeping the pointers becomes + * messy when calling MSAFree() + */ + for (i=0; i<mseq->nseqs; i++) { + char *this_name = mseq->sqinfo[i].name; /* mseq sequence name */ + char *this_seq = mseq->seq[i]; /* mseq sequence */ + SQINFO *this_sqinfo = &mseq->sqinfo[i]; /* mseq sequence name */ + + key = GKIStoreKey(msa->index, this_name); + msa->sqname[key] = sre_strdup(this_name, strlen(this_name)); + + /* setting msa->sqlen[idx] and msa->aseq[idx] */ + msa->sqlen[key] = sre_strcat(&(msa->aseq[key]), msa->sqlen[key], + this_seq, strlen(this_seq)); + + if (this_sqinfo->flags & SQINFO_DESC) { + /* FIXME never get here ... */ + MSASetSeqDescription(msa, key, this_sqinfo->desc); + } + /* FIXME extend this by copying more stuff according to flags. + * See MSAFileRead() in msa.c and used functions there + * + * Problem is that we never parse MSA information as we use squid'sSeqFile + */ + + msa->nseq++; + } + + + /* FIXME Would like to, but can't use MSAVerifyParse(msa) here, as it + * will die on error. Need to implement our own version + */ +#if 0 + MSAVerifyParse(msa); +#endif + + /* The below is copy of MSAFileWrite() which originally only writes to stdout. + */ + + /* Be sloppy and make a2m and fasta the same. same for vienna (which is + the same). same same. can can. boleh boleh */ + if (outfmt==SQFILE_FASTA) + outfmt = MSAFILE_A2M; + if (outfmt==SQFILE_VIENNA) + outfmt = MSAFILE_VIENNA; + + switch (outfmt) { + case MSAFILE_A2M: + WriteA2M(pfOut, msa, 0); + break; + case MSAFILE_VIENNA: + WriteA2M(pfOut, msa, 1); + break; + case MSAFILE_CLUSTAL: + WriteClustal(pfOut, msa); + break; + case MSAFILE_MSF: + WriteMSF(pfOut, msa); + break; + case MSAFILE_PHYLIP: + WritePhylip(pfOut, msa); + break; + case MSAFILE_SELEX: + WriteSELEX(pfOut, msa); + break; + case MSAFILE_STOCKHOLM: + WriteStockholm(pfOut, msa); + break; + default: + Log(&rLog, LOG_FATAL, "internal error: %s", + "invalid output format should have been detected before"); + } + + if (use_stdout == FALSE) { + (void) fclose(pfOut); + Log(&rLog, LOG_INFO, + "Alignment written to %s", pcAlnOutfile); + } + MSAFree(msa); + + return 0; +} +/*** end of WriteAlignment() ***/ + + +/** + * @brief Removes all gap-characters from a sequence. + * + * @param[out] seq + * Sequence to dealign + * + * @note seq will not be reallocated + */ +void +DealignSeq(char *seq) +{ + int aln_pos; + int dealn_pos; + + assert(seq!=NULL); + + dealn_pos=0; + for (aln_pos=0; aln_pos<(int)strlen(seq); aln_pos++) { + if (! isgap(seq[aln_pos])) { + seq[dealn_pos++] = seq[aln_pos]; + } + } + seq[dealn_pos] = '\0'; + + return; +} +/*** end: DealignSeq() ***/ + + + +/** + * @brief Sort sequences by length + * + * @param[out] prMSeq + * mseq to sort by length + * @param[out] cOrder + * Sorting order. 'd' for descending, 'a' for ascending. + * + * + */ +void +SortMSeqByLength(mseq_t *prMSeq, const char cOrder) +{ + int *piSeqLen; + int *piOrder; + int iSeqIndex; + mseq_t *prMSeqCopy = NULL; + + assert('a'==cOrder || 'd'==cOrder); + + Log(&rLog, LOG_WARN, + "FIXME: This modifies sequence ordering. Might not be what user wants. Will change output order as well"); + + piSeqLen = (int *) CKMALLOC(prMSeq->nseqs * sizeof(int)); + piOrder = (int *) CKMALLOC(prMSeq->nseqs * sizeof(int)); + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + piSeqLen[iSeqIndex] = prMSeq->sqinfo[iSeqIndex].len; + } + QSortAndTrackIndex(piOrder, piSeqLen, prMSeq->nseqs, cOrder, FALSE); + + CopyMSeq(&prMSeqCopy, prMSeq); + for (iSeqIndex=0; iSeqIndex<prMSeq->nseqs; iSeqIndex++) { + /* copy mseq entry + */ + CKFREE(prMSeq->seq[iSeqIndex]); + prMSeq->seq[iSeqIndex] = CkStrdup(prMSeqCopy->seq[piOrder[iSeqIndex]]); + + CKFREE(prMSeq->orig_seq[iSeqIndex]); + prMSeq->orig_seq[iSeqIndex] = CkStrdup(prMSeqCopy->orig_seq[piOrder[iSeqIndex]]); + + SeqinfoCopy(&prMSeq->sqinfo[iSeqIndex], &prMSeqCopy->sqinfo[piOrder[iSeqIndex]]); + } + + CKFREE(piSeqLen); + CKFREE(piOrder); + FreeMSeq(&prMSeqCopy); + + return; +} +/*** end: SortMSeqByLength() ***/ + + + +/** + * @brief Checks if sequences in given mseq structure are aligned. By + * definition this is only true, if sequences are of the same length + * and at least one gap was found + * + * @param[in] prMSeq + * Sequences to check + * + * @return TRUE if sequences are aligned, FALSE if not + * + * + */ +bool +SeqsAreAligned(mseq_t *prMSeq) +{ + bool bGapFound, bSameLength; + int iSeqIdx; /* sequence counter */ + int iSeqPos; /* sequence string position counter */ + + /* Special case of just one sequence: + * it is arguable that a single sequence qualifies as a profile, + * however, this is what we do at the first stage of MSA anyway. + * So, if there is only 1 sequence it is a 1-profile + * and it is (defined to be) aligned (with itself). FS, r240 -> 241 + */ + if (1 == prMSeq->nseqs) { + return TRUE; + } + + + /* Check if sequences are aligned. For being aligned, the + * sequences have to be of same length (bSameLength) and at least + * one of them has to contain at least one gap (bGapFound) + */ + bGapFound = FALSE; + bSameLength = TRUE; + for (iSeqIdx=0; iSeqIdx<prMSeq->nseqs; iSeqIdx++) { + if (FALSE == bGapFound) { + for (iSeqPos=0; + iSeqPos<prMSeq->sqinfo[iSeqIdx].len && false==bGapFound; + iSeqPos++) { + if (isgap(prMSeq->seq[iSeqIdx][iSeqPos])) { + bGapFound = TRUE; + /* skip rest of sequence */ + break; + } + } + } + + if (iSeqIdx>0) { + if (prMSeq->sqinfo[iSeqIdx].len != prMSeq->sqinfo[iSeqIdx-1].len) { + bSameLength = FALSE; + /* no need to continue search, bSameLength==FALSE is + * sufficient condition */ + break; + } + } + } +#if 0 + Log(&rLog, LOG_FORCED_DEBUG, "bSameLength=%d bGapFound=%d", bSameLength, bGapFound); +#endif + if (TRUE == bSameLength && TRUE == bGapFound) { + return TRUE; + } else { + return FALSE; + } + +} +/*** end: SeqsAreAligned() ***/ + + + +/** + * @brief Creates a new sequence entry and appends it to an existing mseq + * structure. + * + * @param[out] prMSeqDest_p + * Already existing and initialised mseq structure + * @param[in] pcSeqName + * sequence name of the sequence to add + * @param[in] pcSeqRes + * the actual sequence (residues) to add + * + * @note Don't forget to update the align and type flag if necessary! + * + * FIXME allow adding of more features + * + */ +void +AddSeq(mseq_t **prMSeqDest_p, char *pcSeqName, char *pcSeqRes) +{ + int iSeqIdx = 0; + SQINFO sqinfo; + + assert(NULL != prMSeqDest_p); + assert(NULL != pcSeqName); + assert(NULL != pcSeqRes); + + iSeqIdx = (*prMSeqDest_p)->nseqs; + + (*prMSeqDest_p)->seq = (char **) + CKREALLOC((*prMSeqDest_p)->seq, (iSeqIdx+1) * sizeof(char *)); + (*prMSeqDest_p)->orig_seq = (char **) + CKREALLOC((*prMSeqDest_p)->orig_seq, (iSeqIdx+1) * sizeof(char *)); + (*prMSeqDest_p)->sqinfo = (SQINFO *) + CKREALLOC((*prMSeqDest_p)->sqinfo, (iSeqIdx+1) * sizeof(SQINFO)); + + + (*prMSeqDest_p)->seq[iSeqIdx] = CkStrdup(pcSeqRes); + (*prMSeqDest_p)->orig_seq[iSeqIdx] = CkStrdup(pcSeqRes); + + /* should probably get ri of SqInfo altogether in the long run and just + transfer the intersting members into our own struct + */ + sqinfo.flags = 0; /* init */ + + sqinfo.len = strlen(pcSeqRes); + sqinfo.flags |= SQINFO_LEN; + + /* name is an array of SQINFO_NAMELEN length */ + strncpy(sqinfo.name, pcSeqName, SQINFO_NAMELEN-1); + sqinfo.name[SQINFO_NAMELEN-1] = '\0'; + sqinfo.flags |= SQINFO_NAME; + + SeqinfoCopy(&(*prMSeqDest_p)->sqinfo[iSeqIdx], + & sqinfo); + + (*prMSeqDest_p)->nseqs++; + + return; +} +/* end of AddSeq() */ + + + + +/** + * @brief Appends an mseq structure to an already existing one. + * filename will be left untouched. + * + * @param[in] prMSeqDest_p + * MSeq structure to which to append to + * @param[out] prMSeqToAdd + * MSeq structure which is to append + * + * + */ +void +JoinMSeqs(mseq_t **prMSeqDest_p, mseq_t *prMSeqToAdd) +{ + int iSrcSeqIndex; + int iNewNSeq; + + assert(NULL != prMSeqDest_p && NULL != (*prMSeqDest_p)); + assert(NULL != prMSeqToAdd); + + if (0 == prMSeqToAdd->nseqs) { + Log(&rLog, LOG_WARN, "Was asked to add 0 sequences"); + return; + } + + /* warn on seqtype mismatch and keep original seqtype */ + if ((*prMSeqDest_p)->seqtype != prMSeqToAdd->seqtype) { + Log(&rLog, LOG_WARN, "Joining sequences of different type"); + } + + /* leave filename as it is */ + + /* + * copy new seq/s, orig_seq/s, sqinfo/s + */ + iNewNSeq = (*prMSeqDest_p)->nseqs + prMSeqToAdd->nseqs; + + (*prMSeqDest_p)->seq = (char **) + CKREALLOC((*prMSeqDest_p)->seq, iNewNSeq * sizeof(char *)); + + (*prMSeqDest_p)->orig_seq = (char **) + CKREALLOC((*prMSeqDest_p)->orig_seq, iNewNSeq * sizeof(char *)); + + (*prMSeqDest_p)->sqinfo = (SQINFO *) + CKREALLOC((*prMSeqDest_p)->sqinfo, iNewNSeq * sizeof(SQINFO)); + + + for (iSrcSeqIndex=0; iSrcSeqIndex < prMSeqToAdd->nseqs; iSrcSeqIndex++) { + int iDstSeqIndex = (*prMSeqDest_p)->nseqs++; + + (*prMSeqDest_p)->seq[iDstSeqIndex] = + CkStrdup(prMSeqToAdd->seq[iSrcSeqIndex]); + + (*prMSeqDest_p)->orig_seq[iDstSeqIndex] = + CkStrdup(prMSeqToAdd->orig_seq[iSrcSeqIndex]); + + SeqinfoCopy(&(*prMSeqDest_p)->sqinfo[iDstSeqIndex], + & prMSeqToAdd->sqinfo[iSrcSeqIndex]); + } + + (*prMSeqDest_p)->nseqs = iNewNSeq; + + (*prMSeqDest_p)->aligned = SeqsAreAligned(*prMSeqDest_p); + + return; +} +/*** end: JoinMSeqs() ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/seq.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,164 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: seq.h 234 2011-04-13 05:26:16Z andreas $ + */ + +#ifndef CLUSTALO_SEQ_H +#define CLUSTALO_SEQ_H + +#include "squid/squid.h" + +#include "util.h" + + +/** + * int-encoded sequence types. + * these are in sync with squid's seqtypes and only used for + * convenience here + */ +#define SEQTYPE_UNKNOWN kOtherSeq +#define SEQTYPE_DNA kDNA +#define SEQTYPE_RNA kRNA +#define SEQTYPE_PROTEIN kAmino + +/* Alphabets are defined in squid.h: AMINO_ALPHABET, DNA_ALPHABET, + * RNA_ALPHABET (all uppercase) + */ +#define AMINOACID_ANY 'X' +#define NUCLEOTIDE_ANY 'N' + +/** + * @brief structure for storing multiple sequences + * + */ +typedef struct { + int nseqs; /**< number of sequences */ + int seqtype; /**< sequence type */ + char *filename; /**< input file / source of sequences */ + bool aligned; /**< true if all seqs are same length **/ + + /** (working) sequence residues as char pointer. + * range for first index: 0--nseq-1. + * changes during alignment. + */ + char **seq; + + /** original sequence residues as char pointer. + * range for first index: 0--nseq-1. + * only set during input + */ + char **orig_seq; + + /** + * @brief Squid's sequence info structure. + * Index range: 0--nseq-1. + * + * extra data are available: + * int flags; + * + * name: + * char name[SQINFO_NAMELEN]; + * + * database identifier: + * char id[SQINFO_NAMELEN]; + * + * database accession no: + * char acc[SQINFO_NAMELEN]; + * + * description: + * char desc[SQINFO_DESCLEN]; + * + * length of this seq, incl gaps in our case!: + * int len; + * + * start position on source seq (valid range: 1..len): + * int start; + * + * end position on source seq (valid range: 1..len): + * int stop; + * + * original length of source seq: + * int olen; + * + * kRNA, kDNA, kAmino, or kOther: + * int type; + * + * secondary structure string (index range: 0..len-1): + * char *ss; + * + * percent side chain surface access (index range: 0..len-1): + * char *sa; + * + * @see squid.h + * @see LogSqInfo() + * + */ + SQINFO *sqinfo; +} mseq_t; + +extern void +AliStat(mseq_t *prMSeq, bool bSampling, bool bReportAll); + +extern void +AddSeq(mseq_t **prMSeqDest_p, char *pcSeqName, char *pcSeqRes); + +extern void +SeqSwap(mseq_t *mseq, int i, int j); + +extern void +DealignMSeq(mseq_t *mseq); + +extern const char * +SeqTypeToStr(int seqtype); + +extern int +ReadSequences(mseq_t *prMSeq_p, char *pcSeqFile, int iSeqType, + int iMaxNumSeq, int iMaxSeqLen); + +extern void +NewMSeq(mseq_t **mseq); + +extern void +FreeMSeq(mseq_t **mseq); + +extern void +CopyMSeq(mseq_t **prMSeqDest_p, mseq_t *prMSeqSrc); + +extern void +LogSqInfo(SQINFO *sqinfo); + +extern int +FindSeqName(char *seqname, mseq_t *mseq); + +extern int +WriteAlignment(mseq_t *mseq, const char *aln_outfile, int msafile_format); + +extern void +DealignSeq(char *seq); + +extern void +ShuffleMSeq(mseq_t *prMSeq); + +extern void +SortMSeqByLength(mseq_t *prMSeq, const char cOrder); + +void +JoinMSeqs(mseq_t **prMSeqDest_p, mseq_t *prMSeqToAdd); + +bool +SeqsAreAligned(mseq_t *prMSeq); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/symmatrix.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,496 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: symmatrix.c 230 2011-04-09 15:37:50Z andreas $ + * + * + * Functions for symmetric (square) matrices including diagonal. + * supports the notion of non-square sub-matrices of a symmetric + * matrix, i.e. where |rows|<|cols|. + * + * FIXME Allocating one big chunk of memory is probably + * much faster and also easier to maintain. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <assert.h> +#include "symmatrix.h" + + +#if 0 +#define DEBUG +#endif + +#define MAX_BUF_SIZE 65536 + +/** + * @brief Allocates symmat and its members and initialises them. Data + * will be calloced, i.e. initialised with zeros. + * + * @param[out] symmat + * newly allocated and initialised symmatrix instance + * @param[in] nrows + * number of rows + * @param[in] + * ncols number of columns + * + * @return: non-zero on error + * + * @see FreeSymMatrix() + * + * @note: symmat data will be of fake shape nrows x ncols + * + */ +int +NewSymMatrix(symmatrix_t **symmat, int nrows, int ncols) +{ + int i; /* aux */ + + assert(nrows>0 && ncols>0 && ncols>=nrows); + assert(ncols>0 && ncols>=nrows); + + (*symmat) = (symmatrix_t *) malloc(1*sizeof(symmatrix_t)); + if (NULL == (*symmat)) { + fprintf(stderr, "Couldn't allocate memory (%s|%s)\n", + __FILE__, __FUNCTION__); + return -1; + } + + (*symmat)->data = (double **) malloc(nrows * sizeof(double *)); + if (NULL == (*symmat)->data) { + fprintf(stderr, "Couldn't allocate memory (%s|%s)\n", + __FILE__, __FUNCTION__); + free(*symmat); + *symmat = NULL; + return -1; + } + for (i=0; i<nrows; i++) { + (*symmat)->data[i] = (double *) calloc((ncols-i), sizeof(double)); + if (NULL == (*symmat)->data[i]) { + fprintf(stderr, "Couldn't allocate memory (%s|%s)\n", + __FILE__, __FUNCTION__); + while (0!=--i) { + free((*symmat)->data[i]); + } + free((*symmat)->data); + free(*symmat); + *symmat = NULL; + return -1; + } +#ifdef TRACE + fprintf(stderr, "DEBUG(%s|%s():%d) initialising symmat with the number of the beast\n", + __FILE__, __FUNCTION__, __LINE__); + { + int j; + for (j=0; j<ncols-i; j++) { + (*symmat)->data[i][j] = -666.0; + } + + } +#endif + } + + (*symmat)->nrows = nrows; + (*symmat)->ncols = ncols; + + return 0; +} +/*** end: new_symmatrix ***/ + + +/** + * @brief Sets symmat data of given index to given value + * + * @param[in] symmat + * symmatrix_t whose data is to be set + * @param[in] i + * first index + * @param[in] j + * second index + * @param[in] value + * value used to set data point + * + * @see SymMatrixGetValue() + * + * @note This is a convenience function that checks index order. + * + */ +void +SymMatrixSetValue(symmatrix_t *symmat, const int i, const int j, const double value) +{ + assert(NULL != symmat); + + if (i<=j) { + assert(i < symmat->nrows && j < symmat->ncols); + symmat->data[i][j-i] = value; + } else { + assert(j < symmat->nrows && i < symmat->ncols); + symmat->data[j][i-j] = value; + } +} +/*** end: symmatrix_setvalue ***/ + + + +/** + * @brief Returns element of symmat corresponding to given indices + * + * @param[in] symmat + * symmatrix_t of question + * @param[in] i + * index i + * @param[in] j + * index j + * + * @return requested value + * + * @see SymMatrixSetValue() + * + * @note This is a convenience function that checks index order. + */ +double +SymMatrixGetValue(symmatrix_t *symmat, const int i, const int j) +{ + assert(NULL != symmat); + + if (i<=j) { + assert(i < symmat->nrows && j < symmat->ncols); + return symmat->data[i][j-i]; + } else { + assert(j < symmat->nrows && i < symmat->ncols); + return symmat->data[j][i-j]; + } +} +/*** end: symmatrix_getvalue ***/ + + + + + +/** + * @brief Returns a pointer to an element of symmat corresponding to + * given indices + * + * @param[out] val + * Value to be set + * @param[in] symmat + * symmatrix_t of question + * @param[in] i + * index i + * @param[in] j + * index j + * + * @return pointer to value + * + * @see SymMatrixGetValue() + * + * @note This is a convenience function that checks index order. + * + */ +void +SymMatrixGetValueP(double **val, symmatrix_t *symmat, + const int i, const int j) +{ + assert(NULL != symmat); + + if (i<=j) { + assert(i < symmat->nrows && j < symmat->ncols); + *val = &(symmat->data[i][j-i]); + } else { + assert(j < symmat->nrows && i < symmat->ncols); + *val = &(symmat->data[j][i-j]); + } +} +/*** end: symmatrix_getvaluep ***/ + + +/** + * @brief Frees memory allocated by data members of symmat and symmat + * itself. + * + * @param[in] symmat + * symmatrix_t to be freed + * + * @note Use in conjunction with NewSymMatrix() + * + * @see NewSymMatrix() + * + */ +void +FreeSymMatrix(symmatrix_t **symmat) +{ + int i; + if (NULL != (*symmat)) { + if (NULL != (*symmat)->data) { + for (i=0; i<(*symmat)->nrows; i++) { + free((*symmat)->data[i]); + } + free((*symmat)->data); + } + } + free(*symmat); + *symmat = NULL; +} +/*** end: free_symmatrix ***/ + + + +/** + * @brief Print out a symmat in phylip style. Distances are printed on + * one line per sequence/object. Since we also support matrices with + * rows\<cols, the first line can also be nrows by ncolumns instead + * of just nrows + * + * @param[in] symmat + * the symmatrix_t to print + * @param[in] labels + * sequence/objects labels/names. must be at least of length symmat nrows + * @param[in] path + * filename or NULL. If NULL stdout will be used. + * + */ +void +SymMatrixPrint(symmatrix_t *symmat, char **labels, const char *path) +{ + FILE *fp = NULL; + int i, j; /* aux */ + int max_label_len = 0; + + if (NULL==symmat || NULL==labels) { + fprintf(stderr, + "One of the provided arguments is empty or NULL (print_matrix)\n"); + return; + } + if (NULL==path) { + fp = stdout; + } else { + if (NULL==(fp=fopen(path, "w"))) { + fprintf(stderr, "Couldn't open %s for writing.", path); + return; + } + } + + /* find maximum label length for pretty printing + */ + for (i=0; i<symmat->nrows; i++) { + int this_len; + assert(NULL != labels[i]); + this_len = strlen(labels[i]); + if (this_len>max_label_len) + max_label_len = this_len; + } + + if (symmat->ncols==symmat->nrows) { + fprintf(fp, "%u\n", symmat->ncols); + } else { + /* this is not standard phylip, but necessary to indicate + seed matrices */ + fprintf(fp, "%u x %u\n", symmat->nrows, symmat->ncols); + } + for (i=0; i<symmat->nrows; i++) { + /* phylip restriction is 10 characters. we don't care here + */ + fprintf(fp, "%-*s", max_label_len, labels[i]); + /* we are lazy and do it like fastdist: write all distances + * for one seq to one line + */ + for (j=0; j<symmat->ncols; j++) { + fprintf(fp, " %f", SymMatrixGetValue(symmat, i, j)); + } + fprintf(fp, "%s", "\n"); + } + if (NULL != path) { + (void) fclose(fp); + } else { + (void) fflush(fp); + } +} +/*** end: SymMatrixPrint ***/ + + + +/** + * + * @brief Read a distance matrix in phylip format + * + * @param[in] pcFileIn + * distance matrix filename + * @param[out] prSymMat_p + * the symmatrix_t. will be allocated here. + * @return: + * non-zero on error + * + * @note: + * FIXME untested code + */ +int +SymMatrixRead(char *pcFileIn, symmatrix_t **prSymMat_p) +{ + FILE *prFilePointer; + char *buf; + /* number of parsed sequences */ + int iNParsedSeq = 0; + /* number of parsed distances per sequence */ + int iNParsedDists = 0; + /* total number of sequences/objects */ + int iTotalNSeq = 0; + int iRetCode = 0; + + assert(NULL!=pcFileIn); + + /* FIXME: test correctness and implement label checking */ + fprintf(stderr, "WARNING: Reading of distance matrix from file not thoroughly tested!\n"); + fprintf(stderr, "WARNING: Assuming same order of sequences in sequence file and distance matrix file (matching of labels not implemented)\n"); + + if (NULL == (buf = (char *) malloc(MAX_BUF_SIZE * sizeof(char)))) { + fprintf(stderr, "ERROR: couldn't allocate memory at %s:%s:%d\n", + __FILE__, __FUNCTION__, __LINE__); + return -1; + } + + if (NULL == (prFilePointer = fopen(pcFileIn, "r"))) { + fprintf(stderr, "ERROR: Couldn't open %s for reading\n", pcFileIn); + free(buf); + return -1; + } + + /* get number of sequences from first line and allocate memory for + * distance matrix + * + */ + if (NULL == fgets(buf, MAX_BUF_SIZE, prFilePointer) ) { + fprintf(stderr, "Couldn't read first line from %s\n", pcFileIn); + iRetCode = -1; + goto closefile_and_freebuf; + } + if (strlen(buf)==MAX_BUF_SIZE-1) { + fprintf(stderr, "%s\n", "Looks like I couldn't read complete line. Wrong format (or too small MAX_BUF_SIZE)"); + iRetCode = -1; + goto closefile_and_freebuf; + } + if (sscanf(buf, "%d", &iTotalNSeq)!=1) { + fprintf(stderr, "ERROR: couldn't parse number of sequences from first line of %s\n", pcFileIn); + iRetCode = -1; + goto closefile_and_freebuf; + } + +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "iTotalNSeq parsed from %s is %d\n", pcFileIn, iTotalNSeq); +#endif + + if (NewSymMatrix(prSymMat_p, iTotalNSeq, iTotalNSeq)) { + fprintf(stderr, "FATAL %s", "Memory allocation for distance matrix failed"); + iRetCode = -1; + goto closefile_and_freebuf; + } + + + /* parse file line by line + * + */ + while (NULL != fgets(buf, MAX_BUF_SIZE, prFilePointer)) { + char *szToken; + int is_newseq; + + if (MAX_BUF_SIZE-1 == strlen(buf)) { + fprintf(stderr, "%s\n", "Looks like I couldn't read complete line. Wrong format (or too small MAX_BUF_SIZE)"); + iRetCode = -1; + goto closefile_and_freebuf; + } + +#ifdef DEBUG + Log(&rLog, LOG_FORCED_DEBUG, "Got line: %s\n", buf); +#endif + + /* new sequence label at beginning of line? + */ + if (isblank(buf[0])) { + is_newseq = 0; + } else { + is_newseq = 1; + } + + /* tokenise line and treat new sequence specially + */ + szToken = strtok(buf, " \t"); + if (is_newseq==1) { + iNParsedSeq++; + iNParsedDists=0; + + /* if format is lower dimensional matrix then first + * sequence has no distances but might have newline + * character at it's end. + */ + while (isspace(szToken[strlen(szToken)-1])) { + szToken[strlen(szToken)-1]='\0'; + } + /* FIXME save label? */ + szToken = strtok(NULL, " \t"); + } + /* from here on it's only parsing of distances */ + while (szToken != NULL) { + double dist; + iNParsedDists++; + + /* only parse what's needed */ + if (iNParsedDists!=iNParsedSeq) { + /* parse and store distance + */ + if (sscanf(szToken, "%lf", &dist)!=1) { + fprintf(stderr, "Couldn't parse float from entry '%s'\n", szToken); + iRetCode = -1; + goto closefile_and_freebuf; + } +#if TRACE + Log(&rLog, LOG_FORCED_DEBUG, "Parsed distance %d for seq %d = %f\n", iNParsedDists-1, iNParsedSeq-1, dist); +#endif + SymMatrixSetValue(*prSymMat_p, iNParsedSeq-1, iNParsedDists-1, dist); + SymMatrixSetValue(*prSymMat_p, iNParsedDists-1, iNParsedSeq-1, dist); + } + szToken = strtok(NULL, " \t"); + } + } + + if (iTotalNSeq!=iNParsedSeq) { + fprintf(stderr, "expected %d seqs, but only parsed %d\n", iTotalNSeq, iNParsedSeq); + iRetCode = -1; + goto closefile_and_freebuf; + } +#if TRACE + for (i=0; i<iNParsedSeq; i++) { + int j; + for (j=0; j<iNParsedSeq; j++) { + Log(&rLog, LOG_FORCED_DEBUG, "prSymMat_p[%d][%d]=%f\n", i, j, (*prSymMat_p)[i][j]); + } + } +#endif + +closefile_and_freebuf: + fclose(prFilePointer); + free(buf); + + return iRetCode; +} +/*** end: SymMatrixRead ***/ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/symmatrix.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,80 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: symmatrix.h 216 2011-03-19 10:11:53Z andreas $ + */ + +/** + * Functions for symmetric (square) matrices including diagonal. + * + * Supports the notion of non-square sub-matrices of a symmetric + * matrix, i.e. where |rows|<|cols| and the corresponding full matrix + * would be |cols|x|cols| + * + * Instead of making this one big chunk of memory we keep pointers to + * pointers, so that we can easily realloc (the project where this file + * originated from needed this for growing a "seed" matrix). + * + * FIXME Allocating one big chunk of memory is probably + * much faster and also easier to maintain. + * + * + */ + +#ifndef CLUSTALO_SYMMATRIX_H +#define CLUSTALO_SYMMATRIX_H + + +/** + * @brief symmetric matrix structure + */ +typedef struct { + int nrows; /**< number of rows */ + int ncols; /**< number of columns */ + /** + * stored data + * + * @note indices range: [i][j-i] i<=j. use getvalue() and + * setvalue() instead of accessing directly + * + * @see SymMatrixGetValue(), SymMatrixSetValue() + */ + double **data; +} symmatrix_t; + + + +extern int +NewSymMatrix(symmatrix_t **symmat, const int nrows, const int ncols); + +extern void +SymMatrixSetValue(symmatrix_t *symmat, const int i, const int j, const double value); + +extern double +SymMatrixGetValue(symmatrix_t *symmat, const int i, const int j); + +extern void +SymMatrixGetValueP(double **value, symmatrix_t *symmat, const int i, const int j); + +extern void +FreeSymMatrix(symmatrix_t **symmat); + +extern void +SymMatrixPrint(symmatrix_t *symmat, char **labels, const char *path); + +extern int +SymMatrixRead(char *pcFileIn, symmatrix_t **prSymMat_p); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/tree.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,234 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: tree.c 230 2011-04-09 15:37:50Z andreas $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include "util.h" +#include "log.h" +#include "muscle_upgma.h" +#include "tree.h" + +/** + * + * @brief Creates a UPGMA guide tree. This is a frontend function to + * the ported Muscle UPGMA code (). + * + * @param[out] tree + * created upgma tree. will be allocated here. use FreeMuscleTree() + * to free + * @param[in] labels + * pointer to nseq sequence names + * @param[in] distmat + * distance matrix + * @param[in] ftree + * optional: if non-NULL, tree will be written to this files + * + * @see FreeMuscleTree() + * @see MuscleUpgma2() + * + */ +void +GuideTreeUpgma(tree_t **tree, char **labels, + symmatrix_t *distmat, char *ftree) +{ + linkage_t linkage = LINKAGE_AVG; + FILE *fp = NULL; + + if (NULL != ftree) { + if (NULL == (fp=fopen(ftree, "w"))) { + Log(&rLog, LOG_ERROR, "Couldn't open tree-file '%s' for writing. Skipping", ftree); + } + /* fp NULL is handled later */ + } + + (*tree) = (tree_t *) CKMALLOC(1 * sizeof(tree_t)); + MuscleUpgma2((*tree), distmat, linkage, labels); + + if (rLog.iLogLevelEnabled <= LOG_DEBUG) { + Log(&rLog, LOG_DEBUG, "tree logging..."); + LogTree((*tree), LogGetFP(&rLog, LOG_DEBUG)); + } + + if (NULL != fp) { + MuscleTreeToFile(fp, (*tree)); + Log(&rLog, LOG_INFO, "Guide tree written to %s", ftree); + fclose(fp); + } +} +/*** end: guidetree_upgma ***/ + + + +/** + * + * @brief + * + * @param[out] tree + * created upgma tree. will be allocated here. use FreeMuscleTree() + * to free + * @param[in] mseq + * @param[in] ftree + * + * @return non-zero on error + * + */ +int +GuideTreeFromFile(tree_t **tree, mseq_t *mseq, char *ftree) +{ + int iNodeCount; + int iNodeIndex; + + (*tree) = (tree_t *) CKMALLOC(1 * sizeof(tree_t)); + if (MuscleTreeFromFile((*tree), ftree)!=0) { + Log(&rLog, LOG_ERROR, "%s", "MuscleTreeFromFile failed"); + return -1; + } + + /* Make sure tree is rooted */ + if (!IsRooted((*tree))) { + Log(&rLog, LOG_ERROR, "User tree must be rooted"); + return -1; + } + + if ((int)GetLeafCount((*tree)) != mseq->nseqs) { + Log(&rLog, LOG_ERROR, "User tree does not match input sequences"); + return -1; + } + + /* compare tree labels and sequence names and set leaf-ids */ + iNodeCount = GetNodeCount((*tree)); + for (iNodeIndex = 0; iNodeIndex < iNodeCount; ++iNodeIndex) { + char *LeafName; + int iSeqIndex; + + if (!IsLeaf(iNodeIndex, (*tree))) + continue; + LeafName = GetLeafName(iNodeIndex, (*tree)); + + if ((iSeqIndex=FindSeqName(LeafName, mseq))==-1) { + Log(&rLog, LOG_ERROR, "Label '%s' in tree could not be found in sequence names", LeafName); + return -1; + } + + SetLeafId((*tree), iNodeIndex, iSeqIndex); + } + + if (rLog.iLogLevelEnabled <= LOG_DEBUG) { + Log(&rLog, LOG_DEBUG, "tree logging..."); + LogTree((*tree), LogGetFP(&rLog, LOG_DEBUG)); + } + + return 0; +} +/*** end: GuideTreeFromFile() ***/ + + + +/** + * + * @brief Depth first traversal of tree, i.e. leaf nodes (sequences) + * will be visited first. Order can be used to guide progressive + * alignment order. + * + * @param[out] piOrderLR_p + * order in which left/right nodes (profiles) are to be aligned. + * allocated here; caller must free. + * @param[in] tree + * The tree to traverse; has to be rooted + * @param[in] mseq + * corresponding multiple sequence structure + * + */ +void +TraverseTree(int **piOrderLR_p, + tree_t *tree, mseq_t *mseq) +{ + int tree_nodeindex = 0; + int order_index = 0; + + assert(NULL!=tree); + assert(NULL!=mseq); + assert(IsRooted(tree)); + + /* allocate memory for node/profile alignment order; + * for every node allocate DIFF_NODE (3) int (1 left, 1 right, 1 parent) + */ + *piOrderLR_p = (int *)CKCALLOC(DIFF_NODE * GetNodeCount(tree), sizeof(int)); + + /* Log(&rLog, LOG_FORCED_DEBUG, "print tree->m_iNodeCount=%d", tree->m_iNodeCount); */ + + + tree_nodeindex = FirstDepthFirstNode(tree); + /*LOG_DEBUG("Starting with treenodeindex = %d", tree_nodeindex);*/ + + order_index = 0; + + do { + if (IsLeaf(tree_nodeindex, tree)) { + int leafid = GetLeafId(tree_nodeindex, tree); + if (leafid >= mseq->nseqs) + Log(&rLog, LOG_FATAL, "Sequence index out of range during tree traversal (leafid=%d nseqs=%d)", + leafid, mseq->nseqs); + + /* this is a leaf node, + * indicate this by registering same leafid for left/right + */ + + (*piOrderLR_p)[DIFF_NODE*order_index+LEFT_NODE] = leafid; + (*piOrderLR_p)[DIFF_NODE*order_index+RGHT_NODE] = leafid; + (*piOrderLR_p)[DIFF_NODE*order_index+PRNT_NODE] = tree_nodeindex; + + Log(&rLog, LOG_DEBUG, "Tree traversal: Visited leaf-node %d (leaf-id %d = Seq '%s')", + tree_nodeindex, leafid, mseq->sqinfo[leafid].name); + + } else { + int merge_nodeindex; + int left; + int right; + + merge_nodeindex = tree_nodeindex; + left = GetLeft(tree_nodeindex, tree); + right = GetRight(tree_nodeindex, tree); + + /* this is not a leaf node but a merge node, + * register left node (even) and right node (odd) + */ + (*piOrderLR_p)[DIFF_NODE*order_index+LEFT_NODE] = left; + (*piOrderLR_p)[DIFF_NODE*order_index+RGHT_NODE] = right; + (*piOrderLR_p)[DIFF_NODE*order_index+PRNT_NODE] = merge_nodeindex; + + Log(&rLog, LOG_DEBUG, "Tree traversal: Visited non-leaf node %d with siblings %d (L) and %d (R)", + merge_nodeindex, left, right); + } + tree_nodeindex = NextDepthFirstNode(tree_nodeindex, tree); + + order_index++; + + } while (NULL_NEIGHBOR != tree_nodeindex); + + return; +} +/*** end: TraverseTree ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/tree.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,40 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: tree.h 193 2011-02-07 15:45:21Z andreas $ + */ + +#ifndef CLUSTALO_TREE_H +#define CLUSTALO_TREE_H + +#include "symmatrix.h" +#include "muscle_tree.h" +#include "seq.h" + +enum {LEFT_NODE = 0, RGHT_NODE, PRNT_NODE, DIFF_NODE}; + +extern void +GuideTreeUpgma(tree_t **tree, + char **labels, symmatrix_t *tmat, char *ftree); + +extern int +GuideTreeFromFile(tree_t **tree, + mseq_t *mseq, char *ftree); + +extern void +TraverseTree(int **piOrderLR_p, + tree_t *tree, mseq_t *mseq); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/util.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,505 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: util.c 235 2011-04-13 14:13:19Z andreas $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <time.h> + +#include "log.h" +#include "util.h" + + + + +/* struct for QSortAndTrackIndex and SortAndTrackIndexCmp[Asc|Desc] */ +typedef struct { + int piIndex; + int piValue; +} sortwithindex_t; + + + + +/** + * @brief Copy of squid's FileExists(). Copied here to make squid independent. + */ +int +CheckIfFileExists(char *pcFilename) +{ + FILE *prFile; + if ((prFile = fopen(pcFilename, "r"))) { + fclose(prFile); + return TRUE; + } + return FALSE; +} +/* end of CheckIfFileExists */ + + +/** + * @brief Allocates memory (malloc) + * + * @param[in] bytes + * bytes to allocated + * @param[in] function + * calling function name + * @param[in] line + * calling function line + * + * @return void pointer to the newly allocated memory + * + * @note use provided macro CKMALLOC() which automatically adds + * function name and line number + * + */ +void * +CkMalloc(size_t bytes, const char *function, const int line) +{ + void *ret; + + if(NULL == (ret = malloc(bytes * sizeof(char)))) { + Log(&rLog, LOG_FATAL, "Out of memory (requested from %s:%d)\n", function, line); + } + + return ret; +} +/*** end: ckmalloc ***/ + + + +/** + * @brief Allocates memory (calloc). Memory will be + * set to zero. + * + * @param[in] count + * Allocate space for count objects + * @param[in] size + * Objects are of this size + * @param[in] function + * calling function name + * @param[in] line + * calling function line + * + * @return void pointer to the newly allocated and zeroed memory (calloc). + * + * @note use provided macro CKCALLOC() which automatically adds + * function name and line number + * + * + */ +void * +CkCalloc(size_t count, size_t size, const char *function, const int line) +{ + void *ret; + + if(NULL == (ret = calloc(count, size))) { + Log(&rLog, LOG_FATAL, "Out of memory (requested from %s:%d)\n", + function, line); + exit(EXIT_FAILURE); + } + + return ret; +} +/*** end: CkCalloc ***/ + + +/** +* @brief Reallocates memory + * + * @param[in] ptr + * Pointer to memory to be reallocated + * @param[in] bytes + * bytes to allocated + * @param[in] function + * calling function name + * @param[in] line + * calling function line + * + * @return void pointer to the newly allocated memory + * + * @note use provided macro CKREALLOC() which automatically adds + * function name and line number + * + */ +void * +CkRealloc(void *ptr, size_t bytes, const char *function, const int line) +{ + void *ret=NULL; + + if(NULL == (ret = realloc(ptr, bytes))) { + Log(&rLog, LOG_FATAL, "FATAL: Out of memory (requested from %s:%d)\n", + function, line); + } + + return ret; +} +/*** end: ckrealloc ***/ + + + +/** + * + * @brief Frees memory + * + * @param[in] ptr + * Pointer to memory to be freed + * @param[in] function + * calling function name + * @param[in] line + * calling function line + * + * @return void pointer to the now zeroed memory + * + * @note use provided macro CKFREE() + * + */ +void * +CkFree(void *ptr, const char *function, const int line) +{ + if (ptr == NULL) { + Log(&rLog, LOG_WARN, "Bad call to CkFree from %s:%d (pointer was NULL)\n", function, line); + } else { + free(ptr); + ptr = NULL; + } + return ptr; +} +/*** end: CkFree ***/ + + + + +/** + * @brief safe version of strdup + * + * @param[in] src + * String to copy from + * + * @return copy of string + * + * @note src is not allowed to be NULL. + * + */ +char * +CkStrdup(const char *src) +{ + char *cp; + assert(NULL!=src); + + /*cp = strdup(src); always makes trouble... */ + cp = (char *) CKMALLOC(strlen(src) +1); + strcpy(cp, src); + + return cp; +} +/*** end: CkStrdup ***/ + + + + +/** + * @brief Creates an int array of size len with len-1 random but unique + * integers with values 0--len-1. This is "a modified version of + * Fisher-Yates known as Durstenfeld-Fisher-Yates or + * Knuth-Fisher-Yates". See + * http://stackoverflow.com/questions/196017/unique-random-numbers-in-o1 + * + * @param[in] perm + * The permutation array. Has to be preallocated + * @param[out] len + * Length of the permutation array + * + */ +void +PermutationArray(int **perm, const int len) +{ + int max, i; + + assert(len>0); + + srand((unsigned int) time(0)); + (*perm) = (int *) CKMALLOC(len * sizeof(int)); + max = len-1; + for (i=0; i<len; i++) { + (*perm)[i] = i; + } + + while (max>=0) { + int tmp, randno; + /* randno = addrand((unsigned long) len); / returns 0--n-1 */ + randno = (rand()%len); + + /* swap */ + tmp = (*perm)[randno]; + (*perm)[randno] = (*perm)[max]; + (*perm)[max] = tmp; + + max--; + } + return; +} +/*** end: PermutationArray() ***/ + + + +/** + * @brief Creates an array filled with random, but unique ints of + * given range. Implementation of the Floyd algorithm. See + * http://stackoverflow.com/questions/1608181/unique-random-numbers-in-an-integer-array-in-the-c-programming-language + * Assuming M is the length of the desired array and N is the numeric + * range: "This approach has the complexity of about O(M) (depends on + * the search structure used), so it is better suitable when M << N. + * This approach keeps track of already generated random numbers, so + * it requires extra memory. However, the beauty of it is that it does + * not make any of those horrendous "trial and error" iterations, + * trying to find an unused random number. This algorithm is + * guaranteed to generate one unique random number after each single + * call to the random number generator." + * + * @warning This won't work if max_value<=array_len. Only use for + * cases where array_len<<max_value + * + * @param[in] array + * Preallocated int array whose values will be set + * @param[in] array_len + * Size of array + * @param[in] max_value + * + */ +void +RandomUniqueIntArray(int *array, const int array_len, const int max_value) +{ + bool *is_used; + int in, im; + + assert(array_len<max_value); + srand((unsigned int) time(0)); + is_used = (bool *) CKCALLOC(max_value, sizeof(bool)); + + im = 0; + + for (in = max_value - array_len; in < max_value && im < array_len; ++in) { + int r = rand() % (in + 1); + if (is_used[r]==TRUE) { + r = in; /* use 'in' instead of generated number */ + } + assert(! is_used[r]); + array[im++] = r; + is_used[r] = TRUE; + } + + assert(im == array_len); + + free(is_used); + + return; +} +/*** end: RandomUniqueIntArray() ***/ + + + +/** + * @brief int comparison function for qsort + * + */ +int +IntCmp(const void *a, const void *b) +{ + const int *ia = (const int *)a; + const int *ib = (const int *)b; + return *ia - *ib; +} +/*** end: IntCmp() ***/ + + + + + +/** + * @brief Compare two sortwithindex_t pointers and return the + * difference between the int value of the 1st sortwithindex_t and the + * 2nd. Used for ascending sort order in QSortWithIndexes()/ + * + * @see SortAndTrackIndexCmpDesc() and QSortAndTrackIndex() + */ +int +SortAndTrackIndexCmpAsc(const void *a, const void *b) +{ + const sortwithindex_t *a_t = (const sortwithindex_t *)a; + const sortwithindex_t *b_t = (const sortwithindex_t *)b; + + const int ia = (const int) a_t->piValue; + const int ib = (const int) b_t->piValue; + return ia - ib; +} +/*** end: SortAndTrackIndexCmpAsc ***/ + + + + +/** + * @brief Compare two sortwithindex_t pointers and return the + * difference between the int value of the 2nd sortwithindex_t and the + * 1st. Used for descending sort order in QSortWithIndexes() + * + * @see SortAndTrackIndexCmpDesc() and QSortAndTrackIndex() + */ +int +SortAndTrackIndexCmpDesc(const void *a, const void *b) +{ + const sortwithindex_t *a_t = (const sortwithindex_t *)a; + const sortwithindex_t *b_t = (const sortwithindex_t *)b; + + const int ia = (const int) a_t->piValue; + const int ib = (const int) b_t->piValue; + return ib - ia; +} +/*** end: SortAndTrackIndexCmpDesc ***/ + + + + +/** + * @brief Sort a given int array in ascending or descending order, + * while keeping track of the element order. + * + * @param[out] piSortedIndices + * Will contain the indices of the sorted elements. Has to be preallocated. + * @param[out] piArrayToSort + * Array with values to sort. Will only be overwritten if + * bOverwriteArrayToSort it true. + * @param[in] iArrayLen + * Number of elements in piArrayToSort. + * @param[in] cOrder + * Sort order. 'a' for ascending, 'd' for descending. + * @param[in] bOverwriteArrayToSort + * If false do not overwrite the array to sort. + * + */ +void +QSortAndTrackIndex(int *piSortedIndices, int *piArrayToSort, + const int iArrayLen, const char cOrder, + const bool bOverwriteArrayToSort) +{ + int iCtr; /**< aux */ + + sortwithindex_t *prSort; + + + assert(NULL!=piSortedIndices); + assert(iArrayLen>0); + assert(NULL!=piArrayToSort); + assert('a'==cOrder || 'd'==cOrder); + + prSort = (sortwithindex_t *) CKMALLOC(iArrayLen * sizeof(sortwithindex_t)); + + for (iCtr=0; iCtr<iArrayLen; iCtr++) { + prSort[iCtr].piIndex = iCtr; + prSort[iCtr].piValue = piArrayToSort[iCtr]; +#if 0 + LOG_DEBUG("b4 sort: prSort idx %d = val %d", + prSort[iCtr].piIndex, prSort[iCtr].piValue); +#endif + } + + if ('a'==cOrder) { + qsort(prSort, iArrayLen, sizeof(sortwithindex_t), SortAndTrackIndexCmpAsc); + } else if ('d'==cOrder) { + qsort(prSort, iArrayLen, sizeof(sortwithindex_t), SortAndTrackIndexCmpDesc); + } else { + Log(&rLog, LOG_FATAL, "Internal error: unknown order %c", cOrder); + } + + for (iCtr=0; iCtr<iArrayLen; iCtr++) { + piSortedIndices[iCtr] = prSort[iCtr].piIndex; + + if (bOverwriteArrayToSort) { + piArrayToSort[iCtr] = prSort[iCtr].piValue; + } +#if 0 + LOG_DEBUG("after sort: prSort idx %d = val %d", + prSort[iCtr].piIndex, prSort[iCtr].piValue); +#endif + } + free(prSort); + + return; +} +/*** end: QSortWithIndexes() ***/ + + + + +/** + * @brief Test if file is writable. File may or may not exist. + * + * @param[in] pcFileName + * Filename to check + * + * @return True if file is writable at the time of calling + * + */ +bool +FileIsWritable(char *pcFileName) +{ + bool bFileAlreadyExisted; + FILE *prFilePointer; + bool bIsWritable; + + if (0 != CheckIfFileExists(pcFileName)) { + bFileAlreadyExisted = TRUE; + } else { + bFileAlreadyExisted = FALSE; + } + + if (NULL == (prFilePointer=fopen(pcFileName, "a"))) { + bIsWritable = FALSE; + } else { + bIsWritable = TRUE; + if (0 != fclose(prFilePointer)) { + Log(&rLog, LOG_ERROR, "Couldn't close temporily created file %s. Expect trouble..."); + } + } + +#if 0 + LOG_DEBUG("%s existed?=%d writable=%d", pcFileName, + (TRUE==bFileAlreadyExisted? 1 : 0), + (TRUE==bIsWritable? 1:0)); +#endif + + /* delete if file didn't exist before and was created here + * temporarily + */ + if (FALSE==bFileAlreadyExisted && TRUE==bIsWritable) { + if (0 != remove(pcFileName)) { + Log(&rLog, LOG_ERROR, "Removing of temporarily created file %s failed. Expect trouble..."); + } + } + return bIsWritable; +} +/*** end: FileIsWritable() ***/ + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/util.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,76 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: util.h 230 2011-04-09 15:37:50Z andreas $ + */ + +#include <limits.h> +#include <string.h> +#include <strings.h> +#include <stdarg.h> +#include <stdbool.h> + +#ifndef CLUSTALO_UTIL_H +#define CLUSTALO_UTIL_H + + +#define CKMALLOC(b) CkMalloc((b), __FUNCTION__, __LINE__) +#define CKCALLOC(c, s) CkCalloc((c), (s), __FUNCTION__, __LINE__) +#define CKREALLOC(p, b) CkRealloc((p), (b), __FUNCTION__, __LINE__) +#define CKFREE(b) ((b)=CkFree((b), __FUNCTION__, __LINE__)) + +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +/* STR_EQ: strings are equal, case sensitive */ +#define STR_EQ(a,b) (strcmp((a),(b)) == 0) +/* STR_NC_EQ: strings are equal, ignoring case */ +#define STR_NC_EQ(a,b) (strcasecmp((a),(b)) == 0) + + +/* type boolean and false and true defined in stdbool.h */ +#ifndef TRUE +#define TRUE true +#endif +#ifndef FALSE +#define FALSE false +#endif + +/* clashes with hhalign +#define FAIL -1 +#define OK 0 +*/ + + + +/* don't use the following directly; use macros provided above instead + */ +void *CkMalloc(size_t size, const char *function, const int line); +void *CkCalloc(size_t count, size_t size, const char *function, const int line); +void *CkRealloc(void *ptr, size_t bytes, const char *function, const int line); +void *CkFree(void *ptr, const char *function, const int line); +char *CkStrdup(const char *s); +void PermutationArray(int **array, const int len); +void RandomUniqueIntArray(int *array, const int array_len, const int max_value); +int IntCmp(const void *a, const void *b); +bool FileIsWritable(char *pcFileName); +void QSortAndTrackIndex(int *piSortedIndices, int *piArrayToSort, + const int uArrayLen, const char cOrder, const bool bOverwriteArrayToSort); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/weights.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,337 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/* Module for deriving sequence weights from a tree. Largely based on + * Bob Edgar's Muscle (mainly clwwt.cpp; version 3.7). Ported to pure + * C. Most functions where apparently based on Clustal 1.8 anyway. + * + * Muscle's code is public domain and so is this code here. + * + * From http://www.drive5.com/muscle/license.htm: + * """ + * MUSCLE is public domain software + * + * The MUSCLE software, including object and source code and + * documentation, is hereby donated to the public domain. + * + * Disclaimer of warranty + * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * """ + * + */ + +/* + * RCS $Id: weights.c 231 2011-04-09 17:13:06Z andreas $ + */ + +/* + * Documentation from Muscle + * + * """ + * Compute weights by the CLUSTALW method. + * Thompson, Higgins and Gibson (1994), CABIOS (10) 19-29; + * see also CLUSTALW paper. + * + * Weights are computed from the edge lengths of a rooted tree. + * + * Define the strength of an edge to be its length divided by the number + * of leaves under that edge. The weight of a sequence is then the sum + * of edge strengths on the path from the root to the leaf. + * + * Example. + * + * 0.2 + * -----A 0.1 + * -x ------- B 0.7 + * --------y ----------- C + * 0.3 ----------z + * 0.4 -------------- D + * 0.8 + * + * Edge Length Leaves Strength + * ---- ----- ------ -------- + * xy 0.3 3 0.1 + * xA 0.2 1 0.2 + * yz 0.4 2 0.2 + * yB 0.1 1 0.1 + * zC 0.7 1 0.7 + * zD 0.8 1 0.8 + * + * Leaf Path Strengths Weight + * ---- ---- --------- ------ + * A xA 0.2 0.2 + * B xy-yB 0.1 + 0.1 0.2 + * C xy-yz-zC 0.1 + 0.2 + 0.7 1.0 + * D xy-yz-zD 0.1 + 0.2 + 0.8 1.1 + * """ + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <assert.h> +#include "log.h" +#include "muscle_tree.h" +#include "weights.h" + + +/* + #undef DEBUG +*/ + + +/** + * @brief FIXME + * + * @param[out] puLeavesUnderNode + * FIXME + * @param[in] prTree + * FIXME + * @param[in] uNodeIndex + * FIXME + * + * @return The return value + * + * @note see Muscle3.7:clwwt.cpp + * + */ +uint +CountLeaves(uint *puLeavesUnderNode, tree_t *prTree, uint uNodeIndex) +{ + uint uLeft; + uint uRight; + uint uRightCount; + uint uLeftCount; + uint uCount; + + + if (IsLeaf(uNodeIndex, prTree)) { + puLeavesUnderNode[uNodeIndex] = 1; + return 1; + } + + uLeft = GetLeft(uNodeIndex, prTree); + uRight = GetRight(uNodeIndex, prTree); + uRightCount = CountLeaves(puLeavesUnderNode, prTree, uRight); + uLeftCount = CountLeaves(puLeavesUnderNode, prTree, uLeft); + uCount = uRightCount + uLeftCount; + + puLeavesUnderNode[uNodeIndex] = uCount; + + return uCount; +} +/*** end: CountLeaves() ***/ + + + + +/** + * @brief Normalise values in a double array to values between 0 and 1. + * + * @param[out] p + * double array with n elements + * @param[in] n + * number of elements in p + * + * @note From Muscle3.7: intmath.cpp:Normalize() + * + */ +void +Normalise(double *p, uint n) { + unsigned i; + double dSum = 0.0; + for (i = 0; i < n; ++i) { + dSum += p[i]; + } + if (0.0 == dSum) { + Log(&rLog, LOG_FATAL, "Normalise, sum=0"); + } + for (i = 0; i < n; ++i) { + p[i] /= dSum; + } +} +/*** end: Normalise() ***/ + + + +/** + * @brief Calculate "Clustal" weights from a tree. + * + * FIXME see doc in muscle:clwwt.cpp + * + * @param[out] pdWeights_p + * Will contain a weight for each leaf/sequence. Allocated here. User + * has to free + * @param[in] prTree + * Tree to derive weights from + * + * @return 0 on success, non-zero otherwise + * + * @note Largely copied from Muscle3.7: clwwt.cpp:CalcClustalWWeights() + * + * @warning FIXME Not sure if Muscle routines are most efficient here. + * Couldn't we do all this while traversing the tree and thereby safe + * time? + * + */ +int +CalcClustalWeights(double **pdWeights_p, tree_t *prTree) +{ + int i; /* aux */ + uint uLeafCount; + uint uNodeCount; + uint *puLeavesUnderNode; + uint uLeavesUnderRoot; + uint uRootNodeIndex; + double *pdStrengths; + uint uNodeIndex; + bool bLogWeights = FALSE; /* verbose output of weights */ + + + assert(NULL != pdWeights_p); + assert(NULL != prTree); + + if (rLog.iLogLevelEnabled <= LOG_DEBUG) { + bLogWeights = TRUE; + } + + uLeafCount = GetLeafCount(prTree); + uNodeCount = GetNodeCount(prTree); + + + (*pdWeights_p) = (double *) CKMALLOC(uNodeCount * sizeof(double)); + + if (0 == uLeafCount) { + return 0; + } else if (1 == uLeafCount) { + (*pdWeights_p)[0] = 1.0; + return 0; + } else if (2 == uLeafCount) { + (*pdWeights_p)[0] = 0.5; + (*pdWeights_p)[1] = 0.5; + return 0; + } + + if (!IsRooted(prTree)) { + Log(&rLog, LOG_ERROR, "Tree must be rooted to get weights"); + CKFREE(pdWeights_p); + return -1; + } + + +#ifdef TRACE + Log(&rLog, LOG_FORCED_DEBUG, "%s", "Weights follow"); + fprintf(stderr, "Node Leaves Length Strength\n"); + fprintf(stderr, "---- ------ -------- --------\n"); + /* 1234 123456 12345678 12345678 */ +#endif + + uRootNodeIndex = GetRootNodeIndex(prTree); + puLeavesUnderNode = (uint *) CKCALLOC(uNodeCount, sizeof(uint)); + + uLeavesUnderRoot = CountLeaves(puLeavesUnderNode, prTree, uRootNodeIndex); + if (uLeavesUnderRoot != uLeafCount) { + Log(&rLog, LOG_FATAL, "Internal error, root count %u %u", + uLeavesUnderRoot, uLeafCount); + } +#if 0 + for (uNodeIndex=0; uNodeIndex<uNodeCount; uNodeIndex++) { + Log(&rLog, LOG_FORCED_DEBUG, "LeavesUnderNode[%d]=%d", uNodeIndex, puLeavesUnderNode[uNodeIndex]); + } +#endif + + pdStrengths = (double *) CKMALLOC(uNodeCount * sizeof(double)); + + for (uNodeIndex=0; uNodeIndex < uNodeCount; uNodeIndex++) { + uint uParent; + double dLength; + uint uLeaves; + double dStrength; + + if (IsRoot(uNodeIndex, prTree)) { + pdStrengths[uNodeIndex] = 0.0; + continue; + } + + uParent = GetParent(uNodeIndex, prTree); + dLength = GetEdgeLength(uNodeIndex, uParent, prTree); + uLeaves = puLeavesUnderNode[uNodeIndex]; + dStrength = dLength / (double) uLeaves; + pdStrengths[uNodeIndex] = dStrength; + +#ifdef TRACE + fprintf(stderr, "%4u %6u %8g %8g\n", uNodeIndex, uLeaves, dLength, dStrength); +#endif + } + + + + + + if (bLogWeights){ + fprintf(stderr, "\n"); + fprintf(stderr, " Seq Path..Weight\n"); + fprintf(stderr, "-------------------- ------------\n"); + } + for (i=0; i<uLeafCount; i++) { + double dWeight = 0.0; + unsigned uLeafNodeIndex; + unsigned uNode; + + uLeafNodeIndex = LeafIndexToNodeIndex(i, prTree); + uNode = uLeafNodeIndex; + + if (bLogWeights){ + fprintf(stderr, "%20.20s %4u ", GetLeafName(uLeafNodeIndex, prTree), uLeafNodeIndex); + } + if (! IsLeaf(uLeafNodeIndex, prTree)) { + Log(&rLog, LOG_FATAL, + "Internal error: non-leaf-node %d", uLeafNodeIndex); + } + + /*LOG_DEBUG("dWeight = %f", dWeight);*/ + while (! IsRoot(uNode, prTree)) { + dWeight += pdStrengths[uNode]; + /*LOG_DEBUG("dWeight +== %f", pdStrengths[uNode]);*/ + uNode = GetParent(uNode, prTree); + if (bLogWeights){ + fprintf(stderr, "->%u(%g)", uNode, pdStrengths[uNode]); + } + } + /* AW: no idea what this is, but it's done like this in Muscle */ + if (dWeight < 0.0001) { +#ifdef TRACE + fprintf(stderr, "zero->one"); +#endif + dWeight = 1.0; + } + + /* @note: the only difference to the muscle code is here: we + * use the input index for storing weights, instead of the + * tree leaf index + */ + (*pdWeights_p)[GetLeafId(uLeafNodeIndex, prTree)] = dWeight; + if (bLogWeights){ + fprintf(stderr, " = %g\n", dWeight); + } + } + +#if 0 + for (i=0; i<uLeafCount; i++) { + Log(&rLog, LOG_FORCED_DEBUG, "Weights before normalisation: pdWeights_p[%d]=%f", i, (*pdWeights_p)[i]); + /*LOG_DEBUG("Should be %d", GetLeafId(LeafIndexToNodeIndex(i, prTree), prTree));*/ + } +#endif + + Normalise((*pdWeights_p), uLeafCount); + + + CKFREE(puLeavesUnderNode); + CKFREE(pdStrengths); + + return 0; +} +/*** end: CalcWeights() ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustal/weights.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,26 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: weights.h 193 2011-02-07 15:45:21Z andreas $ + */ + +#ifndef CLUSTALO_WEIGHTS_H +#define CLUSTALO_WEIGHTS_H + +extern int +CalcClustalWeights(double **pdWeights_p, tree_t *prTree); + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/clustalo-api-test.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,102 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: clustalo-api-test.c 213 2011-03-11 16:10:15Z andreas $ + */ + + +#include <stdio.h> + +/* Include clustal-omega's header. That's all you need + * + * If you developing in C++, use the following instead: + * extern "C" { + * #include "clustal-omega.h" + * } + */ +#include "clustal-omega.h" + + +int +main(int argc, char **argv) +{ + /* the multiple sequence structure */ + mseq_t *prMSeq = NULL; + /* for openmp: number of threads to use */ + int iThreads = 1; + /* alignment options to use */ + opts_t rAlnOpts; + /* an input file */ + char *pcSeqInfile; + int iAux; + + /* use LOGLEVEL_QUIET to make Clustal shut up */ + iVerbosityLevel = LOGLEVEL_INFO; + + SetDefaultAlnOpts(&rAlnOpts); + + InitClustalOmega(iThreads); + + /* Get sequence input file name from command line + */ + if (argc!=2) { + Fatal("Need sequence file as argument"); + } + pcSeqInfile = argv[1]; + + /* Read sequence file + */ + NewMSeq(&prMSeq); + if (ReadSequences(prMSeq, pcSeqInfile, + SEQTYPE_UNKNOWN, + INT_MAX, INT_MAX)) { + Fatal("Reading sequence file '%s' failed", pcSeqInfile); + } + + /* Dump some info about the sequences + */ + for (iAux=0; iAux<prMSeq->nseqs; iAux++) { + Info(LOGLEVEL_INFO, + "Sequence no %d has the following name: %s", + iAux, prMSeq->sqinfo[iAux].name); + Info(LOGLEVEL_INFO, + "Sequence no %d has the following residues: %s", + iAux, prMSeq->seq[iAux]); + /* more info can be found in prMSeq->sqinfo[iAux] */ + } + + + /* Align the sequences without a profile (NULL) + */ + if (Align(prMSeq, NULL, & rAlnOpts)) { + Fatal("A fatal error happended during the alignment process"); + } + + + /* Output of final alignment to stdout (NULL) as aligned fasta/a2m + */ + if (WriteAlignment(prMSeq, NULL, MSAFILE_A2M)) { + Fatal("Could not save alignment"); + } + + FreeMSeq(&prMSeq); + + Info(LOGLEVEL_INFO, "Successfull program exit"); + + return EXIT_SUCCESS; +} +/*** end of main() ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/config.h.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,247 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Let all files know they are being used inside Clustal Omega */ +#undef CLUSTALO + +/* This is a CYGWIN system */ +#undef CYGWIN + +/* This is a Darwin system */ +#undef DARWIN + +/* Define to 1 if you have the <argtable2.h> header file. */ +#undef HAVE_ARGTABLE2_H + +/* Define to 1 if you have the <assert.h> header file. */ +#undef HAVE_ASSERT_H + +/* Define to 1 if you have the <ctype.h> header file. */ +#undef HAVE_CTYPE_H + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the <float.h> header file. */ +#undef HAVE_FLOAT_H + +/* Define to 1 if you have the `fseek64' function. */ +#undef HAVE_FSEEK64 + +/* Define to 1 if you have the `fseeko' function. */ +#undef HAVE_FSEEKO + +/* Define to 1 if you have the `fseeko64' function. */ +#undef HAVE_FSEEKO64 + +/* Define to 1 if you have the `ftell64' function. */ +#undef HAVE_FTELL64 + +/* Define to 1 if you have the `ftello' function. */ +#undef HAVE_FTELLO + +/* Define to 1 if you have the `ftello64' function. */ +#undef HAVE_FTELLO64 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `argtable2' library (-largtable2). */ +#undef HAVE_LIBARGTABLE2 + +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + +/* Define to 1 if you have the <limits.h> header file. */ +#undef HAVE_LIMITS_H + +/* Has log2() */ +#undef HAVE_LOG2 + +/* Define to 1 if you have the <math.h> header file. */ +#undef HAVE_MATH_H + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `ntohl' function. */ +#undef HAVE_NTOHL + +/* Define to 1 if you have the `ntohs' function. */ +#undef HAVE_NTOHS + +/* Define to 1 if you have the `ntonl' function. */ +#undef HAVE_NTONL + +/* Define to 1 if you have the `ntons' function. */ +#undef HAVE_NTONS + +/* Defined if OpenMP should and can be used */ +#undef HAVE_OPENMP + +/* Define to 1 if you have the <stdarg.h> header file. */ +#undef HAVE_STDARG_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdio.h> header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `stroul' function. */ +#undef HAVE_STROUL + +/* Define to 1 if you have the `strtoull' function. */ +#undef HAVE_STRTOULL + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <time.h> header file. */ +#undef HAVE_TIME_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* This is a LINUX system */ +#undef LINUX + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* This is a MinGW system */ +#undef MINGW + +/* No-debug Mode */ +#undef NDEBUG + +/* Some strange OS */ +#undef OTHEROS + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* The package code name */ +#undef PACKAGE_CODENAME + +/* 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 home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `fpos_t', as computed by sizeof. */ +#undef SIZEOF_FPOS_T + +/* The size of `unsigned int', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_INT + +/* The size of `unsigned long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG + +/* The size of `unsigned long long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG_LONG + +/* The size of `unsigned short', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_SHORT + +/* This is a Solaris system */ +#undef SOLARIS + +/* This is a BSD system */ +#undef SOMEBSD + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Version number of package */ +#undef VERSION + +/* Define if using the dmalloc debugging malloc package */ +#undef WITH_DMALLOC + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `long int' if <sys/types.h> does not define. */ +#undef off_t + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +#undef size_t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/Makefile.am Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,26 @@ +# Some useful automake documentation: +# http://www.openismus.com/documents/linux/automake/automake.shtml +# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html + +#SUBDIRS = +#EXTRA_DIST = +# LDADD = foofiles/libfoo.a + +AM_CXXFLAGS = -fno-strict-aliasing -DCLUSTALO -DCLUSTALO_NOFILE -DDEFAULT_FILTER=90 @OPENMP_CXXFLAGS@ @AM_CXXFLAGS@ + +noinst_LTLIBRARIES = libhhalign.la + +libhhalign_la_SOURCES = hhalign.cpp hhalign.h \ + hash-C.h hash.h hhdecl-C.h hhfunc-C.h hhfunc.h \ + hhmatrices-C.h hhutil-C.h \ + hhalignment-C.h hhalignment.h \ + hhfullalignment-C.h hhfullalignment.h \ + hhhalfalignment-C.h hhhalfalignment.h \ + hhhit-C.h hhhit.h hhhitlist-C.h hhhitlist.h \ + hhhmm-C.h hhhmm.h \ + util-C.h list-C.h list.h \ + general.h + +library_includedir=$(includedir)/clustalo/hhalign + +library_include_HEADERS = general.h hhfunc.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/Makefile.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,556 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# Some useful automake documentation: +# http://www.openismus.com/documents/linux/automake/automake.shtml +# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html + +#SUBDIRS = +#EXTRA_DIST = +# LDADD = foofiles/libfoo.a + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/hhalign +DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/ax_openmp.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libhhalign_la_LIBADD = +am_libhhalign_la_OBJECTS = hhalign.lo +libhhalign_la_OBJECTS = $(am_libhhalign_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libhhalign_la_SOURCES) +DIST_SOURCES = $(libhhalign_la_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(library_includedir)" +HEADERS = $(library_include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = -fno-strict-aliasing -DCLUSTALO -DCLUSTALO_NOFILE -DDEFAULT_FILTER=90 @OPENMP_CXXFLAGS@ @AM_CXXFLAGS@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CODENAME = @PACKAGE_CODENAME@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_LTLIBRARIES = libhhalign.la +libhhalign_la_SOURCES = hhalign.cpp hhalign.h \ + hash-C.h hash.h hhdecl-C.h hhfunc-C.h hhfunc.h \ + hhmatrices-C.h hhutil-C.h \ + hhalignment-C.h hhalignment.h \ + hhfullalignment-C.h hhfullalignment.h \ + hhhalfalignment-C.h hhhalfalignment.h \ + hhhit-C.h hhhit.h hhhitlist-C.h hhhitlist.h \ + hhhmm-C.h hhhmm.h \ + util-C.h list-C.h list.h \ + general.h + +library_includedir = $(includedir)/clustalo/hhalign +library_include_HEADERS = general.h hhfunc.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/hhalign/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/hhalign/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libhhalign.la: $(libhhalign_la_OBJECTS) $(libhhalign_la_DEPENDENCIES) + $(CXXLINK) $(libhhalign_la_OBJECTS) $(libhhalign_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hhalign.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-library_includeHEADERS: $(library_include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(library_includedir)" || $(MKDIR_P) "$(DESTDIR)$(library_includedir)" + @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(library_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(library_includedir)" || exit $$?; \ + done + +uninstall-library_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(library_includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(library_includedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(library_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-library_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-library_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-library_includeHEADERS install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-library_includeHEADERS + + +# 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:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/general.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,99 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: general.h 241 2011-05-04 14:37:17Z fabian $ + */ + + +#ifndef GENERAL_H +#define GENERAL_H + + +#include "../clustal/log.h" + +/* +***** Omega definitions************************************ + FS, 2010-02-19 +*/ +enum {NO = 0, YES}; +enum {BASE10 = 10}; +enum {AMINOACIDS = 20, STATE_TRANSITIONS = 7}; +enum {MAXWORD = 100, MAXLEN = 10000}; +enum {OVER_ALLOCATE = 2}; +enum {FAILURE = -1, OK}; +enum {F_OFFSET = 1}; +enum {INTERN_ALN_2_HMM = 0, READ_ALN_2_HMM, READ_HMM_2_HMM, INTERN_HMM_2_HMM}; +#define UNITY 1.00 + +/*#define MIN(a,b) ((a)<(b)?(a):(b))*/ + + +/* parameters passed from Clustal-Omega to hhalign; FS, r240 -> */ +typedef struct { + + int iMacRamMB; /* dedicated amount of RAM for Maximum Accuracy (in MB) */ + +} hhalign_para; + +typedef struct { + /***public***/ + int n_display; + char **sname; + char **seq; + int ncons; + int nfirst; + int nss_dssp; + int nsa_dssp; + int nss_pred; + int nss_conf; + int L; + int N_in; + int N_filtered; + float *Neff_M; + float *Neff_I; + float *Neff_D; + float Neff_HMM; + char *longname; + char name[511]; + char file[511]; + char fam[511]; + char sfam[511]; + char fold[511]; + char cl[511]; + float lamda; + float mu; + /***private***/ + float **f; + float **g; + float **p; + float **tr; + float **linTr; + char trans_lin; + char *ss_dssp; + char *sa_dssp; + char *ss_pred; + char *ss_conf; + char *Xcons; + float pav[20]; + float pnul[20]; + int *l; + +} hmm_light; + + +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hash-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,594 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hash-C.h 143 2010-10-14 13:11:14Z andreas $ + */ + +// hash.C +// Class for Hash data structure +// * works in the same way as a hash in Perl +// * keys are strings of type char* +// * data elements are of type Typ +// * objects have to be declared with maximal size, e.g. Hash hash1(10000) (num_slots should not be a power of 2) +// * works also if maximal size is exceeded, but gets slower by a factor ~num_keys/num_slots + +/* + * RCS $Id: hash-C.h 143 2010-10-14 13:11:14Z andreas $ + */ + +#ifndef HASH +#define HASH + +#ifndef MAIN +#include <iostream> // cin, cout, cerr +#include <cstdio> // printf +#include <stdlib.h> // exit +#include <string> // strcmp, strstr +#include <math.h> // sqrt, pow +#include <limits.h> // INT_MIN +#include <float.h> // FLT_MIN +#include <ctype.h> // islower, isdigit etc +#include <time.h> // clock +#include <errno.h> // perror() +using std::cout; +using std::cerr; +using std::endl; +using std::ios; +using std::ifstream; +using std::ofstream; +#endif + +#ifndef JLIST +#define JLIST +#include "list.h" // List<Typ> +#include "list-C.h" ////////////////////////////////// DEBUG +#endif + +#include "hash.h" + + + +////////////////////////////////////////////////////////////////////////////// +////////////////////// Methods of class Hash ///////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////// +// Private Methods + + +////////////////////////////////////////////////////////////////////////////// +// Constructor and Destructor of Hash +////////////////////////////////////////////////////////////////////////////// +// Constructor of class Hash +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Hash<Typ>::Hash() +{ + num_keys=0; max_len=0; prev=curr=num_slots = 0; slot=NULL; +} + +template<class Typ> +Hash<Typ>::Hash(int nslots) +{ + num_keys=0; max_len=0; prev=curr=num_slots = nslots; + slot = new Slot<Typ>*[num_slots]; //Create array of num_slots slots + for (int i=0; i<num_slots; i++) slot[i]=NULL; //set pointers to NULL + fail = static_cast<Typ>(0); +} + +template<class Typ> +Hash<Typ>::Hash(int nslots, Typ f) +{ + num_keys=0; max_len=0; prev=curr=num_slots = nslots; + slot = new Slot<Typ>*[num_slots]; //Create array of num_slots slots + for (int i=0; i<num_slots; i++) slot[i]=NULL; //set pointers to NULL + fail=f; +} + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Destructor of class Hash +//////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Hash<Typ>::~Hash() +{ + RemoveAll(); + delete[] slot; slot = NULL; +} + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Hash function +//////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +inline unsigned int Hash<Typ>::HashValue(char* key) //returns the hash value for key + { + // Calculate a hash value by the division method: + // Transform key into a natural number k = sum ( key[i]*128^(L-i) ) and calculate i= k % num_slots. + // Since calculating k would lead to an overflow, i is calculated iteratively + // and at each iteration the part divisible by num_slots is subtracted, i.e. (% num_slots is taken). + if (key==NULL) {printf("Warning from hash.C: key=NULL\n"); return 0;} + unsigned int i=0; // Start of iteration: k is zero + char* c = key; + while(*c) i = ((i<<7) + *(c++)) % num_slots; + key_len = c - key; + // cerr<<" Hash value for \'"<<key<<"\' is "<<i<<"\n"; + return i; + } + +//////////////////////////////////////////////////////////////////////////////////////////// +// Create new hash (and delete any data present) +//////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +void Hash<Typ>::New(int nslots, Typ f) +{ + fail=f; + RemoveAll(); + delete[] slot; slot = NULL; + num_keys=0; max_len=0; prev=curr=num_slots = nslots; + slot = new Slot<Typ>*[num_slots]; //Create array of num_slots slots + for (int i=0; i<num_slots; i++) slot[i]=NULL; //set pointers to NULL +} + + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Methods that work with a key supplied as an argument + +//////////////////////////////////////////////////////////////////////////////////////////// +// Return data element for key. Returns 'fail' if key does not exist +//////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ Hash<Typ>::Show(char* key) +{ + Slot<Typ>* pslot; + int i = HashValue(key); + + pslot = slot[i]; + if (!pslot) return fail; + pslot->Reset(); + do{ + if(!strcmp(pslot->ReadNext().key,key)) return pslot->ReadCurrent().data; + } while(!pslot->End()); + return fail; +} + +//////////////////////////////////////////////////////////////////////////////////////////// +// Add/replace key/data pair to hash and return address of data element +//////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ* Hash<Typ>::Add(char* key, Typ data) +{ + Pair<Typ>* pairp; + Slot<Typ>* pslot; + int i = HashValue(key); + + pslot = slot[i]; + if (!pslot) { num_keys++; KeyLen(); slot[i]=new(Slot<Typ>); return slot[i]->Push(key_len,key,data);} + pslot->Reset(); + do + { + pairp = pslot->ReadNextAddress(); + if(!strcmp(pairp->key,key)) + { + pairp->data=data; + pslot->Overwrite(*pairp); + return &(pairp->data); + } + } while(!pslot->End()); + num_keys++; + KeyLen(); + return pslot->Push(key_len,key,data); +} + + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Add key to hash and return address of data element. +// If key exists leave data element unchanged, else set it to 'fail'. +//////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ* Hash<Typ>::Add(char* key) +{ + Slot<Typ>* pslot; + int i = HashValue(key); + + pslot = slot[i]; + if (!pslot) { num_keys++; KeyLen(); slot[i]=new(Slot<Typ>); return slot[i]->Push(key_len,key,fail);} + pslot->Reset(); + do + { + if(!strcmp(pslot->ReadNext().key,key)) + { + return &((pslot->ReadCurrentAddress())->data); + } + } while(!pslot->End()); + num_keys++; + KeyLen(); + return pslot->Push(key_len,key,fail); +} + + +///////////////////////////////////////////////////////////////////////////////////////////// +// Remove key from hash and return data element for key ('fail' if key does not exist) +///////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ Hash<Typ>::Remove(char* key) +{ + Slot<Typ>* pslot; + int i = HashValue(key); + + pslot = slot[i]; + if (!pslot) return fail; + pslot->Reset(); + do + { + if(!strcmp(pslot->ReadNext().key,key)) + { + num_keys--; + pslot->Delete(); + // if key was the only element in pslot then delete whole list + if (pslot->Size()==0) {delete pslot; pslot = NULL;slot[i]=0;} + return pslot->ReadCurrent().data; + } + } while(!pslot->End()); + return fail; +} + + +////////////////////////////////////////////////////////////////////////////// +// Remove all keys from hash; +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +void Hash<Typ>::RemoveAll() +{ + for(int i=0; i<num_slots; i++) + if(slot[i]) {delete slot[i]; slot[i]=NULL;} + num_keys=0; + max_len=0; + curr=prev=num_slots; +} + + + + + +////////////////////////////////////////////////////////////////////////////// +// Methods that work with an internal "current key": + + +////////////////////////////////////////////////////////////////////////////// +// Return data of next key. Return 'fail' data and empty key if at end +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ Hash<Typ>::ReadNext() +{ + Pair<Typ>* pairp; + Slot<Typ>* pslot; + + if (curr>=num_slots) {return fail;} + pslot = slot[curr]; // current list is never empty, except when current=num_slots + pairp = pslot->ReadNextAddress(); + if (pslot->End()) { + prev=curr; + do // move on to next non-empty list + { + if (++curr>=num_slots) return pairp->data; + pslot = slot[curr]; + } while (!pslot); + pslot->Reset(); + } + return pairp->data; +} + +////////////////////////////////////////////////////////////////////////////// +// Write next key into variable key and return data. Return 'fail' data and empty key if at end +// Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ Hash<Typ>::ReadNext(char* key) +{ + Pair<Typ>* pairp; + Slot<Typ>* pslot; + + if (curr>=num_slots) {*key='\0'; return fail;} + pslot = slot[curr]; // current list is never empty, except when current=num_slots + pairp = pslot->ReadNextAddress(); + strcpy(key,pairp->key); + if (pslot->End()) { + prev=curr; + do // move on to next non-empty list + { + if (++curr>=num_slots) return pairp->data; + pslot = slot[curr]; + } while (!pslot); + pslot->Reset(); + } + return pairp->data; +} + + + +////////////////////////////////////////////////////////////////////////////// +// Return data of current key +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ Hash<Typ>::ReadCurrent() +{ + Pair<Typ>* pairp; + Slot<Typ>* pslot; + + curr=prev; + if (curr>=num_slots) {return fail;} + pslot = slot[curr]; // current list is never empty, except when current=num_slots + pairp = &(pslot->ReadCurrent()); + if (pslot->End()) { + do // move on to next non-empty list + { + if (++curr>=num_slots) return pairp->data; + pslot = slot[curr]; + } while (!pslot); + pslot->Reset(); + } + return pairp->data; +} + +////////////////////////////////////////////////////////////////////////////// +// Write key last read into variable key and return data +// Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ Hash<Typ>::ReadCurrent(char* key) +{ + Pair<Typ>* pairp; + Slot<Typ>* pslot; + + curr=prev; + if (curr>=num_slots) {*key='\0'; return fail;} + pslot = slot[curr]; // current list is never empty, except when current=num_slots + pairp = &(pslot->ReadCurrent()); + strcpy(key,pairp->key); + if (pslot->End()) { + do // move on to next non-empty list + { + if (++curr>=num_slots) return pairp->data; + pslot = slot[curr]; + } while (!pslot); + pslot->Reset(); + } + return pairp->data; +} + +////////////////////////////////////////////////////////////////////////////// +// Remove current key, return data, and advance to next key (after Reset() remove first element) +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ Hash<Typ>::RemoveCurrent() +{ + Pair<Typ>* pairp; + Slot<Typ>* pslot; + curr=prev; + + if (curr>=num_slots) {return fail;} + pslot = slot[curr]; // current list is never empty, except when current=num_slots + pairp = &(pslot->Delete()); + num_keys--; + // if key was the only element in pslot then delete whole list + if (pslot->Size()==0) {delete pslot; pslot = NULL; slot[curr]=0;} + if (!pslot || pslot->End()) { + do // move on to next non-empty list + { + if (++curr>=num_slots) {prev=curr; return pairp->data;} + pslot = slot[curr]; + } while (!pslot); + pslot->Reset(); + } + prev=curr; + return pairp->data; +} + +////////////////////////////////////////////////////////////////////////////// +// Remove current key, return data, copy current key into key, and advance to next key +// (After Reset() remove first element) +// Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +Typ Hash<Typ>::RemoveCurrent(char* key) +{ + Pair<Typ>* pairp; + Slot<Typ>* pslot; + + curr=prev; + if (curr>=num_slots) {*key='\0'; return fail;} + pslot = slot[curr]; // current list is never empty, except when current=num_slots + pairp = &(pslot->Delete()); + strcpy(key,pairp->key); + num_keys--; + // if key was the only element in pslot then delete whole list + if (pslot->Size()==0) {delete pslot; pslot = NULL; slot[curr]=0;} + if (!pslot || pslot->End()) { + do // move on to next non-empty list + { + if (++curr>=num_slots) {prev=curr; return pairp->data;} + pslot = slot[curr]; + } while (!pslot); + pslot->Reset(); + } + prev=curr; + return pairp->data; +} + + + +////////////////////////////////////////////////////////////////////////////// +// Reset current position to beginning of hash +////////////////////////////////////////////////////////////////////////////// +template<class Typ> +void Hash<Typ>::Reset() + { + curr=-1; + Slot<Typ>* pslot; + do + { + curr++; + if (curr>=num_slots) {prev=curr; return;} + pslot = slot[curr]; + } while (!pslot); + pslot->Reset(); + prev=curr; + return; + } + + +///////////////////////////////////////////////////////////////////////////////////////////// +// Methods that return usefull information about the data stored in Hash: + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Returns 1 if the hash contains key, 0 otherwise +//////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +int Hash<Typ>::Contains(char* key) +{ + Slot<Typ>* pslot; + int i = HashValue(key); + + pslot = slot[i]; + if (!pslot) return 0; + pslot->Reset(); + do{ + if(!strcmp(pslot->ReadNext().key,key)) return 1; + } while(!pslot->End()); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////////// +//print out list of keys and data +///////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +void Hash<Typ>::Print() +{ + char key[MaxLen()+1]; + + cout<<"\nPrint hash:\n"; + Reset(); + while(!End()) + cout<<key<<"->"<<ReadNext(key)<<"\n"; +} + +///////////////////////////////////////////////////////////////////////////////////////////// +//Print out hash with internal representation as array +///////////////////////////////////////////////////////////////////////////////////////////// +template<class Typ> +void Hash<Typ>::DebugPrint() +{ + Pair<Typ>* pairp; + Slot<Typ>* pslot; + + cout<<"\n"; + cout<<"Debug-print hash:"; + for(int i=0; i<num_slots; i++) + { + pslot = slot[i]; + if (pslot) + { + cout<<"\nhash value "<<i; + pslot->Reset(); + while(!pslot->End()) + { + pairp = pslot->ReadNextAddress(); + cout<<" "<<pairp->key<<"->"<<pairp->data; + } + } + } + cout<<"\n\n"; + return; +} + + + +#endif /* HASH */ + + + +//////////////////////////////////////////////////////////////////////////////// +// Main program: test class Hash +//////////////////////////////////////////////////////////////////////////////// +// int main() +// { +// Hash<int> ihash(5); +// char* key=new char[128]; +// int data; + +// ihash.Fail(1000); +// ihash.Add("So many monsters",36); +// ihash.Add("So many chickens",25); + +// // cerr<<"Address of ihash(\"So many monsters\") is "<<ihash("So many monsters")<<"\n"; +// // cerr<<"Address of ihash(\"So many monsters\") is "<<ihash("So many monsters")<<"\n"; +// // *ihash("So many monsters")=2; +// // (*ihash("So many monsters"))++; +// // (*ihash("So many monsters"))++; +// cout<<"Size of hash="<<ihash.Size()<<"\n"; +// ihash.DebugPrint(); +// ihash.Print(); + +// strcpy(key,"Some more monsters"); +// ihash.Add(key,3); +// strcpy(key,"Even more monsters"); +// ihash.Add(key,7); +// cout<<"Size of hash="<<ihash.Size()<<"\n"; +// cout<<"Maximum key length = "<<ihash.MaxLen()<<"\n"; +// ihash.Print(); + +// cout<<"ihash.Remove(\"Even more monsters\") returns "<<ihash.Remove("Even more monsters")<<"\n"; +// ihash.Print(); + + +// cout<<"ihash.Remove(\"More monsters\") returns "<<ihash.Remove("More monsters")<<"\n"; +// ihash.Add("So many chickens",999); +// ihash.Add("So many monster",1); +// ihash.Print(); + +// cout<<"So many chickens:"<<ihash.Show("So many chickens")<<"\n"; +// cout<<"Size of hash="<<ihash.Size()<<"\n"; + + + +// ihash.Reset(); +// while (!ihash.End()) +// { +// data = ihash.ReadNext(key); +// cout<<" "<<key<<"->"<<data<<endl; +// data = ihash.ReadCurrent(key); +// cout<<" "<<key<<"->"<<data<<endl; +// } +// cout<<"Removing all keys..."<<endl; +// cout<<"Size of hash="<<ihash.Size()<<"\n"; +// ihash.Reset(); +// while (ihash.Size()) +// { +// data = ihash.RemoveCurrent(key); +// cout<<" "<<key<<"->"<<data<<"\n"; +// cout<<"Size of hash="<<ihash.Size()<<"\n"; +// } + +// ihash.ReadCurrent(key); + +// ihash.Print(); +// return 0; +// }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hash.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,199 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hash.h 143 2010-10-14 13:11:14Z andreas $ + */ + +// Class for Hash data structure +// * works in the same way as a hash in Perl +// * keys are strings of type char* +// * data elements are of type Typ +// * objects have to be declared with maximal size, e.g. Hash hash1(10000) (num_slots should not be a power of 2) +// * works also if maximal size is exceeded, but gets slower by a factor ~num_keys/num_slots +// +// Applications +// * fast storage and retrieval of data by a key +// * fast check if a string occurs in a list of strings (data field not used) +// +// Time complexity: (L is the length of the key string) +// * Show(key), Add(key), Remove(key): O(L) for calculating hash value & compare keys in slot list +// * ReadNext, ReadCurrent, RemoveCurrent: O(L) for copying key into returned string +// * Contains: O(L) for calculating hash value +// * Size, MaxLen, Reset: O(1) +// * RemoveAll(), Hash() and ~Hash(): O(num_slots) +// +// Memory complexity: ~3*num_keys*(datasize+12bytes) + num_slots*4bytes + total added length of keys (including \0) +// +// Implementation: +// Hash is an array of pointers to lists of size num_slots. The lists, called slots, contain key/data pairs. +// When a key/data pair is added (e.g. with Add()) the array index i for the key (0<=i<num_slots) +// is calculated with the HashValue() function. +// When data is to be retrieved for key (e.g. with Show()) the hash value for key is calculated and +// the corresponding list (=slot) is searched for the occurence of the key. +// Array elements of hash values that have no keys associated yet contain the null pointer +// for faster rejection of undefined keys. +// + +//////////////////////////////////////////////////////////////////////////////////////////// +// Declaration of Pair, consisting of a key string and a data element of type Typ +//////////////////////////////////////////////////////////////////////////////////////////// + +template<class Typ> +class Pair +{ +public: + char* key; //hash key + Typ data; //data for key + Pair() {} + Pair(char* k, Typ& d) {key = new char[strlen(k)+1]; strcpy(key,k); data=d;} + Pair(int& l, char* k, Typ& d) {key = new char[l+1]; strcpy(key,k); data=d;} +}; + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Declaration of Slot, a list of key/data pairs +//////////////////////////////////////////////////////////////////////////////////////////// + +template<class Typ> +class Slot : public List< Pair<Typ> > +{ +public: + //Destructor of Slot deletes whole list TOGETHER WITH THE KEY STRINGS + ~Slot() {this->Reset(); while (!this->End()) delete[] this->Pop().key; } + + // Push key/data pair onto slot list and return address of data element + // Attention: l must be at least length of key + inline Typ* Push(int& l, char* key, Typ& data) + { + Pair<Typ> pair(l,key,data); //create a pair with key/data + return &(List<Pair<Typ> >::Push(pair)->data); + } +}; + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Declaration of Hash, an array of slots, i.e. pointers to lists of key/data +//////////////////////////////////////////////////////////////////////////////////////////// + +template<class Typ> +class Hash +{ +private: + int num_slots; //number of slots in slot[]. num_slots is set with the constructor + int curr; //index of current slot + int prev; //index of slot from previous ReadNext() + int num_keys; //total number of keys in hash + int max_len; //length of longest key in hash + int key_len; //length of key in argument + Typ fail; + + Slot<Typ>** slot; //each slot[i] (i<num_slots) points to a list of key/data pairs for this slot + + inline unsigned int HashValue(char* key); //returns the hash value for key + +public: + Hash(); + Hash(int nslots); + Hash(int nslots, Typ n); + ~Hash(); + + // Set Fail element to be returned when the current key or supplied key are not defined + inline void Null(Typ f) {fail=f;} + inline void Fail(Typ f) {fail=f;} + + // Set 'fail' element to be returned when the current key or supplied key are not defined (default: 0) + void New(int nslots, Typ n=static_cast<Typ>(0)); + + // Update maximum key length and caculate key_len; + inline void KeyLen() {if(key_len>max_len) max_len=key_len; return;} + + +//////////////////////////////////////////////////////////////////////////////////////////// +// Methods that work with a key supplied as an argument + + // Return data element for key. Returns 'fail' if key does not exist + Typ Show(char* key); + inline Typ operator[](char* key) {return Show(key);} + + // Add/replace key/data pair to hash and return address of data element for key + Typ* Add(char* key, Typ data); + + // Add key to hash and return address of data element. If key exists leave data element unchanged, else set it to 'fail'. + Typ* Add(char* key); + inline Typ* operator()(char* key) {return Add(key);} + + // Remove key from hash and return data element for key ('fail' if key does not exist) + Typ Remove(char* key); + + // Remove all keys from hash + void RemoveAll(); + + +/////////////////////////////////////////////////////////////////////////////////////////// +// Methods that work with an internal "current key": +// It is set to the first key by Reset() and moves to the next key with ReadNext or RemoveCurrent +// Note:the methods above (e.g. Store, Show, [], Add, (), etc. DO NOT CHANGE the current key + + // Return data of next key. Return 'fail' data and empty key if at end + Typ ReadNext(); + + // Write next key into variable key and return data. Return 'fail' data and empty key if at end + // Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! + Typ ReadNext(char* key); + + // Return data of current key + Typ ReadCurrent(); + + // Write key last read into variable key and return data + // Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! + Typ ReadCurrent(char* key); + + // Remove current key, return data and advance to next key + Typ RemoveCurrent(); + + // Remove current key, return data, copy current key into key, and advance to next key + // (After Reset() remove first element) + // Attention: 'key' must have memory of at least char[MaxLen()+1] allocated! + Typ RemoveCurrent(char* key); + + // Reset readout of keys to beginning of hash + void Reset(); + + // Returns 1 if the current key has arrived at the end, 0 otherwise + int End() {return (curr>=num_slots);} + + + +/////////////////////////////////////////////////////////////////////////////////////////// +// Methods that return usefull information about the data stored in Hash: + + // Returns 1 if the hash contains key, 0 otherwise + int Contains(char* key); + + // Return number of slots + int Size() {return num_keys;} + + // Return length of longest key INCLUDING DELETED KEYS (excluding \0) + int MaxLen() {return max_len;} + + //print out list of keys and data + void Print(); + + //Print out hash with internal representation as array + void DebugPrint(); +}; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhalign.cpp Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1345 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhalign.cpp 241 2011-05-04 14:37:17Z fabian $ + */ + +/* hhalign.C: + * Align a multiple alignment to an alignment or HMM + * Print out aligned input sequences in a3m format + * Compile: g++ hhalign.C -o hhalign -I/usr/include/ -L/usr/lib -lpng -lz -O3 -fno-strict-aliasing + * Compile with efence: g++ hhalign.C -o hhalign -I/usr/include/ -lefence -L/usr/lib -lpng -lz -O -g + * + * Error codes: 0: ok 1: file format error 2: file access error + * 3: memory error 4: internal numeric error + * 5: command line error + */ +#undef PNG /* include options for making png files? + (will need the png library) */ +#define MAIN +#include <iostream> // cin, cout, cerr +#include <fstream> // ofstream, ifstream +#include <string.h> // strcmp, strstr +#include <stdio.h> // printf +#include <stdlib.h> // exit +#include <math.h> // sqrt, pow +#include <limits.h> // INT_MIN +#include <float.h> // FLT_MIN +#include <time.h> // clock +#include <ctype.h> // islower, isdigit etc + +using std::cout; +using std::cerr; +using std::endl; +using std::ios; +using std::ifstream; +using std::ofstream; + +int iAux_GLOBAL; + +#include "general.h" +#include "util-C.h" /* imax, fmax, iround, iceil, ifloor, strint, strscn, + strcut, substr, uprstr, uprchr, Basename etc. */ +#include "list-C.h" // list data structure +#include "hash-C.h" // hash data structure + +#include "hhdecl-C.h" // Constants, global variables, struct Parameters +#include "hhutil-C.h" /* MatchChr, InsertChr, aa2i, i2aa, log2, + fast_log2, WriteToScreen, */ +#include "hhmatrices-C.h" // BLOSUM50, GONNET, HSDM +#include "hhhmm.h" // class HMM +#include "hhhit.h" // class Hit +#include "hhalignment.h" // class Alignment +#include "hhhalfalignment.h" // class HalfAlignment +#include "hhfullalignment.h" // class FullAlignment +#include "hhhitlist.h" // class Hit +#include "hhhmm-C.h" // class HMM +#include "hhalignment-C.h" // class Alignment +#include "hhhit-C.h" // class Hit +#include "hhhalfalignment-C.h" // class HalfAlignment +#include "hhfullalignment-C.h" // class FullAlignment +#include "hhhitlist-C.h" // class HitList +#include "hhfunc-C.h" // some functions common to hh programs + +#ifdef PNG +#include "pngwriter.h" //PNGWriter (http://pngwriter.sourceforge.net/) +#include "pngwriter.cc" //PNGWriter (http://pngwriter.sourceforge.net/) +#endif + +//////////////////////////////////////////////////////////////////////// +// Global variables +//////////////////////////////////////////////////////////////////////// +HMM *q; // Create query HMM with maximum of MAXRES match states +HMM *t; /* Create template HMM with maximum of MAXRES + match states */ +Alignment *qali; /* (query alignment might be needed outside of hhfunc.C + for -a option) */ +Hit hit; // Ceate new hit object pointed at by hit +HitList hitlist; /* list of hits with one Hit object for each + pairwise comparison done */ +char aliindices[256]; /* hash containing indices of all alignments + which to show in dot plot */ +char* dmapfile=NULL; /* where to write the coordinates for the HTML map file + (to click the alignments) */ +char* alitabfile=NULL; // where to write pairs of aligned residues +char* strucfile=NULL; // where to read structure scores +char* pngfile=NULL; // pointer to pngfile +char* tcfile=NULL; // TCoffee output file name +float probmin_tc=0.05; /* 5% minimum posterior probability for printing + pairs of residues for TCoffee */ + +int dotW=10; // average score of dot plot over window [i-W..i+W] +float dotthr=0.5; // score threshold for dot plot +int dotscale=600; // size scale of dotplot +char dotali=0; // show no alignments in dotplot +float dotsat=0.3; // saturation of grid and alignments in dot plot +float pself=0.001; // maximum p-value of 2nd and following self-alignments +int Nstochali=0; // # of stochastically traced alignments in dot plot +float** Pstruc=NULL; /* structure matrix which can be multiplied to prob + ratios from aa column comparisons in Forward() */ +float** Sstruc=NULL; /* structure matrix which can be added to log odds + from aa column comparisons in Forward() */ + + + + + +//////////////////////////////////////////////////////////////////////////// +// Help functions +//////////////////////////////////////////////////////////////////////////// +/** + * @brief general help function, not accessible in Clustal-Omega + */ +#if 0 +void +help() +{ + printf("\n"); + printf("HHalign %s\n",VERSION_AND_DATE); + printf("Align a query alignment/HMM to a template alignment/HMM by HMM-HMM alignment\n"); + printf("If only one alignment/HMM is given it is compared to itself and the best\n"); + printf("off-diagonal alignment plus all further non-overlapping alignments above \n"); + printf("significance threshold are shown.\n"); + printf("%s",REFERENCE); + printf("%s",COPYRIGHT); + printf("\n"); + printf("Usage: %s -i query [-t template] [options] \n",program_name); + printf(" -i <file> input query alignment (fasta/a2m/a3m) or HMM file (.hhm)\n"); + printf(" -t <file> input template alignment (fasta/a2m/a3m) or HMM file (.hhm)\n"); +#ifdef PNG + printf(" -png <file> write dotplot into PNG-file (default=none) \n"); +#endif + printf("\n"); + printf("Output options: \n"); + printf(" -o <file> write output alignment to file\n"); + printf(" -ofas <file> write alignments in FASTA, A2M (-oa2m) or A3M (-oa3m) format \n"); + printf(" -a <file> write query alignment in a3m format to file (default=none)\n"); + printf(" -aa <file> append query alignment in a3m format to file (default=none)\n"); + printf(" -atab <file> write alignment as a table (with posteriors) to file (default=none)\n"); + printf(" -v <int> verbose mode: 0:no screen output 1:only warings 2: verbose\n"); + printf(" -seq [1,inf[ max. number of query/template sequences displayed (def=%i) \n",par.nseqdis); + printf(" -nocons don't show consensus sequence in alignments (default=show) \n"); + printf(" -nopred don't show predicted 2ndary structure in alignments (default=show) \n"); + printf(" -nodssp don't show DSSP 2ndary structure in alignments (default=show) \n"); + printf(" -aliw int number of columns per line in alignment list (def=%i)\n",par.aliwidth); + printf(" -P <float> for self-comparison: max p-value of alignments (def=%.2g\n",pself); + printf(" -p <float> minimum probability in summary and alignment list (def=%G) \n",par.p); + printf(" -E <float> maximum E-value in summary and alignment list (def=%G) \n",par.E); + printf(" -Z <int> maximum number of lines in summary hit list (def=%i) \n",par.Z); + printf(" -z <int> minimum number of lines in summary hit list (def=%i) \n",par.z); + printf(" -B <int> maximum number of alignments in alignment list (def=%i) \n",par.B); + printf(" -b <int> minimum number of alignments in alignment list (def=%i) \n",par.b); + printf(" -rank int specify rank of alignment to write with -a or -aa option (default=1)\n"); + printf("\n"); +#ifdef PNG + printf("Dotplot options:\n"); + printf(" -dwin <int> average score in dotplot over window [i-W..i+W] (def=%i) \n",dotW); + printf(" -dthr <float> score threshold for dotplot (default=%.2f) \n",dotthr); + printf(" -dsca <int> if value <= 20: size of dot plot unit box in pixels \n"); + printf(" if value > 20: maximum dot plot size in pixels (default=%i) \n",dotscale); + printf(" -dali <list> show alignments with indices in <list> in dot plot \n"); + printf(" <list> = <index1> ... <indexN> or <list> = all \n"); + printf("\n"); +#endif + printf("Filter input alignment (options can be combined): \n"); + printf(" -id [0,100] maximum pairwise sequence identity (%%) (def=%i) \n",par.max_seqid); + printf(" -diff [0,inf[ filter most diverse set of sequences, keeping at least this \n"); + printf(" many sequences in each block of >50 columns (def=%i)\n",par.Ndiff); + printf(" -cov [0,100] minimum coverage with query (%%) (def=%i) \n",par.coverage); + printf(" -qid [0,100] minimum sequence identity with query (%%) (def=%i) \n",par.qid); + printf(" -qsc [0,100] minimum score per column with query (def=%.1f)\n",par.qsc); +// printf(" -csc [0,100] minimum score per column with core alignment (def=%-.2f)\n",par.coresc); +// printf(" -qscc [0,100] minimum score per column of core sequence with query (def=%-.2f)\n",par.qsc_core); + printf("\n"); + printf("Input alignment format: \n"); + printf(" -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert;\n"); + printf(" '-' = Delete; '.' = gaps aligned to inserts (may be omitted) \n"); + printf(" -M first use FASTA: columns with residue in 1st sequence are match states\n"); + printf(" -M [0,100] use FASTA: columns with fewer than X%% gaps are match states \n"); + printf("\n"); + printf("HMM-HMM alignment options: \n"); + printf(" -glob/-loc global or local alignment mode (def=local) \n"); + printf(" -alt <int> show up to this number of alternative alignments (def=%i) \n",par.altali); + printf(" -vit use Viterbi algorithm for alignment instead of MAC algorithm \n"); + printf(" -mac use Maximum Accuracy (MAC) alignment (default) \n"); + printf(" -mact [0,1[ posterior probability threshold for MAC alignment (def=%.3f) \n",par.mact); + printf(" A threshold value of 0.0 yields global alignments.\n"); + printf(" -sto <int> use global stochastic sampling algorithm to sample this many alignments\n"); + printf(" -excl <range> exclude query positions from the alignment, e.g. '1-33,97-168'\n"); + printf(" -shift [-1,1] score offset (def=%-.3f) \n",par.shift); + printf(" -corr [0,1] weight of term for pair correlations (def=%.2f) \n",par.corr); + printf(" -ssm 0-4 0:no ss scoring [default=%i] \n",par.ssm); + printf(" 1:ss scoring after alignment \n"); + printf(" 2:ss scoring during alignment \n"); + printf(" -ssw [0,1] weight of ss score (def=%-.2f) \n",par.ssw); + printf("\n"); + printf(" -def read default options from ./.hhdefaults or <home>/.hhdefault. \n"); + printf("\n"); + printf("Example: %s -i T0187.a3m -t d1hz4a_.hhm -png T0187pdb.png \n",program_name); + cout<<endl; +// printf("More help: \n"); +// printf(" -h out output options \n"); +// printf(" -h hmm options for building HMM from multiple alignment \n"); +// printf(" -h gap options for setting gap penalties \n"); +// printf(" -h ali options for HMM-HMM alignment \n"); +// printf(" -h all all options \n"); +} +#endif + +/** + * @brief helpt for output, not accessible in Clustal-Omega + */ +#if 0 +void +help_out() +{ + printf("\n"); + printf("Output options: \n"); + printf(" -v verbose mode (default: show only warnings) \n"); + printf(" -v 0 suppress all screen output \n"); + printf(" -nocons don't show consensus sequence in alignments (default=show) \n"); + printf(" -nopred don't show predicted 2ndary structure in alignments (default=show) \n"); + printf(" -nodssp don't show DSSP SS 2ndary structure in alignments (default=show) \n"); + printf(" -seq [1,inf[ max. number of query/template sequences displayed (def=%i) \n",par.nseqdis); + printf(" -aliw [40,..[ number of columns per line in alignment list (def=%i)\n",par.aliwidth); + printf(" -P <float> for self-comparison: max p-value of alignments (def=%.2g\n",pself); + printf(" -p <float> minimum probability in summary and alignment list (def=%G) \n",par.p); + printf(" -E <float> maximum E-value in summary and alignment list (def=%G) \n",par.E); + printf(" -Z <int> maximum number of lines in summary hit list (def=%i) \n",par.Z); + printf(" -z <int> minimum number of lines in summary hit list (def=%i) \n",par.z); + printf(" -B <int> maximum number of alignments in alignment list (def=%i) \n",par.B); + printf(" -b <int> minimum number of alignments in alignment list (def=%i) \n",par.b); + printf(" -rank int specify rank of alignment to write with -a or -aa option (def=1)\n"); + printf(" -tc <file> write a TCoffee library file for the pairwise comparison \n"); + printf(" -tct [0,100] min. probobability of residue pairs for TCoffee (def=%i%%)\n",iround(100*probmin_tc)); + printf("\n"); +#ifdef PNG + printf("Dotplot options:\n"); + printf(" -dwin int average score in dotplot over window [i-W..i+W] (def=%i) \n",dotW); + printf(" -dthr float score threshold for dotplot (default=%.2f) \n",dotthr); + printf(" -dsca int size of dot plot box in pixels (default=%i) \n",dotscale); + printf(" -dali <list> show alignments with indices in <list> in dot plot\n"); + printf(" <list> = <index1> ... <indexN> or <list> = all \n"); + printf(" -dmap <file> print list of coordinates in png plot \n"); +#endif +} +#endif + +/** + * @brief help hit HMM options, not accessible in Clustal-Omega + */ +#if 0 +void +help_hmm() +{ + printf("\n"); + printf("Options to filter input alignment (options can be combined): \n"); + printf(" -id [0,100] maximum pairwise sequence identity (%%) (def=%i) \n",par.max_seqid); + printf(" -diff [0,inf[ filter most diverse set of sequences, keeping at least this \n"); + printf(" many sequences in each block of >50 columns (def=%i)\n",par.Ndiff); + printf(" -cov [0,100] minimum coverage with query (%%) (def=%i) \n",par.coverage); + printf(" -qid [0,100] minimum sequence identity with query (%%) (def=%i) \n",par.qid); + printf(" -qsc [0,100] minimum score per column with query (def=%.1f)\n",par.qsc); +// printf(" -csc [0,100] minimum score per column with core alignment (def=%-.2f)\n",par.coresc); +// printf(" -qscc [0,100] minimum score per column of core sequence with query (def=%-.2f)\n",par.qsc_core); + printf(" \n"); + printf("HMM-building options: \n"); + printf(" -M a2m use A2M/A3M (default): upper case = Match; lower case = Insert;\n"); + printf(" '-' = Delete; '.' = gaps aligned to inserts (may be omitted) \n"); + printf(" -M first use FASTA: columns with residue in 1st sequence are match states\n"); + printf(" -M [0,100] use FASTA: columns with fewer than X%% gaps are match states \n"); + printf(" -tags do NOT neutralize His-, C-myc-, FLAG-tags, and \n"); + printf(" trypsin recognition sequence to background distribution \n"); + printf(" \n"); + printf("Pseudocount options: \n"); + printf(" -Gonnet use the Gonnet substitution matrix (default) \n"); + printf(" -Blosum50 use the Blosum50 substitution matrix \n"); + printf(" -Blosum62 use the Blosum62 substitution matrix \n"); + printf(" -HSDM use the structure-derived HSDM substitution matrix \n"); + printf(" -pcm 0-3 Pseudocount mode (default=%-i) \n",par.pcm); + printf(" tau = substitution matrix pseudocount admixture \n"); + printf(" 0: no pseudo counts: tau = 0 \n"); + printf(" 1: constant tau = a \n"); + printf(" 2: divergence-dependent: tau = a/(1 + ((Neff-1)/b)^c) \n"); + printf(" Neff=( (Neff_q^d+Neff_t^d)/2 )^(1/d) \n"); + printf(" Neff_q = av number of different AAs per column in query \n"); + printf(" 3: column-specific: tau = \'2\' * (Neff(i)/Neff)^(w*Neff/20)\n"); + printf(" -pca [0,1] set a (overall admixture) (def=%-.1f) \n",par.pca); + printf(" -pcb [1,inf[ set b (threshold for Neff) (def=%-.1f) \n",par.pcb); + printf(" -pcc [0,3] set c (extinction exponent for tau(Neff)) (def=%-.1f) \n",par.pcc); + printf(" -pcw [0,3] set w (weight of pos-specificity for pcs) (def=%-.1f) \n",par.pcw); +} +#endif + +/** + * @brief help with gap handling, not accessible in Clustal-Omega + */ +#if 0 +void +help_gap() +{ + printf("\n"); + printf("Gap cost options: \n"); + printf(" -gapb [0,inf[ transition pseudocount admixture (def=%-.2f) \n",par.gapb); + printf(" -gapd [0,inf[ Transition pseudocount admixture for opening gap (default=%-.2f)\n",par.gapd); + printf(" -gape [0,1.5] Transition pseudocount admixture for extending gap (def=%-.1f)\n",par.gape); + printf(" -gapf ]0,inf] factor for increasing/reducing the gap open penalty for deletes (def=%-.2f)\n",par.gapf); + printf(" -gapg ]0,inf] factor for increasing/reducing the gap open penalty for deletes (def=%-.2f)\n",par.gapg); + printf(" -gaph ]0,inf] factor for increasing/reducing the gap extension penalty for deletes(def=%-.2f)\n",par.gaph); + printf(" -gapi ]0,inf] factor for increasing/reducing the gap extension penalty for inserts(def=%-.2f)\n",par.gapi); + printf(" -egq [0,inf[ penalty (bits) for end gaps aligned to query residues (def=%-.2f)\n",par.egq); + printf(" -egt [0,inf[ penalty (bits) for end gaps aligned to template residues (def=%-.2f)\n",par.egt); +} +#endif + +/** + * @brief help with alignment options, not accessible in Clustal-Omega + */ +#if 0 +void +help_ali() +{ + printf("\n"); + printf("Alignment options: \n"); + printf(" -glob/-loc global or local alignment mode (def=global) \n"); + printf(" -mac use Maximum Accuracy (MAC) alignment instead of Viterbi\n"); + printf(" -mact [0,1] posterior prob threshold for MAC alignment (def=%.3f) \n",par.mact); + printf(" -sto <int> use global stochastic sampling algorithm to sample this many alignments\n"); + printf(" -sc <int> amino acid score (tja: template HMM at column j) (def=%i)\n",par.columnscore); + printf(" 0 = log2 Sum(tja*qia/pa) (pa: aa background frequencies) \n"); + printf(" 1 = log2 Sum(tja*qia/pqa) (pqa = 1/2*(pa+ta) ) \n"); + printf(" 2 = log2 Sum(tja*qia/ta) (ta: av. aa freqs in template) \n"); + printf(" 3 = log2 Sum(tja*qia/qa) (qa: av. aa freqs in query) \n"); + printf(" -corr [0,1] weight of term for pair correlations (def=%.2f) \n",par.corr); + printf(" -shift [-1,1] score offset (def=%-.3f) \n",par.shift); + printf(" -r repeat identification: multiple hits not treated as independent\n"); + printf(" -ssm 0-2 0:no ss scoring [default=%i] \n",par.ssm); + printf(" 1:ss scoring after alignment \n"); + printf(" 2:ss scoring during alignment \n"); + printf(" -ssw [0,1] weight of ss score compared to column score (def=%-.2f) \n",par.ssw); + printf(" -ssa [0,1] ss confusion matrix = (1-ssa)*I + ssa*psipred-confusion-matrix [def=%-.2f)\n",par.ssa); +} +#endif + +/** + * @brief general help menu, not accessible in Clustal-Omega + */ +#if 0 +void +help_all() +{ + help(); + help_out(); + help_hmm(); + help_gap(); + help_ali(); + printf("\n"); + printf("Default options can be specified in './.hhdefaults' or '~/.hhdefaults'\n"); +} +#endif + +///////////////////////////////////////////////////////////////////////////// +//// Processing input options from command line and .hhdefaults file +///////////////////////////////////////////////////////////////////////////// +/** + * @brief process arguments from commandline, not accessible from Clustal-Omega + */ +#if 0 +void +ProcessArguments(int argc, char** argv) +{ + //Processing command line input + for (int i=1; i<argc; i++) + { + if (v>=4) cout<<i<<" "<<argv[i]<<endl; //PRINT + if (!strcmp(argv[i],"-i")) + { + if (++i>=argc || argv[i][0]=='-') + {help(); cerr<<endl<<"Error in "<<program_name<<": no query file following -i\n"; exit(4);} + else strcpy(par.infile,argv[i]); + } + else if (!strcmp(argv[i],"-t")) + { + if (++i>=argc || argv[i][0]=='-') + {help(); cerr<<endl<<"Error in "<<program_name<<": no template file following -d\n"; exit(4);} + else strcpy(par.tfile,argv[i]); /* FS, ProcessArguments */ + } + else if (!strcmp(argv[i],"-o")) + { + if (++i>=argc) + {help(); cerr<<endl<<"Error in "<<program_name<<": no filename following -o\n"; exit(4);} + else strcpy(par.outfile,argv[i]); + } + else if (!strcmp(argv[i],"-ofas")) + { + par.outformat=1; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -o\n"; exit(4);} + else strcpy(par.pairwisealisfile,argv[i]); + } + else if (!strcmp(argv[i],"-oa2m")) + { + par.outformat=2; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -o\n"; exit(4);} + else strcpy(par.pairwisealisfile,argv[i]); + } + else if (!strcmp(argv[i],"-oa3m")) + { + par.outformat=3; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -o\n"; exit(4);} + else strcpy(par.pairwisealisfile,argv[i]); + } + else if (!strcmp(argv[i],"-rank") && (i<argc-1)) par.hitrank=atoi(argv[++i]); + else if (!strcmp(argv[i],"-Oa3m")) + { + par.append=0; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -Oa3m\n"; exit(4);} + else strcpy(par.alnfile,argv[i]); + } + else if (!strcmp(argv[i],"-Aa3m")) + { + par.append=1; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -Aa3m\n"; exit(4);} + else strcpy(par.alnfile,argv[i]); + } + else if (!strcmp(argv[i],"-Ohhm")) + { + par.append=0; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -Ohhm\n"; exit(4);} + else strcpy(par.hhmfile,argv[i]); + } + else if (!strcmp(argv[i],"-Ahhm")) + { + par.append=1; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -Ahhm\n"; exit(4);} + else strcpy(par.hhmfile,argv[i]); + } + else if (!strcmp(argv[i],"-Opsi")) + { + par.append=0; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -Opsi\n"; exit(4);} + else strcpy(par.psifile,argv[i]); + } + else if (!strcmp(argv[i],"-Apsi")) + { + par.append=1; + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -Apsi\n"; exit(4);} + else strcpy(par.psifile,argv[i]); + } + else if (!strcmp(argv[i],"-png")) + { + if (++i>=argc) + {help(); cerr<<endl<<"Error in "<<program_name<<": no filename following -png\n"; exit(4);} + else + { + pngfile = new(char[strlen(argv[i])+1]); + strcpy(pngfile,argv[i]); + } + } + else if (!strcmp(argv[i],"-Struc")) + { + if (++i>=argc || argv[i][0]=='-') + {help(); cerr<<endl<<"Error in "<<program_name<<": no query file following -Struc\n"; exit(4);} + else + { + strucfile = new(char[strlen(argv[i])+1]); + strcpy(strucfile,argv[i]); + } + } + else if (!strcmp(argv[i],"-atab") || !strcmp(argv[i],"-Aliout")) + { + if (++i>=argc || argv[i][0]=='-') + {help(); cerr<<endl<<"Error in "<<program_name<<": no query file following -Struc\n"; exit(4);} + else + { + alitabfile = new(char[strlen(argv[i])+1]); + strcpy(alitabfile,argv[i]); + } + } + else if (!strcmp(argv[i],"-tc")) + { + if (++i>=argc || argv[i][0]=='-') + {help() ; cerr<<endl<<"Error in "<<program_name<<": no output file following -Opsi\n"; exit(4);} + else + { + tcfile = new(char[strlen(argv[i])+1]); + strcpy(tcfile,argv[i]); + } + } + else if (!strcmp(argv[i],"-h")|| !strcmp(argv[i],"--help")) + { + if (++i>=argc) {help(); exit(0);} + if (!strcmp(argv[i],"out")) {help_out(); exit(0);} + if (!strcmp(argv[i],"hmm")) {help_hmm(); exit(0);} + if (!strcmp(argv[i],"gap")) {help_gap(); exit(0);} + if (!strcmp(argv[i],"ali")) {help_ali(); exit(0);} + if (!strcmp(argv[i],"all")) {help_all(); exit(0);} + else {help(); exit(0);} + } + else if (!strcmp(argv[i],"-excl")) + { + if (++i>=argc) {help(); exit(4);} + par.exclstr = new(char[strlen(argv[i])+1]); + strcpy(par.exclstr,argv[i]); + } + else if (!strcmp(argv[i],"-v") && (i<argc-1) && argv[i+1][0]!='-' ) v=atoi(argv[++i]); + else if (!strcmp(argv[i],"-v")) v=2; + else if (!strcmp(argv[i],"-v0")) v=0; + else if (!strcmp(argv[i],"-v1")) v=1; + else if (!strcmp(argv[i],"-v2")) v=2; + else if (!strcmp(argv[i],"-v3")) v=3; + else if (!strcmp(argv[i],"-v4")) v=4; + else if (!strcmp(argv[i],"-v5")) v=5; + else if (!strcmp(argv[i],"-P") && (i<argc-1)) pself=atof(argv[++i]); + else if (!strcmp(argv[i],"-p") && (i<argc-1)) par.p = atof(argv[++i]); + else if (!strcmp(argv[i],"-e") && (i<argc-1)) par.E = atof(argv[++i]); + else if (!strcmp(argv[i],"-E") && (i<argc-1)) par.E = atof(argv[++i]); + else if (!strcmp(argv[i],"-b") && (i<argc-1)) par.b = atoi(argv[++i]); + else if (!strcmp(argv[i],"-B") && (i<argc-1)) par.B = atoi(argv[++i]); + else if (!strcmp(argv[i],"-z") && (i<argc-1)) par.z = atoi(argv[++i]); + else if (!strcmp(argv[i],"-Z") && (i<argc-1)) par.Z = atoi(argv[++i]); + else if (!strncmp(argv[i],"-nocons",7)) par.showcons=0; + else if (!strncmp(argv[i],"-nopred",7)) par.showpred=0; + else if (!strncmp(argv[i],"-nodssp",7)) par.showdssp=0; + else if (!strncmp(argv[i],"-mark",7)) par.mark=1; + else if (!strcmp(argv[i],"-seq") && (i<argc-1)) par.nseqdis=atoi(argv[++i]); + else if (!strcmp(argv[i],"-aliw") && (i<argc-1)) par.aliwidth=atoi(argv[++i]); + else if (!strcmp(argv[i],"-id") && (i<argc-1)) par.max_seqid=atoi(argv[++i]); + else if (!strcmp(argv[i],"-tct") && (i<argc-1)) probmin_tc=atoi(argv[++i]); + else if (!strcmp(argv[i],"-dwin") && (i<argc-1)) dotW=atoi(argv[++i]); + else if (!strcmp(argv[i],"-dsca") && (i<argc-1)) dotscale=atoi(argv[++i]); + else if (!strcmp(argv[i],"-dthr") && (i<argc-1)) dotthr=atof(argv[++i]); + else if (!strcmp(argv[i],"-dali") && (i<argc-1)) + { + dotali=1; + for (int index=0; index<256; index++) aliindices[index]=0; + while (i+1<argc && argv[i+1][0]!='-') // adds index to hash aliindices + { + i++; + if (strcmp(argv[i],"all")) aliindices[atoi(argv[i])]=1; + else dotali=2; + } + } + else if (!strcmp(argv[i],"-dmap")) + { + if (++i>=argc) + {help(); cerr<<endl<<"Error in "<<program_name<<": no filename following -o\n"; exit(4);} + else + { + dmapfile = new(char[strlen(argv[i])+1]); + strcpy(dmapfile,argv[i]); + } + } + else if (!strcmp(argv[i],"-dsat") && (i<argc-1)) dotsat=atof(argv[++i]); + else if (!strcmp(argv[i],"-qid") && (i<argc-1)) par.qid=atoi(argv[++i]); + else if (!strcmp(argv[i],"-qsc") && (i<argc-1)) par.qsc=atof(argv[++i]); + else if (!strcmp(argv[i],"-cov") && (i<argc-1)) par.coverage=atoi(argv[++i]); + else if (!strcmp(argv[i],"-diff") && (i<argc-1)) par.Ndiff=atoi(argv[++i]); + else if (!strcmp(argv[i],"-qscc") && (i<argc-1)) par.qsc_core=atof(argv[++i]); + else if (!strcmp(argv[i],"-csc") && (i<argc-1)) par.coresc=atof(argv[++i]); + else if (!strcmp(argv[i],"-Gonnet")) par.matrix=0; + else if (!strcmp(argv[i],"-HSDM")) par.matrix=1; + else if (!strcmp(argv[i],"-BLOSUM50")) par.matrix=2; + else if (!strcmp(argv[i],"-Blosum50")) par.matrix=2; + else if (!strcmp(argv[i],"-B50")) par.matrix=2; + else if (!strcmp(argv[i],"-BLOSUM62")) par.matrix=3; + else if (!strcmp(argv[i],"-Blosum62")) par.matrix=3; + else if (!strcmp(argv[i],"-B62")) par.matrix=3; + else if (!strcmp(argv[i],"-pcm") && (i<argc-1)) par.pcm=atoi(argv[++i]); + else if (!strcmp(argv[i],"-pca") && (i<argc-1)) par.pca=atof(argv[++i]); + else if (!strcmp(argv[i],"-pcb") && (i<argc-1)) par.pcb=atof(argv[++i]); + else if (!strcmp(argv[i],"-pcc") && (i<argc-1)) par.pcc=atof(argv[++i]); + else if (!strcmp(argv[i],"-pcw") && (i<argc-1)) par.pcw=atof(argv[++i]); + else if (!strcmp(argv[i],"-gapb") && (i<argc-1)) { par.gapb=atof(argv[++i]); if (par.gapb<=0.01) par.gapb=0.01;} + else if (!strcmp(argv[i],"-gapd") && (i<argc-1)) par.gapd=atof(argv[++i]); + else if (!strcmp(argv[i],"-gape") && (i<argc-1)) par.gape=atof(argv[++i]); + else if (!strcmp(argv[i],"-gapf") && (i<argc-1)) par.gapf=atof(argv[++i]); + else if (!strcmp(argv[i],"-gapg") && (i<argc-1)) par.gapg=atof(argv[++i]); + else if (!strcmp(argv[i],"-gaph") && (i<argc-1)) par.gaph=atof(argv[++i]); + else if (!strcmp(argv[i],"-gapi") && (i<argc-1)) par.gapi=atof(argv[++i]); + else if (!strcmp(argv[i],"-egq") && (i<argc-1)) par.egq=atof(argv[++i]); + else if (!strcmp(argv[i],"-egt") && (i<argc-1)) par.egt=atof(argv[++i]); + else if (!strcmp(argv[i],"-ssgap")) par.ssgap=1; + else if (!strcmp(argv[i],"-ssgapd") && (i<argc-1)) par.ssgapd=atof(argv[++i]); + else if (!strcmp(argv[i],"-ssgape") && (i<argc-1)) par.ssgape=atof(argv[++i]); + else if (!strcmp(argv[i],"-ssgapi") && (i<argc-1)) par.ssgapi=atoi(argv[++i]); + else if (!strcmp(argv[i],"-ssm") && (i<argc-1)) par.ssm=atoi(argv[++i]); + else if (!strcmp(argv[i],"-ssw") && (i<argc-1)) par.ssw=atof(argv[++i]); + else if (!strcmp(argv[i],"-ssa") && (i<argc-1)) par.ssa=atof(argv[++i]); + else if (!strncmp(argv[i],"-glo",3)) {par.loc=0; if (par.mact>0.3 && par.mact<0.301) {par.mact=0;} } + else if (!strncmp(argv[i],"-loc",3)) par.loc=1; + else if (!strncmp(argv[i],"-alt",4) && (i<argc-1)) par.altali=atoi(argv[++i]); + else if (!strcmp(argv[i],"-map") || !strcmp(argv[i],"-MAP")) par.forward=2; + else if (!strcmp(argv[i],"-mac") || !strcmp(argv[i],"-MAC")) par.forward=2; + else if (!strcmp(argv[i],"-vit")) par.forward=0; + else if (!strcmp(argv[i],"-sto") && (i<argc-1)) {Nstochali=atoi(argv[++i]); par.forward=1;} + else if (!strcmp(argv[i],"-r")) par.repmode=1; + else if (!strcmp(argv[i],"-M") && (i<argc-1)) + if (!strcmp(argv[++i],"a2m") || !strcmp(argv[i],"a3m")) par.M=1; + else if(!strcmp(argv[i],"first")) par.M=3; + else if (argv[i][0]>='0' && argv[i][0]<='9') {par.Mgaps=atoi(argv[i]); par.M=2;} + else cerr<<endl<<"WARNING: Ignoring unknown argument: -M "<<argv[i]<<"\n"; + else if (!strcmp(argv[i],"-shift") && (i<argc-1)) par.shift=atof(argv[++i]); + else if (!strcmp(argv[i],"-mact") && (i<argc-1)) {par.mact=atof(argv[++i]); par.forward=2;} + else if (!strcmp(argv[i],"-wstruc") && (i<argc-1)) par.wstruc=atof(argv[++i]); + else if (!strcmp(argv[i],"-opt") && (i<argc-1)) par.opt=atoi(argv[++i]); + else if (!strcmp(argv[i],"-sc") && (i<argc-1)) par.columnscore=atoi(argv[++i]); + else if (!strcmp(argv[i],"-corr") && (i<argc-1)) par.corr=atof(argv[++i]); + else if (!strcmp(argv[i],"-def")) par.readdefaultsfile=1; + else if (!strcmp(argv[i],"-ovlp") && (i<argc-1)) par.min_overlap=atoi(argv[++i]); + else if (!strcmp(argv[i],"-tags")) par.notags=0; + else if (!strcmp(argv[i],"-notags")) par.notags=1; + else cerr<<endl<<"WARNING: Ignoring unknown option "<<argv[i]<<" ...\n"; + if (v>=4) cout<<i<<" "<<argv[i]<<endl; //PRINT + } // end of for-loop for command line input +} +#endif + + + + +///////////////////////////////////////////////////////////////////////////// +//// MAIN PROGRAM +///////////////////////////////////////////////////////////////////////////// +/** + * + * hhalign() + * + * @param[in,out] ppcFirstProf + * first profile to be aligned + * @param[in] iFirstCnt + * number of sequences in 1st profile + * @param[in,out] ppcSecndProf + * second profile to be aligned + * @param[in] iSecndCnt + * number of sequences in 2nd profile + * @param[out] dScore_p + * score of alignment + * @param[in] prHMM + * HMM info of external HMM (background) + * @param[in] pcPrealigned1 + * (gapped) 1st sequence aligned to background HMM + * @param[in] pcRepresent1 + * (gapped) sequence representing background HMM aligned to 1st sequence + * @param[in] pcPrealigned2 + * (gapped) 2nd sequence aligned to background HMM + * @param[in] pcRepresent2 + * (gapped) sequence representing background HMM aligned to 2nd sequence + * @param[in] rHhalignPara, + * various parameters passed down from commandline + * e.g., iMaxRamMB + * + * iFlag,zcAux,zcError are debugging arguments + * + * @return Non-zero on error + */ +extern "C" int +hhalign(char **ppcFirstProf, int iFirstCnt, double *pdWeightsL, + char **ppcSecndProf, int iSecndCnt, double *pdWeightsR, + double *dScore_p, hmm_light *prHMM, + char *pcPrealigned1, char *pcRepresent1, + char *pcPrealigned2, char *pcRepresent2, + hhalign_para rHhalignPara, + int iFlag, + char zcAux[], char zcError[]) { + + +#ifdef CLUSTALO + iAux_GLOBAL = iFlag; +#ifndef CLUSTALO_NOFILE + int argc = 0; + char **argv = NULL; + argv = (char **)malloc(argc*sizeof(char *)); + for (int i = 0; i < argc; i++){ + argv[i] = (char *)malloc(100); + } + strcpy(argv[0], "./hhalign"); + strcpy(argv[1], "-t"); + strcpy(argv[2], "hhalign.C"); + strcpy(argv[3], "-i"); + strcpy(argv[4], "hhalign.C"); + strcpy(argv[5], "-ofas"); + strcpy(argv[6], "out"); +#endif +#endif + /*char* argv_conf[MAXOPT];*/ /* Input arguments from .hhdefaults file + (first=1: argv_conf[0] is not used) */ + /*int argc_conf;*/ // Number of arguments in argv_conf + /*char inext[IDLEN]="";*/ // Extension of query input file (hhm or a3m) + /*char text[IDLEN]="";*/ // Extension of template input file (hhm or a3m) + /*int** ali=NULL;*/ // ali[i][j]=1 if (i,j) is part of an alignment + /*int** alisto=NULL;*/ // ali[i][j]=1 if (i,j) is part of an alignment + int Nali; /* number of normally backtraced alignments + in dot plot */ + + SetDefaults(); + strcpy(par.tfile,""); /* FS, Initialise Argument */ + strcpy(par.alnfile,""); + par.p=0.0 ; /* minimum threshold for inclusion in hit list + and alignment listing */ + par.E=1e6; /* maximum threshold for inclusion in hit list + and alignment listing */ + par.b=1; // min number of alignments + par.B=100; // max number of alignments + par.z=1; // min number of lines in hit list + par.Z=100; // max number of lines in hit list + par.append=0; /* append alignment to output file + with -a option */ + par.altali=1; /* find only ONE (possibly overlapping) + subalignment */ + par.hitrank=0; /* rank of hit to be printed as a3m alignment + (default=0) */ + par.outformat=3; // default output format for alignment is a3m + hit.self=0; // no self-alignment + par.forward=2; /* 0: Viterbi algorithm; + 1: Viterbi+stochastic sampling; + 2:Maximum Accuracy (MAC) algorithm */ + + // Make command line input globally available +#ifndef CLUSTALO_NOFILE + par.argv=argv; + par.argc=argc; + RemovePathAndExtension(program_name,argv[0]); +#endif + +#ifndef CLUSTALO_NOFILE + /* Enable changing verbose mode before defaults file + and command line are processed */ + for (int i=1; i<argc; i++) + { + if (!strcmp(argv[i],"-def")) par.readdefaultsfile=1; + else if (argc>1 && !strcmp(argv[i],"-v0")) v=0; + else if (argc>1 && !strcmp(argv[i],"-v1")) v=1; + else if (argc>2 && !strcmp(argv[i],"-v")) v=atoi(argv[i+1]); + } + + // Read .hhdefaults file? + if (par.readdefaultsfile) + { + // Process default otpions from .hhconfig file + ReadDefaultsFile(argc_conf,argv_conf); + ProcessArguments(argc_conf,argv_conf); + } +#endif + /* Process command line options + (they override defaults from .hhdefaults file) */ +#ifndef CLUSTALO_NOFILE + ProcessArguments(argc,argv); +#endif + + +#ifdef CLUSTALO + int iAuxLen1 = strlen(ppcFirstProf[0]); + int iAuxLen2 = strlen(ppcSecndProf[0]); + par.maxResLen = iAuxLen1 > iAuxLen2 ? iAuxLen1 : iAuxLen2; + const int ciGoodMeasureSeq = 10; + par.maxResLen += ciGoodMeasureSeq; + par.maxColCnt = iAuxLen1 + iAuxLen2 + ciGoodMeasureSeq; + //par.max_seqid=iFirstCnt+iSecndCnt+3; /* -id */ + par.max_seqid=DEFAULT_FILTER; /* -id */ + par.loc=0; par.mact=0; /* -glob */ + par.nseqdis=iFirstCnt+iSecndCnt; /* -seq */ + par.showcons=0; /* -nocons */ + par.showdssp=0; /* -nodssp */ + par.Mgaps=100; /* -M */ + par.M=2; /* -M */ + par.pdWg1=pdWeightsL; /* tree wg */ + par.pdWg2=pdWeightsR; /* tree wg */ + v = 0; /* -v0 */ + /* NOTE: *qali declared globally but only created here, + pass in number of sequences to get rid of statically + defined MAXSEQ (FS) + */ + Alignment qali(iFirstCnt+iSecndCnt); + HMM q(iFirstCnt+iSecndCnt); + HMM t(iFirstCnt+iSecndCnt); +#endif + + +#ifndef CLUSTALO_NOFILE + // Check command line input and default values + if (!*par.infile) + {help(); cerr<<endl<<"Error in "<<program_name<<": no query alignment file given (-i file)\n"; exit(4);} + if (par.forward==2 && par.loc==0) + { + if (par.mact<0.301 || par.mact>0.300) + if (v>=1) fprintf(stderr,"REMARK: in -mac -global mode -mact is forced to 0\n"); + par.mact=0; + // par.loc=1; // global forward-backward algorithm seems to work fine! use it in place of local version. + } + + // Get rootname (no directory path, no extension) and extension of infile + RemoveExtension(q.file,par.infile); + RemoveExtension(t.file,par.tfile); /* FS, NOFILE2 (commented out) */ + Extension(inext,par.infile); + Extension(text,par.tfile); /*FS, NOFILE2 (commented out) */ + + // Check option compatibilities + if (par.nseqdis>MAXSEQDIS-3-par.showcons) par.nseqdis=MAXSEQDIS-3-par.showcons; //3 reserved for secondary structure + if (par.aliwidth<20) par.aliwidth=20; + if (par.pca<0.001) par.pca=0.001; // to avoid log(0) + if (par.b>par.B) par.B=par.b; + if (par.z>par.Z) par.Z=par.z; + if (par.hitrank>0) par.altali=0; + + // Input parameters + if (v>=3) + { + cout<<"query file : "<<par.infile<<"\n"; + cout<<"template file: "<<par.tfile<<"\n";/*FS, NOFILE2 (commented out) */ + cout<<"Output file: "<<par.outfile<<"\n"; + cout<<"Alignment file: "<<par.alnfile<<"\n"; + } +#endif /* NOFILE2 */ + + + // Set (global variable) substitution matrix and derived matrices + SetSubstitutionMatrix(); + + + // Set secondary structure substitution matrix + SetSecStrucSubstitutionMatrix(); + + + /* moved Viterbi switch from after RnP() to here, + switch after RnP() ineffectual as RnP decides log/lin of transition, + however log/lin of transitions depends on MAC/Viterbi, + FS, r228 -> r229 */ + int qL, tL; + if (iFirstCnt > 0) { + qL = strlen(ppcFirstProf[0]); + } + else { + qL = prHMM->L; + } + if (iSecndCnt > 0) { + tL = strlen(ppcSecndProf[0]); + } + else { + tL = prHMM->L; + } + + + // const float MEMSPACE_DYNPROG = 512*1024*1024; + /* determine amount of memory available for MAC on command-linel; FS, r240 -> r241 */ + const float MEMSPACE_DYNPROG = (double)1024*1024*rHhalignPara.iMacRamMB; + // longest allowable length of database HMM + int Lmaxmem=(int)((float)MEMSPACE_DYNPROG/qL/6/8); + if (par.forward==2 && tL+2>=Lmaxmem) { + if (v>=1) + cerr<<"WARNING: Not sufficient memory to realign with MAC algorithm. Using Viterbi algorithm."<<endl; + par.forward=0; + /* use different 'fudge' parameters for Viterbi, FS, r228 -> r229 */ + par.pca = par.pcaV; + par.pcb = par.pcbV; + par.pcc = par.pccV; + par.pcw = par.pcwV; + + par.gapb = par.gapbV; + par.gapd = par.gapdV; + par.gape = par.gapeV; + par.gapf = par.gapfV; + par.gapg = par.gapgV; + par.gaph = par.gaphV; + par.gapi = par.gapiV; + } + + + // Read input file (HMM, HHM, or alignment format), and add pseudocounts etc. + q.cQT = 'q'; + if (OK != ReadAndPrepare(INTERN_ALN_2_HMM, + ppcFirstProf, iFirstCnt, prHMM, + pcPrealigned1, pcRepresent1, pdWeightsL, + (char*)(""), q, &qali)) { + return -1; + } + // Set query columns in His-tags etc to Null model distribution + if (par.notags) q.NeutralizeTags(); + + // Do self-comparison? + if (0 /* !*par.tfile // FS, 2010-03-10 */) + { + // Deep-copy q into t + t = q; + + // Find overlapping alternative alignments + hit.self=1; + } + // Read template alignment/HMM t and add pseudocounts + else + { + char infile[] = ""; + /* Read input file (HMM, HHM, or alignment format), + and add pseudocounts etc. */ + t.cQT = 't'; + if (OK != ReadAndPrepare(INTERN_ALN_2_HMM, + ppcSecndProf, iSecndCnt, prHMM, + pcPrealigned2, pcRepresent2, pdWeightsR, + infile, t)) { + return -1; + } + } + + // Factor Null model into HMM t + t.IncludeNullModelInHMM(q,t); + + /* switch at this stage is ineffectual as log/lin already decided in RnP(). + FS, r228 -> r229 */ + /*const float MEMSPACE_DYNPROG = 512*1024*1024; + // longest allowable length of database HMM + int Lmaxmem=(int)((float)MEMSPACE_DYNPROG/q.L/6/8); + if (par.forward==2 && t.L+2>=Lmaxmem) + { + if (v>=1) + cerr<<"WARNING: Not sufficient memory to realign with MAC algorithm. Using Viterbi algorithm."<<endl; + par.forward=0; + }*/ + + // Allocate memory for dynamic programming matrix + hit.AllocateBacktraceMatrix(q.L+2,t.L+2); // ...with a separate dynamic programming matrix (memory!!) + if (par.forward>=1 || Nstochali) + hit.AllocateForwardMatrix(q.L+2,t.L+2); + if (par.forward==2) + hit.AllocateBackwardMatrix(q.L+2,t.L+2); + +#ifndef CLUSTALO_NOFILE + // Read structure file for Forward() function? + if (strucfile && par.wstruc>0) + { + float PMIN=1E-20; + Pstruc = new(float*[q.L+2]); + for (int i=0; i<q.L+2; i++) Pstruc[i] = new(float[t.L+2]); + Sstruc = new(float*[q.L+2]); + for (int i=0; i<q.L+2; i++) Sstruc[i] = new(float[t.L+2]); + FILE* strucf=NULL; + if (strcmp(strucfile,"stdin")) + { + strucf = fopen(strucfile, "r"); + if (!strucf) OpenFileError(strucfile); + } + else + { + strucf = stdin; + if (v>=2) printf("Reading structure matrix from standard input ... (for UNIX use ^D for 'end-of-file')\n"); + } + for (int i=1; i<=q.L; i++) + { + for (int j=1; j<=t.L; j++) + { + float f; + if (fscanf(strucf,"%f",&f) <=0 ) + { + fprintf(stderr,"Error: too few numbers in file %s while reading line %i, column %i\n",strucfile,i,j); + exit(1); + } + if (par.wstruc==1) + Pstruc[i][j]=fmax(f,PMIN); + else + Pstruc[i][j]=fmax(pow(f,par.wstruc),PMIN); +// printf("%10.2E ",f); + Sstruc[i][j] = par.wstruc * log2(f); + } +// printf("\n"); + } + fclose(strucf); + } /* (strucfile && par.wstruc>0) */ +#endif + + /* Do (self-)comparison, store results if score>SMIN, + and try next best alignment */ + /* FIXME very ambigous and possibly faulty if-else */ + if (v>=2) { + if (par.forward==2) { + printf("Using maximum accuracy (MAC) alignment algorithm ...\n"); + } + else if (par.forward==0) { + printf("Using Viterbi algorithm ...\n"); + } + else if (par.forward==1) { + printf("Using stochastic sampling algorithm ...\n"); + } + else { + printf("\nWhat alignment algorithm are we using??\n"); + } + } + + + for (hit.irep=1; hit.irep<=imax(par.hitrank,par.altali); hit.irep++) + { + if (par.forward==0) + { + // generate Viterbi alignment + hit.Viterbi(q,t,Sstruc); + hit.Backtrace(q,t); + } + else if (par.forward==1) + { + // generate a single stochastically sampled alignment + hit.Forward(q,t,Pstruc); + srand( time(NULL) ); // initialize random generator + hit.StochasticBacktrace(q,t); + hitlist.Push(hit); /* insert hit at beginning of list + (last repeats first!) */ + (hit.irep)++; + break; + } + else if (par.forward==2) + { + // generate forward alignment + hit.Forward(q,t,Pstruc); + if ((isnan(hit.score)) || (isnan(hit.Pforward))){ + printf("nan after forward\n"); + } + hit.Backward(q,t); + if ((isnan(hit.score)) || (isnan(hit.Pforward))){ + printf("nan after backward\n"); + } + hit.MACAlignment(q,t); + if ((isnan(hit.score)) || (isnan(hit.Pforward))){ + printf("nan after MAC\n"); + } + hit.BacktraceMAC(q,t); + if ((isnan(hit.score)) || (isnan(hit.Pforward))){ + printf("nan after backtrace\n"); + } + } +// printf ("%-12.12s %-12.12s irep=%-2i score=%6.2f hit.Pvalt=%.2g\n",hit.name,hit.fam,hit.irep,hit.score,hit.Pvalt); + *dScore_p = hit.score; + + if (hit.irep<=par.hitrank || hit.score>SMIN || (hit.Pvalt<pself && hit.score>0 )) + hitlist.Push(hit); // insert hit at beginning of list (last repeats first!) and do next alignment + else + { + if (hit.irep==1) hitlist.Push(hit); // first hit will be inserted into hitlist anyway, even if not significant + hit = hitlist.ReadLast(); // last alignment was not significant => read last (significant) hit from list + break; + /* FIXME: memory leak during normal alignment: both push'es above are not freed: + * valgrind --leak-check=full --show-reachable=yes ./src/clustalo -i ~/void/protein.fa -o /dev/null -v + ==9506== 1,456 bytes in 1 blocks are still reachable in loss record 4 of 5 + ==9506== at 0x4C2726C: operator new(unsigned long) (vg_replace_malloc.c:230) + ==9506== by 0x4618C5: List<Hit>::Push(Hit) (list-C.h:134) + ==9506== by 0x45E87A: hhalign (hhalign.cpp:914) + ==9506== by 0x413F8C: HhalignWrapper (hhalign_wrapper.c:405) + ==9506== by 0x41A7B5: MyMain (mymain.c:676) + ==9506== by 0x4031A6: main (main.cpp:37) + ==9506== + ==9506== + ==9506== 4,442 (4,368 direct, 74 indirect) bytes in 3 blocks are definitely lost in loss record 5 of 5 + ==9506== at 0x4C2726C: operator new(unsigned long) (vg_replace_malloc.c:230) + ==9506== by 0x4618C5: List<Hit>::Push(Hit) (list-C.h:134) + ==9506== by 0x45E7C0: hhalign (hhalign.cpp:911) + ==9506== by 0x413F8C: HhalignWrapper (hhalign_wrapper.c:405) + ==9506== by 0x41A7B5: MyMain (mymain.c:676) + ==9506== by 0x4031A6: main (main.cpp:37) + */ + } + } + Nali = hit.irep; + + +#ifndef CLUSTALO_NOFILE + // Write posterior probability matrix as TCoffee library file + if (tcfile) + { + if (v>=2) printf("Writing TCoffee library file to %s\n",tcfile); + int i,j; + FILE* tcf=NULL; + if (strcmp(tcfile,"stdout")) tcf = fopen(tcfile, "w"); else tcf = stdout; + if (!tcf) OpenFileError(tcfile); + fprintf(tcf,"! TC_LIB_FORMAT_01\n"); + fprintf(tcf,"%i\n",2); // two sequences in library file + fprintf(tcf,"%s %i %s\n",q.name,q.L,q.seq[q.nfirst]+1); + fprintf(tcf,"%s %i %s\n",hit.name,hit.L,hit.seq[hit.nfirst]+1); + fprintf(tcf,"#1 2\n"); + for (i=1; i<=q.L; i++) // print all pairs (i,j) with probability above PROBTCMIN + for (j=1; j<=t.L; j++) + if (hit.B_MM[i][j]>probmin_tc) + fprintf(tcf,"%5i %5i %5i\n",i,j,iround(100.0*hit.B_MM[i][j])); + for (int step=hit.nsteps; step>=1; step--) // print all pairs on MAC alignment which were not yet printed + { + i=hit.i[step]; j=hit.j[step]; +// printf("%5i %5i %5i %i\n",i,j,iround(100.0*hit.B_MM[i][j]),hit.states[step]); + if (hit.states[step]>=MM && hit.B_MM[i][j]<=probmin_tc) + fprintf(tcf,"%5i %5i %5i\n",i,j,iround(100.0*hit.B_MM[i][j])); + } + + + fprintf(tcf,"! SEQ_1_TO_N\n"); + fclose(tcf); +// for (i=1; i<=q.L; i++) +// { +// double sum=0.0; +// for (j=1; j<=t.L; j++) sum+=hit.B_MM[i][j]; +// printf("i=%-3i sum=%7.4f\n",i,sum); +// } +// printf("\n"); + } /* if (tcfile) */ + + // Write last alignment into alitabfile + if (alitabfile) + { + FILE* alitabf=NULL; + if (strcmp(alitabfile,"stdout")) alitabf = fopen(alitabfile, "w"); else alitabf = stdout; + if (!alitabf) OpenFileError(alitabfile); + if (par.forward==2) + { + fprintf(alitabf," i j score SS probab\n"); + for (int step=hit.nsteps; step>=1; step--) + if (hit.states[step]>=MM) + fprintf(alitabf,"%5i %5i %6.2f %6.2f %7.4f\n",hit.i[step],hit.j[step],hit.S[step],hit.S_ss[step],hit.P_posterior[step]); + } + else + { + fprintf(alitabf," i j score SS\n"); + for (int step=hit.nsteps; step>=1; step--) + if (hit.states[step]>=MM) + fprintf(alitabf,"%5i %5i %6.2f %6.2f\n",hit.i[step],hit.j[step],hit.S[step],hit.S_ss[step]); + } + fclose(alitabf); + } /* if (alitabfile) */ +#endif + + // Do Stochastic backtracing? + if (par.forward==1) + for (int i=1; i<Nstochali; i++) + { + hit.StochasticBacktrace(q,t); + hitlist.Push(hit); //insert hit at beginning of list (last repeats first!) + (hit.irep)++; + } + else // Set P-value, E-value and probability + { + if (q.mu) hitlist.GetPvalsFromCalibration(q); + else if (t.mu) hitlist.GetPvalsFromCalibration(t); + } + + // Print FASTA or A2M alignments? +#ifndef CLUSTALO_NOFILE + if (*par.pairwisealisfile) +#endif + { + if (v>=2) { + cout<<"Printing alignments in " << + (par.outformat==1? "FASTA" : par.outformat==2?"A2M" :"A3M") << + " format to "<<par.pairwisealisfile<<"\n"; + } + hitlist.PrintAlignments( +#ifdef CLUSTALO + ppcFirstProf, ppcSecndProf, +#endif + q, par.pairwisealisfile, par.outformat); + } /* if (*par.pairwisealisfile) */ + +#ifndef CLUSTALO_NOFILE + // Print hit list and alignments + if (*par.outfile) + { + hitlist.PrintHitList(q, par.outfile); + hitlist.PrintAlignments( +#ifdef CLUSTALO + ppcFirstProf, ppcSecndProf, +#endif + q, par.outfile); + if (v>=2) { + WriteToScreen(par.outfile,1000); //write only hit list to screen + } + } +#endif + + + /////////////////////////////////////////////////////////////////////// +#ifndef CLUSTALO_NOFILE + // Show results for hit with rank par.hitrank + if (par.hitrank==0) hit=hitlist.Read(1); else hit=hitlist.Read(par.hitrank); + + // Generate output alignment or HMM file? + if (*par.alnfile || *par.psifile || *par.hhmfile) + { + if (par.append==0) + { + if (v>=2 && *par.alnfile) printf("Merging template to query alignment and writing resulting alignment in A3M format to %s...\n",par.alnfile); + if (v>=2 && *par.psifile) printf("Merging template to query alignment and writing resulting alignment in PSI format to %s...\n",par.psifile); + } + else + { + if (v>=2 && *par.alnfile) printf("Merging template to query alignment and appending template alignment in A3M format to %s...\n",par.alnfile); + if (v>=2 && *par.psifile) printf("Merging template to query alignment and appending template alignment in PSI format to %s...\n",par.psifile); + } + + // Read query alignment into Qali + Alignment Qali; // output A3M generated by merging A3M alignments for significant hits to the query alignment + char qa3mfile[NAMELEN]; + RemoveExtension(qa3mfile,par.infile); // directory?? + strcat(qa3mfile,".a3m"); + FILE* qa3mf=fopen(qa3mfile,"r"); + if (!qa3mf) OpenFileError(qa3mfile); + Qali.Read(qa3mf,qa3mfile); + fclose(qa3mf); + + // Align query with template in master-slave mode + Qali.MergeMasterSlave(hit,par.tfile); /*FS, NOFILE2 (commented out) */ + + // Write output A3M alignment? + if (*par.alnfile) { + Qali.WriteToFile(par.alnfile,"a3m"); + } + + if (*par.psifile) + { + /* Convert ASCII to int (0-20),throw out all insert states, + record their number in I[k][i] */ + Qali.Compress("merged A3M file"); + + // Write output PSI-BLAST-formatted alignment? + Qali.WriteToFile(par.psifile,"psi"); + } + } /* if (*par.alnfile || *par.psifile || *par.hhmfile) */ +#endif /* NOFILE2 */ + ////////////////////////////////////////////////////////////////////////// + + + + +// double log2Pvalue; +// if (par.ssm && (par.ssm1 || par.ssm2)) +// { +// log2Pvalue=hit.logPval/0.693147181+0.45*(4.0*par.ssw/0.15-hit.score_ss); +// if (v>=2) +// printf("Aligned %s with %s:\nApproximate P-value INCLUDING SS SCORE = %7.2g\n",q.name,t.name,pow(2.0,log2Pvalue)); +// } else { +// if (v>=2) +// printf("Aligned %s with %s:\nApproximate P-value (without SS score) = %7.2g\n",q.name,t.name,hit.Pval); +// } + + if (v>=2) + { + if (par.hitrank==0) + printf("Aligned %s with %s: Score = %-7.2f P-value = %-7.2g\n", + q.name,t.name,hit.score,hit.Pval); + else + printf("Aligned %s with %s (rank %i): Score = %-7.2f P-value = %-7.2g\n", + q.name,t.name,par.hitrank,hit.score,hit.Pval); + } + + + // Delete memory for dynamic programming matrix + hit.DeleteBacktraceMatrix(q.L+2); + if (par.forward>=1 || Nstochali) + hit.DeleteForwardMatrix(q.L+2); + if (par.forward==2) + hit.DeleteBackwardMatrix(q.L+2); + /* if (Pstruc) { + for (int i=0; i<q.L+2; i++) delete[](Pstruc[i]); delete[](Pstruc);} + */ + + // Delete content of hits in hitlist + hitlist.Reset(); + while (!hitlist.End()) + hitlist.ReadNext().Delete(); // Delete content of hit object + + if (strucfile && par.wstruc>0) + { + for (int i=0; i<q.L+2; i++){ + delete[] Pstruc[i]; Pstruc[i] = NULL; + } + delete[] Pstruc; Pstruc = NULL; + for (int i=0; i<q.L+2; i++){ + delete[] Sstruc[i]; Sstruc[i] = NULL; + } + delete[] Sstruc; Sstruc = NULL; + delete[] strucfile; strucfile = NULL; + } + + if (pngfile){ + delete[] pngfile; pngfile = NULL; + } + if (alitabfile){ + delete[] alitabfile; alitabfile = NULL; + } + if (tcfile){ + delete[] tcfile; tcfile = NULL; + } + if (par.exclstr){ + delete[] par.exclstr; par.exclstr = NULL; + } + +#ifndef CLUSTALO_NOFILE + // Print 'Done!' + FILE* outf=NULL; + if (!strcmp(par.outfile,"stdout")) printf("Done!\n"); + else + { + if (*par.outfile) + { + outf=fopen(par.outfile,"a"); //open for append + fprintf(outf,"Done!\n"); + fclose(outf); + } + if (v>=2) printf("Done\n"); + } +#endif + + //qali.ClobberGlobal(); + hit.ClobberGlobal(); + if (iFirstCnt > 0){ + q.ClobberGlobal(); + } + if (iSecndCnt > 0){ + t.ClobberGlobal(); + } + hitlist.ClobberGlobal(); + + return 0; + +} /* this is the end of hhalign() //end main */ + +////////////////////////////////////////////////////////////////////////////// +// END OF MAIN +////////////////////////////////////////////////////////////////////////////// + +/* + * EOF hhalign.C + */ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhalign.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,30 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhalign.h 241 2011-05-04 14:37:17Z fabian $ + */ + + +extern int +hhalign(char **ppcFirstProf, int iFirstCnt, double *pdWeightsL, + char **ppcSecndProf, int iSecndCnt, double *pdWeightsR, + double *dScore_p, hmm_light *prHMM, + char *pcPrealigned1, char *pcRepresent1, + char *pcPrealigned2, char *pcRepresent2, + hhalign_para rHhalignPara, + int iFlag, + char zcAux[], char zcError[]);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhalignment-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,3028 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhalignment-C.h 236 2011-04-14 11:30:04Z fabian $ + */ + + +/* + * Changelog: Michael Remmert made changes to hhalign stand-alone code + * FS implemented some of the changes on 2010-10-28 -> MR1 + * + * Note: MR seems to have changed all [aijk]++ to ++[aijk], + * FS did not do that on 2010-10-28 + */ + +// hhalignment.C + +////////////////////////////////////////////////////////////////////////////// +//// Class Alignment +////////////////////////////////////////////////////////////////////////////// + +// hhalignment.C + +#ifndef MAIN +#define MAIN +#include <iostream> // cin, cout, cerr +#include <fstream> // ofstream, ifstream +#include <stdio.h> // printf +using std::cout; +using std::cerr; +using std::endl; +using std::ios; +using std::ifstream; +using std::ofstream; +#include <stdlib.h> // exit +#include <string> // strcmp, strstr +#include <math.h> // sqrt, pow +#include <limits.h> // INT_MIN +#include <float.h> // FLT_MIN +#include <time.h> // clock +#include <ctype.h> // islower, isdigit etc +#include "util-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "list.h" // list data structure +#include "hash.h" // hash data structure +#include "hhdecl-C.h" +#include "hhutil-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "hhhmm.h" +#endif + + +enum {KEEP_NOT = 0, KEEP_CONDITIONALLY, KEEP_ALWAYS}; + +////////////////////////////////////////////////////////////////////////////// +// Class Alignment +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////// +// Object constructor +////////////////////////////////////////////////////////////////////////////// +Alignment::Alignment(int maxseq, int maxres) +{ + + //printf(">>>>>>>>%s:%s:%d: maxseq=%d, maxres=%d\n", __FUNCTION__, __FILE__, __LINE__, maxseq, maxres); /* (FS) */ + longname = new(char[DESCLEN]); + sname = new(char*[maxseq+2]); /* MR1 */ + seq = new(char*[maxseq+2]); /* MR1 */ + l = new(int[maxres]); + X = new(char*[maxseq+2]); /* MR1 */ + I = new(short unsigned int*[maxseq+2]); /* MR1 */ + keep = new(char[maxseq+2]); /* MR1 */ + display = new(char[maxseq+2]); /* MR1 */ + wg = new(float[maxseq+2]); /* MR1 */ + nseqs = new(int[maxres+2]); /* MR1 */ + N_in=L=0; + nres=NULL; // number of residues per sequence k + first=NULL; // first residue in sequence k + last=NULL; // last residue in sequence k + ksort=NULL; // sequence indices sorted by descending nres[k] + name[0]='\0'; // no name defined yet + longname[0]='\0'; // no name defined yet + fam[0]='\0'; // no name defined yet + file[0]='\0'; // no name defined yet + readCommentLine = '0'; /* MR1 */ +} + +////////////////////////////////////////////////////////////////////////////// +// Object destructor +////////////////////////////////////////////////////////////////////////////// +Alignment::~Alignment() +{ + delete[] longname; longname = NULL; + for(int k=0; k<N_in; k++) + { + delete[] sname[k]; sname[k] = NULL; + delete[] seq[k]; seq[k] = NULL; + delete[] X[k]; X[k] = NULL; + delete[] I[k]; I[k] = NULL; + } + delete[] sname; sname = NULL; + delete[] seq; seq = NULL; + delete[] X; X = NULL; + delete[] I; I = NULL; + delete[] l; l = NULL; + delete[] keep; keep = NULL; + delete[] display; display = NULL; + delete[] wg; wg = NULL; + delete[] nseqs; nseqs = NULL; + delete[] nres; nres = NULL; + delete[] first; first = NULL; + delete[] last; last = NULL; + delete[] ksort; ksort = NULL; +} + + +/** + * @brief Reads in an alignment from file into matrix seq[k][l] as ASCII + */ +void +Alignment::Read(FILE* inf, char infile[], char* firstline) +{ + int l; // Postion in alignment incl. gaps (first=1) + int h; // Position in input line (first=0) + int k; // Index of sequence being read currently (first=0) + char line[LINELEN]=""; // input line + //char cur_seq[MAXCOL]; // Sequence currently read in + char *cur_seq=new(char[par.maxColCnt]); + char* cur_name; // Sequence currently read in + int linenr=0; // current line number in input file + char skip_sequence=0; + RemoveExtension(file,infile); //copy rootname (w/o path) of infile into file variable of class object + + kss_dssp=ksa_dssp=kss_pred=kss_conf=kfirst=-1; + n_display=0; + N_in=0; + N_filtered=0; + N_ss=0; + cur_seq[0]=' '; // overwrite '\0' character at beginning to be able to do strcpy(*,cur_seq) + l=1; k=-1; + + // Does firstline already contain first line of file? + if (firstline!= NULL) strcpy(line,firstline); + + ///////////////////////////////////////////////////////////////////////// + // Read infile line by line + /* FIXME: not safe to use MAXSEQ, however, don't think we ever get here (FS) */ + while(firstline || (fgetline(line,LINELEN,inf) && (k<MAXSEQ))) /* FIXME: FS introduced () around &&, precedence! MR1 */ + { + linenr++; + firstline=NULL; + if (line[0]=='>') //line contains sequence name + { + if (k>=MAXSEQ-1) + { + if (v>=1 && k>=MAXSEQ) + cerr<<endl<<"WARNING: maximum number "<<MAXSEQ<<" of sequences exceded in file "<<infile<<"\n"; + break; + } + cur_name=line+1; //beginning of current sequence name + if (k>=0) //if this is at least the second name line + { + if (strlen(cur_seq)==0) + { + cerr<<endl<<"Error: sequence "<<sname[k]<<" contains no residues."<<endl; + exit(1); + } + + // Create space for residues and paste new sequence in + seq[k]=new(char[strlen(cur_seq)+2]); + if (!seq[k]) MemoryError("array for input sequences"); + X[k]=new(char[strlen(cur_seq)+2]); + if (!X[k]) MemoryError("array for input sequences"); + I[k]=new(short unsigned int[strlen(cur_seq)+2]); + if (!I[k]) MemoryError("array for input sequences"); + strcpy(seq[k],cur_seq); + } + skip_sequence=0; + + k++; + l=1; //position in current sequence (first=1) + + // display[k]= 0: do not show in Q-T alignments 1: show if not filtered out later 2: show in any case (do not filter out) + // keep[k] = 0: do not include in profile 1: include if not filtered out later 2: include in any case (do not filter out) + /* {KEEP_NOT=0, KEEP_CONDITIONALLY=1, KEEP_ALWAYS=2} */ + if (line[1]=='@') cur_name++; //skip @-character in name + if (!strncmp(line,">ss_dssp",8)) { + if (kss_dssp<0) {display[k]=2; n_display++; keep[k]=KEEP_NOT; kss_dssp=k; N_ss++;} else {skip_sequence=1; k--; continue;} + } + else if (!strncmp(line,">sa_dssp",8)) { + if (ksa_dssp<0) {display[k]=KEEP_ALWAYS; n_display++; keep[k]=KEEP_NOT; ksa_dssp=k; N_ss++;} else {skip_sequence=1; k--; continue;} + } + else if (!strncmp(line,">ss_pred",8)) { + if (kss_pred<0) {display[k]=KEEP_ALWAYS; n_display++; keep[k]=KEEP_NOT; kss_pred=k; N_ss++;} else {skip_sequence=1; k--; continue;} + } + else if (!strncmp(line,">ss_conf",8)) { + if (kss_conf<0) {display[k]=KEEP_ALWAYS; n_display++; keep[k]=KEEP_NOT; kss_conf=k; N_ss++;} else {skip_sequence=1; k--; continue;} + } + else if (!strncmp(line,">ss_",4) || !strncmp(line,">sa_",4)) { + display[k]=KEEP_ALWAYS; n_display++; keep[k]=KEEP_NOT; N_ss++; + } + else if (!strncmp(line,">aa_",4)) { // ignore sequences beginning with ">aa_" + skip_sequence=1; k--; continue; + } + //store first real seq + else if (kfirst<0) + { + char word[NAMELEN]; + strwrd(word,line); // Copies first word in ptr to str + if (strstr(word,"_consensus")) + {display[k]=2; keep[k]=0; n_display++; kfirst=k;} /* MR1 */ + else + {display[k]=keep[k]=KEEP_ALWAYS; n_display++; kfirst=k;} + } + //store all sequences + else if (par.mark==0) {display[k]=keep[k]=KEEP_CONDITIONALLY; n_display++;} + //store sequences up to nseqdis + else if (line[1]=='@'&& n_display-N_ss<par.nseqdis) {display[k]=keep[k]=KEEP_ALWAYS; n_display++;} + else {display[k]=KEEP_NOT; keep[k]=KEEP_CONDITIONALLY;} + + // store sequence name + if (v>=4) printf("Reading seq %-16.16s k=%3i n_displ=%3i display[k]=%i keep[k]=%i\n",cur_name,k,n_display,display[k],keep[k]); + sname[k] = new(char[strlen(cur_name)+1]); + if (!sname[k]) {MemoryError("array for sequence names");} + strcpy(sname[k],cur_name); + } // end if(line contains sequence name) + + else if (line[0]=='#') // Commentary line? + { + // #PF01367.9 5_3_exonuc: 5'-3' exonuclease, C-terminal SAM fold; PDB 1taq, 1bgx (T:271-174), 1taq (271-174) + if (name[0]) continue; // if already name defined: skip commentary line + char *ptr1, *ptr2; + ptr1=strscn_(line+1); // set ptr1 to first non-whitespace character after '#' -> AC number + strncpy(longname,ptr1,DESCLEN-1); // copy whole commentary line after '# ' into longname + longname[DESCLEN-1]='\0'; + strtr(longname,""," "); + ptr2=strcut_(ptr1); // cut after AC number and set ptr2 to first non-whitespace character after AC number + // strcpy(fam,ptr1); // copy AC number to fam + // if (!strncmp(fam,"PF",2)) strcut_(fam,'.'); // if PFAM identifier contains '.' cut it off + // strcut_(ptr2); // cut after first word ... + strcpy(name,ptr1); // ... and copy first word into name + readCommentLine = '1'; /* MR1 */ + } + + //line contains sequence residues or SS information and does not belong to a >aa_ sequence + else if (!skip_sequence) + { + if (v>=4) cout<<line<<"\n"; //DEBUG + if (k==-1 && v) + { + cerr<<endl<<"WARNING: No sequence name preceding following line in "<<infile<<":\n\'"<<line<<"\'\n"; + continue; + } + + h=0; //counts characters in current line + + // Check whether all characters are correct; store into cur_seq + if (keep[k] || (k == kfirst) ) // normal line containing residues /* MR1 */ + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (aa2i(line[h])>=0) // ignore white-space characters ' ', \t and \n (aa2i()==-1) + {cur_seq[l]=line[h]; l++;} + else if (aa2i(line[h])==-2 && v) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line "<<linenr<<" of "<<infile<<"\n"; + h++; + } + } + else if (k==kss_dssp) // lines with dssp secondary structure states (. - H E C S T G B) + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (ss2i(line[h])>=0 && ss2i(line[h])<=7) + {cur_seq[l]=ss2ss(line[h]); l++;} + else if (v) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line "<<linenr<<" of "<<infile<<"\n"; + h++; + } + } + else if (k==ksa_dssp) // lines with dssp solvent accessibility states (. - ???) + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (sa2i(line[h])>=0) + cur_seq[l++]=line[h]; + else if (v) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line "<<linenr<<" of "<<infile<<"\n"; + h++; + } + } + else if (k==kss_pred) // lines with predicted secondary structure (. - H E C) + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (ss2i(line[h])>=0 && ss2i(line[h])<=3) + {cur_seq[l]=ss2ss(line[h]); l++;} + else if (v) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line "<<linenr<<" of "<<infile<<"\n"; + h++; + } + } + else if (k==kss_conf) // lines with confidence values should contain only 0-9, '-', or '.' + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (line[h]=='-' || line[h]=='.' || (line[h]>='0' && line[h]<='9')) + {cur_seq[l]=line[h]; l++;} + else if (v) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<l<<" in line "<<linenr<<" of "<<infile<<"\n"; + h++; + } + } + else if (display[k]) // other lines such as >sa_pred etc + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (line[h]=='-' || line[h]=='.' || (line[h]>='0' && line[h]<='9') || (line[h]>='A' && line[h]<='B')) + {cur_seq[l]=line[h]; l++;} + else if (v) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<l<<" in line "<<linenr<<" of "<<infile<<"\n"; + h++; + } + } + if (v && l>=/*MAXCOL*/par.maxColCnt-1) + { + cerr<<endl<<"WARNING: maximum number of residues "<</*MAXCOL*/par.maxColCnt-2<<" exceded in sequence "<<sname[k]<<"\n"; + skip_sequence=1; + } + cur_seq[l]='\0'; //Ensure that cur_seq ends with a '\0' character + } //end else + + } + ///////////////////////////////////////////////////////////////////////// + + + if (k>=0) //if at least one sequence was read in + { + seq[k]=new(char[strlen(cur_seq)+2]); + if (!seq[k]) MemoryError("array for input sequences"); + X[k]=new(char[strlen(cur_seq)+2]); + if (!X[k]) MemoryError("array for input sequences"); + I[k]=new(short unsigned int[strlen(cur_seq)+2]); + if (!I[k]) MemoryError("array for input sequences"); + strcpy(seq[k],cur_seq); + } + else + {cerr<<endl<<"Error: no sequences found in file "<<infile<<"\n"; exit(1);} + + N_in = k+1; + + // Set name, longname, fam + if (!*name) // longname, name and family were not set by '#...' line yet -> extract from first sequence + { + char* ptr; + // strtr(sname[kfirst],"~"," "); // 'transpose': replaces the tilde with a blanc everywhere in sname[kfirst] + strncpy(longname,sname[kfirst],DESCLEN-1); // longname is name of first sequence + longname[DESCLEN-1]='\0'; + strncpy(name,sname[kfirst],NAMELEN-1); // Shortname is first word of longname... + name[NAMELEN-1]='\0'; + ptr = strcut(name); // ...until first white-space character + if (ptr && islower(ptr[0]) && ptr[1]=='.' && isdigit(ptr[2])) //Scop family code present as second word? + { + lwrstr(name); // Transform upper case to lower case + strcut(ptr); // Non-white-space characters until next white-space character.. + strcpy(fam,ptr); // ...are the SCOP familiy code + } + else if (name[0]=='P' && name[1]=='F' && isdigit(name[2]) && isdigit(name[3]) ) //Pfam code + { + strcpy(fam,name); // set family name = Pfam code + } + } + + + + delete[] cur_seq; cur_seq = NULL; + + // Checking for warning messages + if (v==0) return; + if (v>=2) cout<<"Read "<<infile<<" with "<<N_in<<" sequences\n"; + if (v>=3) cout<<"Query sequence for alignment has number "<<kfirst<<" (0 is first)\n"; + return; +} + +/* + * At this point GetSeqsFromHMM() slots in, however, + * only needed in hhbliys.C, so will skip it for moment, MR1 + */ + + +///////////////////////////////////////////////////////////////////////////// +/** + * @brief Convert ASCII in seq[k][l] to int (0-20) in X[k][i], + * throw out all insert states, record their number in I[k][i] + * and store sequences to be displayed in seq[k] */ +///////////////////////////////////////////////////////////////////////////// +void +Alignment::Compress(const char infile[]) +{ + int i; // Index for match state (first=1) + int l; // Postion in alignment incl. gaps (first=1) + int k; // Index for sequences (first=0) + int a; // amino acid index + char c; + int unequal_lengths=0; /* k: seq k doesn't have same number + of match states as seq 0 => WARNING */ + /* points to next character in seq[k] to be written */ + /*static short unsigned int h[MAXSEQ];*/ + /*short*/ unsigned int *h = NULL; /* short may lead to overflow for long alignments, FS, r235 -> r236 */ + + h = new(/*short*/ unsigned int[N_in+2]); /* short -> overflow, FS, r235 -> r236 */ + float *percent_gaps = NULL; /* FS, 2010-Nov */ + char *match_state = NULL; /* FS, 2010-Nov */ + + + // Initialize + for (k=0;k<N_in; k++) + {I[k][0]=0;} + + if (v>=3) + { + if (par.M==1) + cout<<"Using match state assignment by capital letters (a2m format)\n"; + else if (par.M==2) cout<<"Using percentage-rule match state assignment\n"; + else if (par.M==3) cout<<"Using residues of first sequence as match states\n"; + } + + // Create matrices X and I with amino acids represented by integer numbers + switch(par.M) + { + + ///////////////////////////////////////////////////////////////////////// + /* a2m/a3m format: match states capital case, + inserts lower case, delete states '-', inserted gaps '.' + The confidence values for ss prediction are interpreted as follows: + 0-9:match states(!) '-' :match state '.':insert */ + case 1: + default: + + // Warn if alignment is ment to be -M first or -M NN instead of A2M/A3M + if (v>=2 && strchr(seq[kfirst],'-') ) // Seed/query sequence contains a gap ... + { + for (k=1; k<N_in; k++) + if (strpbrk(seq[k],"abcdefghiklmnpqrstuvwxyz.")) break; + if (k==N_in) // ... but alignment contains no lower case residue + printf("WARNING: input alignment %s looks like aligned FASTA instead of A2M/A3M format. Consider using '-M first' or '-M 50'\n",infile); + } + + // Remove '.' characters from seq[k] + for(k=0; k<N_in; k++) + { + char* ptrS=seq[k]; // pointer to source: character in seq[k] + char* ptrD=seq[k]; // pointer to destination: seq[k] + while(1) // omit '.' symbols + { + if (*ptrS!='.') {*ptrD=*ptrS; ptrD++;} //leave out '.' symbols + if (!*ptrS) break; + ptrS++; + } + } + L=/*MAXRES*/par.maxResLen-2; // needed because L=imin(L,i) + for (k=0; k<N_in; k++) + { + i=1; l=1; // start at i=1, not i=0! + if (keep[k]) //skip >ss_dssp, >ss_pred, >ss_conf, >aa_... sequences + { + while((c=seq[k][l++])) // assign residue to c at same time + { + if (c>='a' && c<='z') I[k][i-1]++;//insert state = lower case character + else if (c!='.') //match state = upper case character + { + X[k][i]=aa2i(c); + I[k][i]=0; + i++; + } + } + } + else if (k==kss_dssp || k==kss_pred) // does alignment contain sequence of secondary structure states? + { + while((c=seq[k][l++])) // assign residue to c at same time + if (c!='.' && !(c>='a' && c<='z')) X[k][i++]=ss2i(c); //match state = upper case character + } + else if (k==ksa_dssp) // does alignment contain sequence of prediction confidence values? + { + while((c=seq[k][l++])) // assign residue to c at same time + if (c!='.' && !(c>='a' && c<='z')) X[k][i++]=sa2i(c); //match state = upper case character + } + else if (k==kss_conf) // does alignment contain sequence of prediction confidence values? + { + while((c=seq[k][l++])) // assign residue to c at same time + if (c!='.') X[k][i++]=cf2i(c); //match state = 0-9 or '-' + } + else if (k==kfirst) // does alignment contain sequence of prediction confidence values? + { + while((c=seq[k][l++])) // assign residue to c at same time + if (c!='.') + { + X[k][i]=aa2i(c); + I[k][i]=0; + ++i; + } + } + else continue; + i--; + if (L!=i && L!=/*MAXRES*/par.maxResLen-2 && !unequal_lengths) unequal_lengths=k; //sequences have different lengths + L=imin(L,i); + } + if (unequal_lengths) break; + + //Replace GAP with ENDGAP for all end gaps /* MR1 */ + for (k=0; k<N_in; ++k) + { + if (!keep[k]) continue; + for (i=1; i<=L && X[k][i]==GAP; i++) X[k][i]=ENDGAP; /* MR1: NOTE i++ <- ++i */ + for (i=L; i>=1 && X[k][i]==GAP; i--) X[k][i]=ENDGAP; /* MR1 */ + } + + for (i=1; i<=L; i++) this->l[i]=i; //assign column indices to match states + if (L<=0) + { + cout<<"\nError: Alignment in "<<infile<<" contains no match states. Consider using -M first or -M <int> option"<<endl; + exit(1); + } + + if (L==/*MAXRES*/par.maxResLen-2 && v>=2) + { + printf("WARNING: Number of match columns too large. Only first %i match columns will be kept!\n",L); + break; + } + if (v>=2) cout<<"Alignment in "<<infile<<" contains "<<L<<" match states\n"; + break; + + ///////////////////////////////////////////////////////////////////////// + // gap-rule assignment of match states + case 2: + int nl[NAA+2]; //nl[a] = number of seq's with amino acid a at position l + /* Note: allocating statically is fine most of the time + but when the sequences/profiles get really long + we might run out of memory, so must really do it dynamically. + had to move declaration of float *percent_gaps out of switch() + */ + //float percent_gaps[MAXCOL]; //percentage of gaps in column k (with weighted sequences) + percent_gaps = new(float[par.maxColCnt]); + + //determine number of columns L in alignment + L=strlen(seq[kfirst])-1; + + // Conversion to integer representation, checking for unequal lengths and initialization + if (nres==NULL) nres=new(int[N_in]); + for (k=0; k<N_in; k++) + { + if (!keep[k]) continue; + int nr=0; + wg[k]=0; nres[k]=0; + for (l=1; l<=L; l++) + { + X[k][l]=aa2i(seq[k][l]); + if (X[k][l]<NAA) nr++; + } + nres[k]=nr; + if (seq[k][L+1]!='\0' && !unequal_lengths) unequal_lengths=k; + } + if (unequal_lengths) break; + + // Quick and dirty calculation of the weight per sequence wg[k] + for (l=1; l<=L; l++) // for all positions l in alignment + { + int naa=0; //number of different amino acids + for (a=0; a<20; a++) nl[a]=0; + for (k=0; k<N_in; k++) if (keep[k]) nl[ (int)X[k][l]]++; + for (a=0; a<20; a++) if(nl[a]) naa++; + if (!naa) naa=1; //naa=0 when column consists of only gaps and Xs (=ANY) + for (k=0; k<N_in; k++) + if (keep[k] && (X[k][l]<20) ) + { + //wg[k]+=1.0/float(nl[ (int)X[k][l]]*naa*nres[k]+30.0); /* original version */ + wg[k] += 1.0/float(nl[ (int)X[k][l]]*naa*(nres[k]+30.0)); /* MR1 */ + // wg[k] += 1.0/float(nl[ (int)X[k][l]]*(nres[k]+30.0)); /* MR1 commented out */ + // wg[k] += (naa-1.0)/float(nl[ (int)X[k][l]]*(nres[k]+30.0)); /* MR1 commented out */ + } + } /* 1=l<=L*/ + + //Replace GAP with ENDGAP for all end gaps + for (k=0; k<N_in; ++k) + { + if (!keep[k]) continue; + for (i=1; i<=L && X[k][i]==GAP; i++) X[k][i]=ENDGAP; /* MR1: NOTE i++ <- ++i */ + for (i=L; i>=1 && X[k][i]==GAP; i--) X[k][i]=ENDGAP; /* MR1 */ + } + + // Add up percentage of gaps + for (l=1; l<=L; l++) + { + float res=0; + float gap=0; + for (k=0; k< N_in; k++){ + if (keep[k]){ + if ( X[k][l]<GAP) res+=wg[k]; /* MR1, AA or ANY, changed from <ANY */ + else if ( X[k][l] != ENDGAP) gap+=wg[k]; /* MR1, else: GAP. ENDGAPs are ignored for counting percentage */ + } + } + percent_gaps[l]=100.*gap/(res+gap); + if (v>=4) cout<<"percent gaps["<<l<<"]="<<percent_gaps[l]<<" first seq:"<<seq[0][l]<<"\n"; + } + + /* Insert states 'bloat' the HMM, + throwing them out 'slims' down the HMM. + A slimmer HMM takes less time to construct. + However, the marriage of Clustal and Hhalign + is particularly sensitive to residues + at the very end of the profile; these I call + 'telomeres'. Telomeres must not be shed when + throwing out insert states, for the telomeres + we set the match threshold to 100%. + */ +#define MGAP_LOGIC 0 +#define TELOMERE_LOGIC 1 +#define TELOMERE_DYNAMIC 0 + +#define ALWAYS_ACCEPT 101.0 /* do NOT change this parameter, must be >=100, + make slightly bigger than 100% -- to be sure to be sure */ +#define DEFAULT_MGAPS 100.0 /* Soeding's default is 50, omega default prior to telomere logic was 100 + FIXME: this used to be par.Mgaps, + in a later version re-introduce par.Mgaps to keep this value flexible */ +#define TELOMER_LENGTH 10 /* this parameter must be > 0 (unless DEFAULT_MGAPS=100), + if it is too big (L/2) then telomere logic has no effect, + don't think it should be changed (much) */ +#define TELOMER_FRACTION 0.10 + //#define HMM_MIN_LENGTH 0.923 +#define HMM_MIN_LENGTH 0.950 +#define FORTRAN_OFFSET 1 + double dDefaultMgaps; + dDefaultMgaps = DEFAULT_MGAPS; + +#if TELOMERE_LOGIC /* turn telomere logic on (1) or off (0) */ + int iTelomereLength; + +#if TELOMERE_DYNAMIC /* keep telomere length 'dynamic' */ + iTelomereLength = TELOMER_LENGTH > (int)(L*TELOMER_FRACTION) ? TELOMER_LENGTH : (int)(L*TELOMER_FRACTION); +#else + iTelomereLength = TELOMER_LENGTH; +#endif /* this was dynamic telomere */ +#endif /* this was telomere logic */ + + /* if HMMs get too small (much smaller than profile length L) + then one is liable to get a back-tracking error. + So we should ensure that the DEFAULT_MGAPS parameter does NOT + shrink the HMM too much. + take percentage-gap vector, sort it, and fix dDefaultMgaps, + such that at least (HMM_MIN_LENGTH)*(L) are left + */ +#if MGAP_LOGIC /* try to adapt Mgaps to size of final HMM */ + { + float *pfPercentGaps = NULL; + if (NULL == (pfPercentGaps = (float *)malloc((L+1)*sizeof(float)))){ + printf("%s:%s:%d: could not malloc %d float for sorted percent-gaps\n", + __FUNCTION__, __FILE__, __LINE__, L+1); + dDefaultMgaps = DEFAULT_MGAPS; + } + else { + for (l = 0; l < L; l++) { + pfPercentGaps[l] = percent_gaps[l+FORTRAN_OFFSET]; + } + qsort(pfPercentGaps, L, sizeof(float), CompFltAsc); + + dDefaultMgaps = pfPercentGaps[(int)(HMM_MIN_LENGTH*L)]; + if (dDefaultMgaps < DEFAULT_MGAPS){ + //printf("Mgaps = %f <- %f\n", DEFAULT_MGAPS, dDefaultMgaps); + dDefaultMgaps = DEFAULT_MGAPS; + } + else { + //printf("Mgaps = %f\n", dDefaultMgaps); + } + + free(pfPercentGaps); pfPercentGaps = NULL; + } + } +#endif /* tried to adapt Mgaps to size of final HMM */ + + // Throw out insert states and keep only match states + i=0; + for (k=0; k<N_in; k++) {h[k]=1; seq[k][0]='-';} + for (l=1; l<=L; l++) + { +#if TELOMERE_LOGIC + float fMgaps = ALWAYS_ACCEPT; + if ( (l < iTelomereLength) || (L-l < iTelomereLength) ){ + /* residue is in telomere, always retain this position */ + fMgaps = ALWAYS_ACCEPT; + } + else if (0){ + /* FIXME: would like to put a transition phase in here, + where the Mgap value gradually goes down from 100 to DEFAULT_MGAPS, + however, may not be necessary and will make code more clunky */ + } + else { + /* position is in centre of sequence, + retain position if less than DEFAULT_MGAPS% gaps at this position, + for example, if DEFAULT_MGAPS=30 throw out if more than 30% gap. + conversely, if DEFAULT_MGAPS=100 throw out if more than 100% gaps, + which can never happen, so always retain */ + fMgaps = dDefaultMgaps; + } + if (percent_gaps[l] <= fMgaps) +#else /* this was telomere logic */ + if (percent_gaps[l]<=float(par.Mgaps)) +#endif /* this was Soeding default */ + { + if (i>=/*MAXRES*/par.maxResLen-2) { + if (v>=1) + printf("WARNING: Number of match columns too large. Only first %i match columns will be kept!\n",i); + break; + } + i++; + this->l[i]=l; + for (k=0; k<N_in; k++) + { + if (keep[k]) + { + seq[k][h[k]++]=MatchChr(seq[k][l]); + X[k][i]=X[k][l]; + I[k][i]=0; + } + else if (k==kss_dssp || k==kss_pred) + { + seq[k][h[k]++]=MatchChr(seq[k][l]); + X[k][i]=ss2i(seq[k][l]); + } + else if (k==ksa_dssp) + { + seq[k][h[k]++]=MatchChr(seq[k][l]); + X[k][i]=sa2i(seq[k][l]); + } + else if (k==kss_conf) + { + seq[k][h[k]++]=seq[k][l]; + X[k][i]=cf2i(seq[k][l]); + } + } + } + else + { + for (k=0; k<N_in; k++) + if (keep[k] && X[k][l]<GAP) + { + I[k][i]++; + seq[k][h[k]++]=InsertChr(seq[k][l]); + } + } + } + for (k=0; k<N_in; k++) seq[k][h[k]]='\0'; + + //printf("%d\t%d\t%d\tN/L/M\n", N_in, L, i); /* -------- FIXME */ + + if (v>=2) cout<<"Alignment in "<<infile<<" contains "<<L<<" columns and "<<i<<" match states\n"; + L = i; //Number of match states + + delete[] percent_gaps; percent_gaps = NULL; + break; + + + //////////////////////////////////////////////////////////////////////// + // Using residues of first sequence as match states + case 3: + /* Note: allocating statically is fine most of the time + but when the sequences/profiles get really long + we might run out of memory, so must really do it dynamically. + had to move declaration of float *percent_gaps out of switch() + */ + //char match_state[MAXCOL]; //1: column assigned to match state 0: insert state + match_state = new(char[par.maxColCnt]); + + // Determine number of columns L in alignment + L=strlen(seq[0]+1); + if (v>=3) printf("Length of first seq = %i\n",L); + // Check for sequences with unequal lengths + for (k=1; k<N_in; k++) + if (int(strlen(seq[k]+1))!=L) {unequal_lengths=k; break;} + if (unequal_lengths) break; + + // Determine match states: seq kfirst has residue at pos l -> match state + for (l=1; l<=L; l++) + if (isalpha(seq[kfirst][l])) match_state[l]=1; else match_state[l]=0; + // Throw out insert states and keep only match states + for (k=0; k<N_in; k++) {h[k]=1; seq[k][0]='-';} + i=0; + for (l=1; l<=L; l++) + { + if (match_state[l]) // does sequence 0 have residue at position l? + { + if (i>=/*MAXRES*/par.maxResLen-2) { + if (v>=1) + printf("WARNING: Number of match columns too large. Only first %i match columns will be kept!\n",i); + break; + } + i++; + this->l[i]=l; + for (k=0; k<N_in; k++) + { + if (keep[k]) + { + seq[k][h[k]++]=MatchChr(seq[k][l]); + X[k][i]=aa2i(seq[k][l]); + I[k][i]=0; + } + else if (k==kss_dssp || k==kss_pred) + { + seq[k][h[k]++]=MatchChr(seq[k][l]); + X[k][i]=ss2i(seq[k][l]); + } + else if (k==ksa_dssp) + { + seq[k][h[k]++]=MatchChr(seq[k][l]); + X[k][i]=sa2i(seq[k][l]); + } + else if (k==kss_conf) + { + seq[k][h[k]++]=seq[k][l]; + X[k][i]=cf2i(seq[k][l]); + } + } + } + else + { + for (k=0; k<N_in; k++) + if (keep[k] && aa2i(seq[k][l])<GAP) + { + I[k][i]++; + seq[k][h[k]++]=InsertChr(seq[k][l]); + } + } + } + for (k=0; k<N_in; k++) seq[k][h[k]]='\0'; + + //Replace GAP with ENDGAP for all end gaps /* MR1 */ + for (k=0; k<N_in; ++k) + { + if (!keep[k]) continue; + for (i=1; i<=L && X[k][i]==GAP; i++) X[k][i]=ENDGAP; /* MR1, note i++ <- ++i */ + for (i=L; i>=1 && X[k][i]==GAP; i--) X[k][i]=ENDGAP; /* MR1 */ + } + + if (v>=2) cout<<"Alignment in "<<infile<<" contains "<<L<<" columns and "<<i<<" match states\n"; + L = i; //Number of match states + + delete[] match_state; match_state = NULL; + break; + + } //end switch() + /////////////////////////////////////////////////////////////////////////// + + + // Error + if (unequal_lengths) + { + strcut(sname[unequal_lengths]); + cerr<<endl<<"Error: sequences in "<<infile<<" do not all have the same number of columns, \ne.g. first sequence and sequence "<<sname[unequal_lengths]<<".\n"; + if(par.M==1) cerr<<".\nCheck input format for '-M a2m' option and consider using '-M first' or '-M 50'\n"; + exit(1); + } + + // Avert user about -cons option? + if (v>=2 && !par.cons) + { + for (i=1; i<=L; i++) + if (X[kfirst][i]==GAP) + { + printf("NOTE: Use the '-cons' option to calculate a consensus sequence as first sequence of the alignment.\n"); + break; + } + } + /* MR1 + //Replace GAP with ENDGAP for all end gaps + for (k=0; k<N_in; k++) + { + if (!keep[k]) continue; + for (i=1; i<=L && X[k][i]==GAP; i++) X[k][i]=ENDGAP; + for (i=L; i>=1 && X[k][i]==GAP; i--) X[k][i]=ENDGAP; + }*/ + + // DEBUG + if (v>=4) + for (k=0; k<N_in; k++) + { + if (!display[k]) continue; + cout<<">"<<sname[k]<<"\n"; + if (k==kss_dssp || k==kss_pred) {for (i=1; i<=L; i++) cout<<char(i2ss(X[k][i]));} + else if (k==kss_conf) {for (i=1; i<=L; i++) cout<<char(i2cf(X[k][i]));} + else if (k==ksa_dssp) {for (i=1; i<=L; i++) cout<<char(i2sa(X[k][i]));} + else + { + for (i=1; i<=L; i++) cout<<char(i2aa(X[k][i])); + cout<<"\n"; + for (i=1; i<=L; i++) + if (I[k][i]==0) cout<<"-"; else if (I[k][i]>9) cout<<"X"; else cout<<I[k][i]; + } + cout<<"\n"; + } + + delete[](h); h = NULL; +} + + +/** + * @brief Remove sequences with seq. identity larger than seqid percent + *(remove the shorter of two) or coverage<cov_thr + * + * FIXME: originally max_seqid is a variable that is the cutoff + * above which sequences are thrown out. We want to throw out sequences + * when building the HMM but not for display, there we want to keep all. + * This should be really easy, but there is some hidden stuff going on + * in this function, so I did a minimal-invasive change and just stuck + * (effectively) a hard-wired 100 instead of the variable. + * At a later stage we should get rid of this function alltogether + * as it does gobble up some time (and is quadratic in noof sequences, I think) + * FS, 2010-10-04 + */ +//////////////////////////////////////////////////////////////////////////// +/* + */ +inline int +Alignment::FilterForDisplay(int max_seqid, int coverage, int qid, float qsc, int N) +{ + + /* FIXME + * by just returning n_display and not doing anything + * I think we display everything and not do any work for it + */ + return n_display; /* FS, 2010-10-04*/ + + + if (par.mark) return n_display; + char *dummy = new(char[N_in+1]); + int vtmp=v, seqid; + v=0; + n_display=0; + if (kss_dssp>=0) display[kss_dssp]=KEEP_NOT; + if (ksa_dssp>=0) display[ksa_dssp]=KEEP_NOT; + if (kss_pred>=0) display[kss_pred]=KEEP_NOT; + if (kss_conf>=0) display[kss_conf]=KEEP_NOT; + for (seqid=imin(10,max_seqid); n_display<N && seqid<=max_seqid; seqid++) + { + for (int k=0; k<N_in; k++) dummy[k]=display[k]; + n_display = Filter2(dummy,coverage,qid,qsc,20,seqid,0); + // printf("Seqid=%3i n_display=%4i\n",seqid,n_display); + } + if (n_display>N) + { + for (int k=0; k<N_in; k++) dummy[k]=display[k]; + n_display = Filter2(dummy,coverage,qid,qsc,20,--(--seqid),0); + } + v=vtmp; + for (int k=0; k<N_in; k++) display[k]=dummy[k]; + if (kss_dssp>=0) {display[kss_dssp]=KEEP_CONDITIONALLY; n_display++;} + if (ksa_dssp>=0) {display[ksa_dssp]=KEEP_CONDITIONALLY; n_display++;} + if (kss_pred>=0) {display[kss_pred]=KEEP_CONDITIONALLY; n_display++;} + if (kss_conf>=0) {display[kss_conf]=KEEP_CONDITIONALLY; n_display++;} + delete[] dummy; dummy = NULL; + return n_display; +} + +///////////////////////////////////////////////////////////////////////////////////// +// Remove sequences with seq. identity larger than seqid percent (remove the shorter of two) or coverage<cov_thr +///////////////////////////////////////////////////////////////////////////////////// +inline int Alignment::Filter(int max_seqid, int coverage, int qid, float qsc, int N) +{ + return Filter2(keep,coverage,qid,qsc,20,max_seqid,N); +} + +///////////////////////////////////////////////////////////////////////////// +/* + * @brief Select set of representative sequences in the multiple sequence alignment + * + * Filter criteria: + * Remove sequences with coverage of query less than "coverage" percent + * Remove sequences with sequence identity to query of less than "qid" percent + * If Ndiff==0, remove sequences with seq. identity larger than seqid2(=max_seqid) percent + * If Ndiff>0, remove sequences with minimum-sequence-identity filter of between seqid1 + * and seqid2 (%), where the minimum seqid threshold is determined such that, + * in all column blocks of at least WMIN=25 residues, at least Ndiff sequences are left. + * This ensures that in multi-domain proteins sequences covering one domain are not + * removed completely because sequences covering other domains are more diverse. + * + * Allways the shorter of two compared sequences is removed (=> sort sequences by length first). + * Please note: sequence identity of sequence x with y when filtering x is calculated as + * number of residues in sequence x that are identical to an aligned residue in y / number of residues in x + * Example: two sequences x and y are 100% identical in their overlapping region but one overlaps by 10% of its + * length on the left and the other by 20% on the right. Then x has 10% seq.id with y and y has 20% seq.id. with x. + */ +////////////////////////////////////////////////////////////////////////////// +int +Alignment::Filter2(char keep[], int coverage, int qid, float qsc, int seqid1, int seqid2, int Ndiff) +{ + // In the beginnning, keep[k] is 1 for all regular amino acid sequences and 0 for all others (ss_conf, ss_pred,...) + // In the end, keep[k] will be 1 for all regular representative sequences kept in the alignment, 0 for all others + char* in=new(char[N_in+1]); // in[k]=1: seq k has been accepted; in[k]=0: seq k has not yet been accepted at current seqid + char* inkk=new(char[N_in+1]); // inkk[k]=1 iff in[ksort[k]]=1 else 0; + int* Nmax=new(int[L+2]); // position-dependent maximum-sequence-identity threshold for filtering /* MR1, used to be called idmax*/ + int* idmaxwin=new(int[L+2]); // minimum value of idmax[i-WFIL,i+WFIL] + int* seqid_prev=new(int[N_in+1]); // maximum-sequence-identity threshold used in previous round of filtering (with lower seqid) + int* N=new(int[L+2]); // N[i] number of already accepted sequences at position i + const int WFIL=25; // see previous line + + int diffNmax=Ndiff; // current maximum difference of Nmax[i] and Ndiff /* MR1 */ + int diffNmax_prev=0; // previous maximum difference of Nmax[i] and Ndiff /* MR1 */ + + int seqid; // current maximum value for the position-dependent maximum-sequence-identity thresholds in idmax[] + int seqid_step=0; // previous increment of seqid /* MR1 */ + + float diff_min_frac; // minimum fraction of differing positions between sequence j and k needed to accept sequence k + float qdiff_max_frac=0.9999-0.01*qid; // maximum allowable number of residues different from query sequence + int diff; // number of differing positions between sequences j and k (counted so far) + int diff_suff; // number of differing positions between sequences j and k that would be sufficient + int qdiff_max; // maximum number of residues required to be different from query + int cov_kj; // upper limit of number of positions where both sequence k and j have a residue + int first_kj; // first non-gap position in sequence j AND k + int last_kj; // last non-gap position in sequence j AND k + int kk, jj; // indices for sequence from 1 to N_in + int k, j; // kk=ksort[k], jj=ksort[j] + int i; // counts residues + int n; // number of sequences accepted so far + + + // Initialize in[k] + for (n=k=0; k<N_in; k++) if (keep[k]==KEEP_ALWAYS) {in[k]=2/*KEEP_ALWAYS??*/; n++;} else in[k]=0; + + // Determine first[k], last[k]? + if (first==NULL) + { + first=new(int[N_in]);// first non-gap position in sequence k + last =new(int[N_in]);// last non-gap position in sequence k + for (k=0; k<N_in; k++) // do this for ALL sequences, not only those with in[k]==1 (since in[k] may be display[k]) + { + for (i=1; i<=L; i++) if (X[k][i]<NAA) break; + first[k]=i; + for (i=L; i>=1; i--) if (X[k][i]<NAA) break; + last[k]=i; + } + } + + // Determine number of residues nres[k]? + if ( (nres==NULL) || (sizeof(nres)<N_in*sizeof(int)) ) + { + nres=new(int[N_in]); + for (k=0; k<N_in; k++) // do this for ALL sequences, not only those with in[k]==1 (since in[k] may be display[k]) + { + int nr=0; + for (i=first[k]; i<=last[k]; i++) + if (X[k][i]<NAA) nr++; + nres[k]=nr; + // printf("%20.20s nres=%3i first=%3i last=%3i\n",sname[k],nr,first[k],last[k]); + } + } + + // Sort sequences according to length; afterwards, nres[ksort[kk]] is sorted by size + if (ksort==NULL) + { + ksort=new(int[N_in]); // never reuse alignment object for new alignment with more sequences + for (k=0; k<N_in; k++) ksort[k]=k; + QSortInt(nres,ksort,kfirst+1,N_in-1,-1); //Sort sequences after kfirst (query) in descending order + } + for (kk=0; kk<N_in; kk++) inkk[kk]=in[ksort[kk]]; + + // Initialize N[i], idmax[i], idprev[i] + for (i=1; i<first[kfirst]; i++) N[i]=0; + for (i=first[kfirst]; i<=last[kfirst]; i++) N[i]=1; + for (i=last[kfirst]+1; i<=L; i++) N[i]=0; + //for (i=1; i<=L; i++) {idmax[i]=seqid1; idmaxwin[i]=-1;} + for (i=1; i<=L; ++i) {Nmax[i]=0; idmaxwin[i]=-1;} /* MR1 */ + for (k=0; k<N_in; k++) seqid_prev[k]=-1; + if (Ndiff<=0 || Ndiff>=N_in) {seqid1=seqid2; Ndiff=N_in; diffNmax=Ndiff;} + + // Check coverage and sim-to-query criteria for each sequence k + for (k=0; k<N_in; k++) + { + if (keep[k]==KEEP_NOT || keep[k]==KEEP_ALWAYS) continue; // seq k not regular sequence OR is marked sequence + if (100*nres[k]<coverage*L) {keep[k]=KEEP_NOT; continue;} // coverage too low? => reject once and for all + + float qsc_sum=0.0; + + // Check if score-per-column with query is at least qsc + if (qsc>-10) + { + float qsc_min = qsc*nres[k]; // minimum total score of seq k with query + + int gapq=0, gapk=0; // number of consecutive gaps in query or k'th sequence at position i + for (int i=first[k]; i<=last[k]; i++) + { + if (X[k][i]<20) + { + gapk=0; + if (X[kfirst][i]<20) + { + gapq=0; + qsc_sum += S[(int)X[kfirst][i]][(int)X[k][i]]; + } + else if (gapq++) qsc_sum-=PLTY_GAPEXTD; else qsc_sum-=PLTY_GAPOPEN; + } + else if (X[kfirst][i]<20) + { + gapq=0; + if (gapk++) qsc_sum-=PLTY_GAPEXTD; else qsc_sum-=PLTY_GAPOPEN; + } + } + // printf("k=%3i qsc=%6.2f\n",k,qsc_sum); + if (qsc_sum<qsc_min) {keep[k]=KEEP_NOT; continue;} // too different from query? => reject once and for all + } + + //Check if sequence similarity with query at least qid? + if (qdiff_max_frac<0.999) + { + qdiff_max=int(qdiff_max_frac*nres[k]+0.9999); + // printf("k=%-4i nres=%-4i qdiff_max=%-4i first=%-4i last=%-4i",k,nres[k],qdiff_max,first[k],last[k]); + diff=0; + for (int i=first[k]; i<=last[k]; i++) + // enough different residues to reject based on minimum qid with query? => break + if (X[k][i]<20 && X[k][i]!=X[kfirst][i] && ++diff>=qdiff_max) break; + // printf(" diff=%4i\n",diff); + if (diff>=qdiff_max) {keep[k]=KEEP_NOT; continue;} // too different from query? => reject once and for all + } + // printf(" qsc=%6.2f qid=%6.2f \n",qsc_sum/nres[k],100.0*(1.0-(float)(diff)/nres[k])); + } + + if (seqid1>seqid2) + { + for (n=k=0; k<N_in; k++) if (keep[k]>KEEP_NOT) n++; + return n; + } + + // Successively increment idmax[i] at positons where N[i]<Ndiff + //for (seqid=seqid1; seqid<=seqid2; seqid+=1+(seqid>=50)) /* MR1 */ + seqid=seqid1; + while (seqid<=seqid2) + { + /* + // Update idmax[i] + for (i=1; i<=L; i++) if (N[i]<Ndiff) idmax[i]=seqid; + + // Update idmaxwin[i] as minimum of idmax[i-WFIL,i+WFIL]. If idmaxwin[] has not changed then stop + char stop=1; + for (i=1; i<=L; i++) + { + int idmax_min=seqid2; + for (j=imax(1,imin(L-2*WFIL+1,i-WFIL)); j<=imin(L,imax(2*WFIL,i+WFIL)); j++) + if (idmax[j]<idmax_min) idmax_min=idmax[j]; + if (idmax_min>idmaxwin[i]) stop=0; // idmaxwin[i] has changed => do not stop + idmaxwin[i]=idmax_min; + } + */ + char stop=1; + // Update Nmax[i] + diffNmax_prev = diffNmax; + diffNmax = 0; + for (i=1; i<=L; ++i) + { + int max=0; + for (j=imax(1,imin(L-2*WFIL+1,i-WFIL)); j<=imin(L,imax(2*WFIL,i+WFIL)); ++j) + if (N[j]>max) max=N[j]; + if (Nmax[i]<max) Nmax[i]=max; + if (Nmax[i]<Ndiff) + { + stop=0; + idmaxwin[i]=seqid; + if (diffNmax<Ndiff-Nmax[i]) diffNmax=Ndiff-Nmax[i]; + } + + } + + //printf("seqid=%3i diffNmax_prev= %-4i diffNmax= %-4i n=%-5i N_in-N_ss=%-5i\n",seqid,diffNmax_prev,diffNmax,n,N_in-N_ss); + + if (stop) break; + + // // DEBUG + // printf("idmax "); + // for (i=1; i<=L; i++) printf("%2i ",idmax[i]); + // printf("\n"); + // printf("idmaxwin "); + // for (i=1; i<=L; i++) printf("%2i ",idmaxwin[i]); + // printf("\n"); + // printf("N[i] "); + // for (i=1; i<=L; i++) printf("%2i ",N[i]); + // printf("\n"); + + // Loop over all candidate sequences kk (-> k) + for (kk=0; kk<N_in; kk++) + { + if (inkk[kk]) continue; // seq k already accepted + k=ksort[kk]; + if (!keep[k]) continue; // seq k is not regular aa sequence or already suppressed by coverage or qid criterion + if (keep[k]==KEEP_ALWAYS) {inkk[kk]=2; continue;} // accept all marked sequences (no n++, since this has been done already) + + // Calculate max-seq-id threshold seqidk for sequence k (as maximum over idmaxwin[i]) + if (seqid>=100) {in[k]=inkk[kk]=1; n++; continue;} + float seqidk=seqid1; + for (i=first[k]; i<=last[k]; i++) + if (idmaxwin[i]>seqidk) seqidk=idmaxwin[i]; + if (seqid==seqid_prev[k]) continue; // sequence has already been rejected at this seqid threshold => reject this time + seqid_prev[k]=seqid; + diff_min_frac =0.9999-0.01*seqidk; // min fraction of differing positions between sequence j and k needed to accept sequence k + + // Loop over already accepted sequences + for (jj=0; jj<kk; jj++) + { + if (!inkk[jj]) continue; + j=ksort[jj]; + first_kj=imax(first[k],first[j]); + last_kj =imin(last[k],last[j]); + cov_kj = last_kj-first_kj+1; + diff_suff=int(diff_min_frac*imin(nres[k],cov_kj)+0.999); // nres[j]>nres[k] anyway because of sorting /* MR1 0.999 */ + diff=0; + for (int i=first_kj; i<=last_kj; i++) + { + // enough different residues to accept? => break + if (X[k][i]>=NAA || X[j][i]>=NAA) + cov_kj--; + else + if (X[k][i]!=X[j][i] && ++diff>=diff_suff) break; // accept (k,j) + } + // // DEBUG + // printf("%20.20s with %20.20s: diff=%i diff_min_frac*cov_kj=%f diff_suff=%i nres=%i cov_kj=%i\n",sname[k],sname[j],diff,diff_min_frac*cov_kj,diff_suff,nres[k],cov_kj); + // printf("%s\n%s\n\n",seq[k],seq[j]); + + //if (float(diff)<fmin(diff_min_frac*cov_kj,diff_suff)) break; //similarity > acceptace threshold? Reject! /* MR1 */ + if (diff<diff_suff && float(diff)<=diff_min_frac*cov_kj) break; //dissimilarity < acceptace threshold? Reject! /* MR1 */ + + + } + if (jj>=kk) // did loop reach end? => accept k. Otherwise reject k (the shorter of the two) + { + in[k]=inkk[kk]=1; + n++; + for (i=first[k]; i<=last[k]; i++) N[i]++; // update number of sequences at position i + // printf("%i %20.20s accepted\n",k,sname[k]); + } + // else + // { + // printf("%20.20s rejected: too similar with seq %20.20s diff=%i diff_min_frac*cov_kj=%f diff_suff=%i nres=%i cov_kj=%i\n",sname[k],sname[j],diff,diff_min_frac*cov_kj,diff_suff,nres[k],cov_kj); + // printf("%s\n%s\n\n",seq[k],seq[j]); + // } + + } // End Loop over all candidate sequences kk + + // // DEBUG + // printf("\n"); + // printf("seqid_prev[k]= \n"); + // for (k=0; k<N_in; k++) printf("%2i ",seqid_prev[k]); + // printf("\n"); + + // Increment seqid /* MR1 */ + seqid_step = imax(1,imin(5,diffNmax/(diffNmax_prev-diffNmax+1)*seqid_step/2)); + seqid += seqid_step; + + } // End Loop over seqid + + if (v>=2) + { + printf("%i out of %i sequences passed filter (",n,N_in-N_ss); + if (par.coverage) + printf("%i%% min coverage, ",coverage); + if (qid) + printf("%i%% min sequence identity to query, ",qid); + if (qsc>-10) + printf("%.2f bits min score per column to query, ",qsc); + if (Ndiff<N_in && Ndiff>0) + printf("up to %i%% position-dependent max pairwise sequence identity)\n",seqid); + else + printf("%i%% max pairwise sequence identity)\n",seqid1); + } + + for (k=0; k<N_in; k++) keep[k]=in[k]; + delete[] in; in = NULL; + delete[] inkk; inkk = NULL; + //delete[] idmax; idmax = NULL; + delete[] Nmax; /* MR1 */ + delete[] idmaxwin; idmaxwin = NULL; + delete[] seqid_prev; seqid_prev = NULL; + delete[] N; N = NULL; +#if 0 + printf("%s:%s:%d: sequences accepted = %d/%d\n", __FUNCTION__, __FILE__, __LINE__, n, N_in-N_ss); +#endif + return n; +} + + + +/* MR1: the Alignment::HomologyFilter is no longer needed in hhalign-stand-alone */ +///////////////////////////////////////////////////////////////////////////// +/** + * @brief Filter for min score per column coresc with core query profile, + * defined by coverage_core and qsc_core + */ +///////////////////////////////////////////////////////////////////////////// +int +Alignment::HomologyFilter(int coverage_core, float qsc_core, float coresc) +{ + const int seqid_core=90; //maximum sequence identity in core alignment + const int qid_core=0; + const int Ndiff_core=0; + int n; + HMM qcore; + char* coreseq=new(char[N_in]); // coreseq[k]=1 if sequence belongs to core of alignment (i.e. it is very similar to query) + for (int k=0; k<N_in; k++) coreseq[k]=keep[k]; // Copy keep[] into coreseq[] + + // Remove sequences with seq. identity larger than seqid percent (remove the shorter of two) + int v1=v; v=1; + n = Filter2(coreseq,coverage_core,qid_core,qsc_core,seqid_core,seqid_core,Ndiff_core); + v=v1; + if (v>=2) + { + printf("%i out of %i core alignment sequences passed filter (",n,N_in-N_ss); + if (par.coverage_core) + printf("%i%% min coverage, ",coverage_core); + if (qid_core) + printf("%i%% min sequence identity to query, ",qid_core); + if (qsc_core>-10) + printf("%.2f bits min score per column to query, ",qsc_core); + printf("%i%% max pairwise sequence identity)\n",seqid_core); + } + + // Calculate bare AA frequencies and transition probabilities -> qcore.f[i][a], qcore.tr[i][a] + FrequenciesAndTransitions(qcore,coreseq); + + // Add transition pseudocounts to query -> q.p[i][a] (gapd=1.0, gape=0.333, gapf=gapg=1.0, gaph=gapi=1.0, gapb=1.0 + qcore.AddTransitionPseudocounts(1.0,0.333,1.0,1.0,1.0,1.0,1.0); + + // Generate an amino acid frequency matrix from f[i][a] with full pseudocount admixture (tau=1) -> g[i][a] + qcore.PreparePseudocounts(); + + // Add amino acid pseudocounts to query: qcore.p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] + qcore.AddAminoAcidPseudocounts(2,1.5,2.0,1.0); // pcm=2, pca=1.0, pcb=2.5, pcc=1.0 + + // Filter out all sequences below min score per column with qcore + n=FilterWithCoreHMM(keep, coresc, qcore); + + if (v>=2) cout<<n<<" out of "<<N_in-N_ss<<" sequences filtered by minimum score-per-column threshold of "<<qsc_core<<"\n"; + delete[] coreseq; coreseq = NULL; + return n; +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Filter out all sequences below a minimum score per column with profile qcore + */ +int +Alignment::FilterWithCoreHMM(char in[], float coresc, HMM& qcore) +{ + int k; // count sequences in alignment + int i; // column in query alignment + int a; // amino acid (0..19) + int n=1; // number of sequences that passed filter + float** logodds=new(float*[L+1]); // log-odds ratios for HMM qcore + char gap; // 1: previous state in seq k was a gap 0: previous state in seq k was an amino acid + float score; // score of sequence k aligned with qcore + + for (i=1; i<=L; i++) logodds[i]=new(float[21]); + + // Determine first[k], last[k]? + if (first==NULL) + { + first=new(int[N_in]);// first non-gap position in sequence k + last =new(int[N_in]);// last non-gap position in sequence k + for (k=0; k<N_in; k++) // do this for ALL sequences, not only those with in[k]==1 (since in[k] may be display[k]) + { + for (i=1; i<=L; i++) if (X[k][i]<NAA) break; + first[k]=i; + for (i=L; i>=1; i--) if (X[k][i]<NAA) break; + last[k]=i; + } + } + + // Determine number of residues nres[k]? + if (nres==NULL) + { + nres=new(int[N_in]); + for (k=0; k<N_in; k++) // do this for ALL sequences, not only those with in[k]==1 (since in[k] may be display[k]) + { + int nr=0; + for (i=first[k]; i<=last[k]; i++) + if (X[k][i]<NAA) nr++; + nres[k]=nr; + // printf("%20.20s nres=%3i first=%3i last=%3i\n",sname[k],nr,f,l); + } + } + + // Precalculate the log-odds for qcore + for (i=1; i<=L; i++) + { + for (a=0; a<NAA; a++) + logodds[i][a]=fast_log2(qcore.p[i][a]/pb[a]); + logodds[i][ANY]=-0.5; // half a bit penalty for X + + // printf(" A R N D C Q E G H I L K M F P S T W Y V\n"); + // printf("%6i ",i); + // for (a=0; a<20; ++a) fprintf(stdout,"%5.1f ",100*qcore.f[i][a]); + // printf("\n"); + // printf(" "); + // for (a=0; a<20; ++a) fprintf(stdout,"%5.1f ",100*qcore.g[i][a]); + // printf("\n"); + // printf(" "); + // for (a=0; a<20; ++a) fprintf(stdout,"%5.1f ",100*qcore.p[i][a]); + // printf("\n"); + // printf(" "); + // for (a=0; a<20; ++a) fprintf(stdout,"%5.1f ",100*pb[a]); + // printf("\n"); + // printf(" "); + // for (a=0; a<20; ++a) fprintf(stdout,"%5.2f ",fast_log2(qcore.p[i][a]/pb[a])); + // printf("\n"); + } + + // Main loop: test all sequences k + for (k=kfirst+1; k<N_in; k++) + { + if (!in[k]) continue; // if in[k]==0 sequence k will be suppressed directly + + float score_M=0.0; + float score_prev=0.0; + + // Calculate score of sequence k with core HMM + score=0; gap=0; + for (i=first[k]; i<=last[k]; i++) + { + score_M=0.0; + if (X[k][i]<=ANY) // current state is Match + { + score_M=logodds[i][ (int)X[k][i]]; + score+=logodds[i][ (int)X[k][i]]; + if (gap) score+=qcore.tr[i][D2M]; else score+=qcore.tr[i][M2M]; + gap=0; + } + else if (X[k][i]==GAP) // current state is Delete (ignore ENDGAPs) + { + if (gap) score+=qcore.tr[i][D2D]; else score+=qcore.tr[i][M2D]; + gap=1; + } + if (I[k][i]) score+=qcore.tr[i][M2I]+(I[k][i]-1)*qcore.tr[i][I2I]+qcore.tr[i][I2M]; + // if (k==2) printf("i=%3i %c:%c score_M=%6.2f score=%6.2f score_sum=%6.2f \n",i,i2aa(X[kfirst][i]),i2aa(X[k][i]),score_M,score-score_prev,score); + score_prev=score; + } + + printf("k=%3i score=%6.2f\n",k,score); + if (score<nres[k]*coresc) in[k]=0; else n++;// reject sequence k? + } + for (i=1; i<=L; i++){ + delete[] logodds[i]; logodds[i] = NULL; + } + delete[] logodds; logodds = NULL; + return n; +} + + +/* MR1 */ +#if 0 +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Filter alignment to given diversity/Neff + */ +bool +Alignment::FilterNeff() +{ + int v1=v; + v=v1-1; + const float TOLX=0.001; + const float TOLY=0.02; + char dummy[N_in+1]; + for (int k=0; k<N_in; ++k) dummy[k]=keep[k]; + float x=0.0,y=0.0; + float x0=-1.0; + float x1=+2.0; + float y0=filter_by_qsc(x0,dummy); + float y1=filter_by_qsc(x1,dummy); + int i=2; + while (y0-par.Neff>0 && par.Neff-y1>0) + { + x = x0 + (par.Neff-y0)*(x1-x0)/(y1-y0); // linear interpolation between (x0,y0) and (x1,y1) + y = filter_by_qsc(x,dummy); + if (v>=2) printf(" %3i x0=%6.3f -> %6.3f x=%6.3f -> %6.3f x1=%6.3f -> %6.3f \n",++i,x0,y0,x,y,x1,y1); + if (y>par.Neff) {x0=x; y0=y;} else {x1=x; y1=y;} + if (fabs(par.Neff-y)<TOLY || x1-x0<TOLX) break; + } + v=v1; + + if (y0>=par.Neff && y1<=par.Neff) + { + // Write filtered alignment WITH insert states (lower case) to alignment file + if (v>=2) printf("Found Neff=%6.3f at filter threshold qsc=%6.3f\n",y,x); + return true; + } + else if (v>=1) + printf("Diversity of unfiltered alignment %.2f is below target diversity %.2f. No alignment written\n",y0,par.Neff); + + return false; +} + +float Alignment::filter_by_qsc(float qsc, char* dummy) +{ + HMM q; + for (int k=0; k<N_in; ++k) keep[k]=dummy[k]; + Filter2(keep,par.coverage,0,qsc,par.max_seqid+1,par.max_seqid,0); + FrequenciesAndTransitions(q); + // printf("qsc=%4.1f N_filtered=%-3i Neff=%6.3f\n",qsc,n,q.Neff_HMM); + return q.Neff_HMM; +} +#endif + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate AA frequencies q.p[i][a] and transition probabilities q.tr[i][a] from alignment + */ +void +Alignment::FrequenciesAndTransitions(HMM& q, char* in) +{ + int k; // index of sequence + int i; // position in alignment + int a; // amino acid (0..19) + int ni[NAA+3]; // number of times amino acid a occurs at position i + int naa; // number of different amino acids + + if (v>=3) + cout<<"Calculating position-dependent weights on subalignments\n"; + + if (in==NULL) in=keep; // what's this good for? + + if (N_filtered>1) + { + for (k=0; k<N_in; k++) wg[k]=0.0; // initialized wg[k] + // Calculate global weights + for (i=1; i<=L; i++) // for all positions i in alignment + { + for (a=0; a<20; a++) ni[a]=0; + for (k=0; k<N_in; k++) if (in[k]) ni[ (int)X[k][i]]++; + naa=0; for (a=0; a<20; a++) if(ni[a]) naa++; + if (!naa) naa=1; //naa=0 when column consists of only gaps and Xs (=ANY) + for (k=0; k<N_in; k++) + if (in[k] && X[k][i]<20) + wg[k] += 1.0/float(ni[ (int)X[k][i]]*naa*(nres[k]+30)); + // ensure that each residue of a short sequence contributes as much as a residue of a long sequence: + // contribution is proportional to one over sequence length nres[k] plus 30. + } + NormalizeTo1(wg,N_in); + + + // Do pos-specific sequence weighting and calculate amino acid frequencies and transitions + for (k=0; k<N_in; k++) X[k][0]=ENDGAP; // make sure that sequences ENTER subalignment j for j=1 + for (k=0; k<N_in; k++) X[k][L+1]=ENDGAP; // does it have an influence? + +#ifdef HAVE_OPENMP + if(par.wg != 1) + { + #pragma omp parallel sections + { + #pragma omp section + Amino_acid_frequencies_and_transitions_from_M_state(q,in); // use subalignments of seqs with residue in i + #pragma omp section + Transitions_from_I_state(q,in); // use subalignments of seqs with insert in i + #pragma omp section + Transitions_from_D_state(q,in); // use subalignments of seqs with delete in i. Must be last of these three calls if par.wg==1! + } + } + else + { + #pragma omp parallel sections + { + #pragma omp section + Amino_acid_frequencies_and_transitions_from_M_state(q,in); // use subalignments of seqs with residue in i + #pragma omp section + Transitions_from_I_state(q,in); // use subalignments of seqs with insert in i + } + Transitions_from_D_state(q,in); // use subalignments of seqs with delete in i. Must be last of these three calls if par.wg==1! + } +#else + Amino_acid_frequencies_and_transitions_from_M_state(q,in); + Transitions_from_I_state(q,in); + Transitions_from_D_state(q,in); +#endif + } + else // N_filtered==1 + { + X[kfirst][0]=X[kfirst][L+1]=ANY; // (to avoid anallowed access within loop) + q.Neff_HMM=1.0f; + for (i=0; i<=L+1; i++) // for all positions i in alignment + { + q.Neff_M[i]=1.0f; + q.Neff_I[i]=q.Neff_D[i]=0.0f; + for (a=0; a<20; a++) q.f[i][a]=0.0; + /* this is the crucial change that makes terminal-X work */ + //q.f[i][ (int)(X[kfirst][i]) ] = 1.0; /* MR1 */ + if (X[kfirst][i] < ANY) /* MR1 */ + q.f[i][(unsigned int) X[kfirst][i] ] = 1.0; + else + for (a=0; a<20; ++a) q.f[i][a]=pb[a]; + q.tr[i][M2M]=0; + q.tr[i][M2I]=-100000.0; + q.tr[i][M2D]=-100000.0; + q.tr[i][I2M]=-100000.0; + q.tr[i][I2I]=-100000.0; + q.tr[i][D2M]=-100000.0; + q.tr[i][D2D]=-100000.0; + } + q.tr[0][I2M]=0; + q.tr[L][I2M]=0; + q.tr[0][D2M]=0; + q.Neff_M[0]=q.Neff_I[0]=q.Neff_D[0]=99.999; // Neff_av[0] is used for calculation of transition pseudocounts for the start state + } + + if (v>=3) + { + printf("\nMatches:\n"); + printf("col Neff nseqs\n"); + for (i=1; i<=imin(L,100); i++) + printf("%3i %5.2f %3i\n",i,q.Neff_M[i],nseqs[i]); + + printf("\nInserts:\n"); + printf("col Neff nseqs\n"); + for (i=1; i<=imin(L,100); i++) + printf("%3i %5.2f %3i\n",i,q.Neff_I[i],nseqs[i]); + + printf("\nDeletes:\n"); + printf("col Neff nseqs\n"); + for (i=1; i<=imin(L,100); i++) + printf("%3i %5.2f %3i\n",i,q.Neff_D[i],nseqs[i]); + } + + // Copy column information into HMM q + q.L=L; + q.N_in=N_in; + q.N_filtered=N_filtered; + for (i=1; i<=L; i++) q.l[i]=l[i]; + + // Set names in HMM q + if (strlen(q.name)==0) strcpy(q.name,name); + if (strlen(q.longname)==0) strcpy(q.longname,longname); + if (strlen(q.fam)==0) strcpy(q.fam,fam); + ScopID(q.cl,q.fold,q.sfam,q.fam); // derive superfamily, fold and class code from family name + strcpy(q.file,file); // Store basename of alignment file name in q.file + + // Copy sequences to be displayed into HMM + q.nss_dssp=q.nsa_dssp=q.nss_pred=q.nss_conf=q.nfirst=-1; + int n=0; + if (kss_dssp>=0) q.nss_dssp=n++; // copy dssp sequence? + if (ksa_dssp>=0) q.nsa_dssp=n++; // copy dssp sequence? + if (kss_pred>=0) q.nss_pred=n++; // copy psipred sequence? + if (kss_conf>=0) q.nss_conf=n++; // copy confidence value sequence? + + // Calculate consensus sequence? + if (par.showcons || par.cons) + { + float maxw; + int maxa; + if (par.showcons) + { + // Reserve space for consensus/conservation sequence as Q-T alignment mark-up + q.ncons=n++; + q.sname[q.ncons]=new(char[10]); + if (!q.sname[q.ncons]) {MemoryError("array of names for displayed sequences");} + strcpy(q.sname[q.ncons],"Consensus"); + q.seq[q.ncons]=new(char[L+2]); + if (!q.seq[q.ncons]) {MemoryError("array of names for displayed sequences");} + } + if (par.cons) + { + // Reserve space for consensus sequence as first sequence in alignment + q.nfirst=n++; kfirst=-1; + q.sname[q.nfirst]=new(char[strlen(name)+11]); + if (!q.sname[q.nfirst]) {MemoryError("array of names for displayed sequences");} + strcpy(q.sname[q.nfirst],name); + strcat(q.sname[q.nfirst],"_consensus"); + q.seq[q.nfirst]=new(char[L+2]); + if (!q.seq[q.nfirst]) {MemoryError("array of names for displayed sequences");} + } + // Calculate consensus amino acids using similarity matrix + for (i=1; i<=L; i++) + { + maxw=0.0; maxa=0; + for (a=0; a<20; a++) + if (q.f[i][a]-pb[a]>maxw) {maxw = q.f[i][a]-pb[a]; maxa = a;} + + if (par.showcons) + { + maxw =0.0; + for (int b=0; b<20; b++) maxw += q.f[i][b]*Sim[maxa][b]*Sim[maxa][b]; + maxw *= q.Neff_M[i]/(q.Neff_HMM+1); // columns with many gaps don't get consensus symbol + if (maxw>0.6) q.seq[q.ncons][i] = uprchr(i2aa(maxa)); + else if (maxw>0.4) q.seq[q.ncons][i] = lwrchr(i2aa(maxa)); + else q.seq[q.ncons][i] = 'x'; + } + if (par.cons) q.seq[q.nfirst][i] = uprchr(i2aa(maxa)); + } + if (par.showcons) + { + q.seq[q.ncons][0]='-'; + q.seq[q.ncons][L+1]='\0'; + } + if (par.cons) + { + q.seq[q.nfirst][0]='-'; + q.seq[q.nfirst][L+1]='\0'; + } + } + + // Copy sequences to be displayed from alignment to HMM + for (k=0; k<N_in; k++) + { + int nn; + if (display[k]) + { + if (0 && (n>=MAXSEQDIS)) { + /* FIXME: the test was if(n>=MAXSEQDIS), + this test was necessary because alignment memory was static, + now it should be dynamic, and should always have the right size, + there are at least number-of-sequences plus a 'bit' more + however, I do not know what that 'bit' is likely to be (in the future). + at the moment it is 1 for the consnseus and 1 for structure, + but this might change (FS) + */ + if (par.mark) cerr<<"WARNING: maximum number "<<MAXSEQDIS<<" of sequences for display of alignment exceeded\n"; + break; + } + if (k==kss_dssp) nn=q.nss_dssp; // copy dssp sequence to nss_dssp + else if (k==ksa_dssp) nn=q.nsa_dssp; + else if (k==kss_pred) nn=q.nss_pred; + else if (k==kss_conf) nn=q.nss_conf; + else if (k==kfirst) nn=q.nfirst=n++; + else nn=n++; + // strcut(sname[k]," "); // delete rest of name line beginning with two spaces " " // Why this?? Problem for pdb seqs without chain + q.sname[nn]=new(char[strlen(sname[k])+1]); + if (!q.sname[nn]) {MemoryError("array of names for displayed sequences");} + strcpy(q.sname[nn],sname[k]); + q.seq[nn]=new(char[strlen(seq[k])+1]); + if (!q.seq[nn]) {MemoryError("array of names for displayed sequences");} + strcpy(q.seq[nn],seq[k]); + } + } + q.n_display=n; // how many sequences to be displayed in alignments? + + // Copy secondary structure information into HMM + if (kss_dssp>=0) + for (i=1; i<=L; i++) q.ss_dssp[i]=X[kss_dssp][i]; + if (ksa_dssp>=0) + for (i=1; i<=L; i++) q.sa_dssp[i]=X[ksa_dssp][i]; + if (kss_pred>=0) + { + for (i=1; i<=L; i++) q.ss_pred[i]=X[kss_pred][i]; + if (kss_conf>=0) + for (i=1; i<=L; i++) q.ss_conf[i]=X[kss_conf][i]; + else + for (i=1; i<=L; i++) q.ss_conf[i]=5; + } + + q.lamda=0.0; + q.mu=0.0; + + // Debug: print occurence of amino acids for each position i + if (v>=2) printf("Effective number of sequences exp(entropy) = %-4.1f\n",q.Neff_HMM); //PRINT + if (v>=3) + { + cout<<"\nMatr: "; + for (a=0; a<20; a++) printf("%4.1f ",100*pb[a]); + cout<<"\nAmino acid frequencies without pseudocounts:\n"; + cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; + for (i=1; i<=L; i++) + { + printf("%3i: ",i); + for (a=0; a<20; a++) printf("%4.0f ",100*q.f[i][a]); + cout<<endl; + } + cout<<"\n"; + + printf("\nListing transition probabilities without pseudocounts:\n"); + printf(" i M->M M->I M->D I->M I->I D->M D->D Neff_M Neff_I Neff_D\n"); + for (i=0; i<=L; i++) + { + printf("%4i %6.3f %6.3f %6.3f ",i,pow(2.0,q.tr[i][M2M]),pow(2.0,q.tr[i][M2I]),pow(2.0,q.tr[i][M2D])); + printf("%6.3f %6.3f ",pow(2.0,q.tr[i][I2M]),pow(2.0,q.tr[i][I2I])); + printf("%6.3f %6.3f ",pow(2.0,q.tr[i][D2M]),pow(2.0,q.tr[i][D2D])); + printf("%6.3f %6.3f %6.3f\n",q.Neff_M[i],q.Neff_I[i],q.Neff_D[i]); + } + } + q.trans_lin=0; + q.has_pseudocounts=false; /* MR1 */ + + return; +} + + +///////////////////////////////////////////////////////////////////////////////////// +/* + * FIXME: one of the most time consuming routines (according to gprof on r112) + */ +/** + * @brief Calculate freqs q.f[i][a] and transitions q.tr[i][a] (a=MM,MI,MD) with pos-specific subalignments + * Pos-specific weights are calculated like in "GetPositionSpecificWeights()" + */ +void +Alignment::Amino_acid_frequencies_and_transitions_from_M_state(HMM& q, char* in) +{ + // Calculate position-dependent weights wi[k] for each i. + // For calculation of weights in column i use sub-alignment + // over sequences which have a *residue* in column i (no gap, no end gap) + // and over columns where none of these sequences has an end gap. + // This is done by updating the arrays n[j][a] at each step i-1->i while letting i run from 1 to L. + // n[j][a] = number of occurences of amino acid a at column j of the subalignment, + // => only columns with n[j][ENDGAP]=0 are contained in the subalignment! + // If no sequences enter or leave the subalignment at the step i-1 -> i (i.e. change=0) + // then the old values wi[k], Neff[i-1], and ncol are used for the new position i. + // Index a can be an amino acid (0-19), ANY=20, GAP=21, or ENDGAP=22 + + int k; // index of sequence + int i,j; // position in alignment + int a; // amino acid (0..19) + int naa; // number of different amino acids + int** n; // n[j][a] = number of seq's with some residue at column i AND a at position j + //float wi[MAXSEQ]; // weight of sequence k in column i, calculated from subalignment i + float *wi=NULL; // weight of sequence k in column i, calculated from subalignment i + //float Neff[MAXRES]; // diversity of subalignment i + float *Neff = new(float[par.maxResLen]); // diversity of subalignment i + int nseqi=0; // number of sequences in subalignment i + int ncol=0; // number of columns j that contribute to Neff[i] + char change; // has the set of sequences in subalignment changed? 0:no 1:yes + float fj[NAA+3]; // to calculate entropy + float sum; + + wi = new(float[N_in+2]); + + // Global weights? + if (par.wg==1) + for (k=0; k<N_in; k++) wi[k]=wg[k]; + + // Initialization + q.Neff_HMM=0.0f; + Neff[0]=0.0; // if the first column has no residues (i.e. change==0), Neff[i]=Neff[i-1]=Neff[0] + n = new(int*[L+2]); + for (j=1; j<=L; j++) n[j]=new(int[NAA+3]); + for (j=1; j<=L; j++) + for (a=0; a<NAA+3; a++) n[j][a]=0; + + + ////////////////////////////////////////////////////////////////////////////////////////////// + // Main loop through alignment columns + for (i=1; i<=L; i++) // Calculate wi[k] at position i as well as Neff[i] + { + + if (par.wg==0) + { + + change=0; + // Check all sequences k and update n[j][a] and ri[j] if necessary + for (k=0; k<N_in; k++) + { + if (!in[k]) continue; + if (X[k][i-1]>=ANY && X[k][i]<ANY) + { // ... if sequence k was NOT included in i-1 and has to be included for column i + change=1; + nseqi++; + for (int j=1; j<=L; j++) n[j][ (int)X[k][j]]++; + } + else if (X[k][i-1]<ANY && X[k][i]>=ANY) + { // ... if sequence k WAS included in i-1 and has to be thrown out for column i + change=1; + nseqi--; + for (int j=1; j<=L; j++) n[j][ (int)X[k][j]]--; + } + } //end for (k) + nseqs[i]=nseqi; + + // If subalignment changed: update weights wi[k] and Neff[i] + if (change) + { + // Initialize weights and numbers of residues for subalignment i + ncol=0; + for (k=0; k<N_in; k++) wi[k]=1E-8; // for pathological alignments all wi[k] can get 0; /* MR1 */ + + // sum wi[k] over all columns j and sequences k of subalignment + for (j=1; j<=L; j++) + { + // do at least a fraction MAXENDGAPFRAC of sequences in subalignment contain an end gap in j? + if (n[j][ENDGAP]>MAXENDGAPFRAC*nseqi) continue; + naa=0; for (a=0; a<20; a++) if(n[j][a]) naa++; + if (naa==0) continue; + ncol++; + for (k=0; k<N_in; k++) + { + if (in[k] && X[k][i]<ANY && X[k][j]<ANY) + { + // if (!n[j][ (int)X[k][j]]) {fprintf(stderr,"Error: Mi=%i: n[%i][X[%i]]=0! (X[%i]=%i)\n",i,j,k,k,X[k][j]);} + wi[k]+=1.0/float(n[j][ (int)X[k][j] ]*naa); + } + } + } + + // Check whether number of columns in subalignment is sufficient + if (ncol<NCOLMIN) + // Take global weights + for (k=0; k<N_in; k++) + if(in[k] && X[k][i]<ANY) wi[k]=wg[k]; else wi[k]=0.0; + + // Calculate Neff[i] + Neff[i]=0.0; + for (j=1; j<=L; j++) + { + // do at least a fraction MAXENDGAPFRA of sequences in subalignment contain an end gap in j? + if (n[j][ENDGAP]>MAXENDGAPFRAC*nseqi) continue; + for (a=0; a<20; a++) fj[a]=0; + for (k=0; k<N_in; k++) + if (in[k] && X[k][i]<ANY && X[k][j]<ANY) + fj[ (int)X[k][j] ]+=wi[k]; + NormalizeTo1(fj,NAA); + for (a=0; a<20; a++) + if (fj[a]>1E-10) Neff[i]-=fj[a]*fast_log2(fj[a]); + } + if (ncol>0) Neff[i]=pow(2.0,Neff[i]/ncol); else Neff[i]=1.0; + + } + + else //no update was necessary; copy values for i-1 + { + Neff[i]=Neff[i-1]; + } + } + + + // Calculate amino acid frequencies q.f[i][a] from weights wi[k] + for (a=0; a<20; a++) q.f[i][a]=0; + for (k=0; k<N_in; k++) if (in[k]) q.f[i][ (int)X[k][i] ]+=wi[k]; + NormalizeTo1(q.f[i],NAA,pb); + + // Calculate transition probabilities from M state + q.tr[i][M2M]=q.tr[i][M2D]=q.tr[i][M2I]=0.0; + for (k=0; k<N_in; k++) //for all sequences + { + if (!in[k]) continue; + //if input alignment is local ignore transitions from and to end gaps + if (X[k][i]<ANY) //current state is M + { + if (I[k][i]) //next state is I + q.tr[i][M2I]+=wi[k]; + else if (X[k][i+1]<=ANY) //next state is M + q.tr[i][M2M]+=wi[k]; + else if (X[k][i+1]==GAP) //next state is D + q.tr[i][M2D]+=wi[k]; + } + } // end for(k) + // Normalize and take log + sum = q.tr[i][M2M]+q.tr[i][M2I]+q.tr[i][M2D]+FLT_MIN; + q.tr[i][M2M]=log2(q.tr[i][M2M]/sum); + q.tr[i][M2I]=log2(q.tr[i][M2I]/sum); + q.tr[i][M2D]=log2(q.tr[i][M2D]/sum); + + // for (k=0; k<N_in; k++) if (in[k]) w[k][i]=wi[k]; + } + // DD TODO:fill in all the missing Neff values + + + // end loop through alignment columns i + ////////////////////////////////////////////////////////////////////////////////////////////// + + delete[](wi); wi=NULL; + // delete n[][] + for (j=1; j<=L; j++){ + delete[](n[j]); (n[j]) = NULL; + } + delete[](n); (n) = NULL; + + q.tr[0][M2M]=0; + q.tr[0][M2I]=-100000; + q.tr[0][M2D]=-100000; + q.tr[L][M2M]=0; + q.tr[L][M2I]=-100000; + q.tr[L][M2D]=-100000; + q.Neff_M[0]=99.999; // Neff_av[0] is used for calculation of transition pseudocounts for the start state + + // Set emission probabilities of zero'th (begin) state and L+1st (end) state to background probabilities + for (a=0; a<20; a++) q.f[0][a]=q.f[L+1][a]=pb[a]; + + // Assign Neff_M[i] and calculate average over alignment, Neff_M[0] + if (par.wg==1) + { + for (i=1; i<=L; i++) + { + float sum=0.0f; + for (a=0; a<20; a++) + if (q.f[i][a]>1E-10) sum -= q.f[i][a]*fast_log2(q.f[i][a]); + q.Neff_HMM+=pow(2.0,sum); + } + q.Neff_HMM/=L; + float Nlim=fmax(10.0,q.Neff_HMM+1.0); // limiting Neff + float scale=log2((Nlim-q.Neff_HMM)/(Nlim-1.0)); // for calculating Neff for those seqs with inserts at specific pos + for (i=1; i<=L; i++) + { + float w_M=-1.0/N_filtered; + for (k=0; k<N_in; k++) + if (in[k] && X[k][i]<=ANY) w_M+=wg[k]; + if (w_M<0) q.Neff_M[i]=1.0; + else q.Neff_M[i] = Nlim - (Nlim-1.0)*fpow2(scale*w_M); + // fprintf(stderr,"M i=%3i ncol=--- Neff_M=%5.2f Nlim=%5.2f w_M=%5.3f Neff_M=%5.2f\n",i,q.Neff_HMM,Nlim,w_M,q.Neff_M[i]); + } + } + else + { + for (i=1; i<=L; i++) + { + q.Neff_HMM+=Neff[i]; + q.Neff_M[i]=Neff[i]; + if (q.Neff_M[i] == 0) { q.Neff_M[i] = 1; } /* MR1 */ + } + q.Neff_HMM/=L; + } + + delete[] Neff; Neff = NULL; + + return; + +} /* this is the end of Alignment::Amino_acid_frequencies_and_transitions_from_M_state() */ + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate transitions q.tr[i][a] (a=DM,DD) with pos-specific subalignments + */ +void +Alignment::Transitions_from_I_state(HMM& q, char* in) +{ + // Calculate position-dependent weights wi[k] for each i. + // For calculation of weights in column i use sub-alignment + // over sequences which have a INSERT in column i + // and over columns where none of these sequences has an end gap. + // This is done by calculating the arrays n[j][a] and rj[j] at each step i-1->i while letting i run from 1 to L. + // n[j][a] = number of occurences of amino acid a at column j of the subalignment, + // => only columns with n[j][ENDGAP]=0 are contained in the subalignment! + // If no sequences enter or leave the subalignment at the step i-1 -> i (i.e. change=0) + // then the old values wi[k], Neff[i-1], and ncol are used for the new position i. + // Index a can be an amino acid (0-19), ANY=20, GAP=21, or ENDGAP=22 + + int k; // index of sequence + int i,j; // position in alignment + int a; // amino acid (0..19) + int naa; // number of different amino acids + int** n; // n[j][a] = number of seq's with some residue at column i AND a at position j + //float wi[MAXSEQ]; // weight of sequence k in column i, calculated from subalignment i + float *wi = NULL; // weight of sequence k in column i, calculated from subalignment i + //float Neff[MAXRES]; // diversity of subalignment i + float *Neff = new(float[par.maxResLen]); // diversity of subalignment i + int nseqi; // number of sequences in subalignment i + int ncol; // number of columns j that contribute to Neff[i] + float fj[NAA+3]; // to calculate entropy + float sum; + float Nlim=0.0; // only for global weights + float scale=0.0; // only for global weights + + wi = new(float[N_in+2]); + + // Global weights? + if (par.wg==1) + { + for (k=0; k<N_in; k++) wi[k]=wg[k]; + Nlim=fmax(10.0,q.Neff_HMM+1.0); // limiting Neff + scale=log2((Nlim-q.Neff_HMM)/(Nlim-1.0)); // for calculating Neff for those seqs with inserts at specific pos + } + + // Initialization + n = new(int*[L+2]); + for (j=1; j<=L; j++) n[j]=new(int[NAA+3]); + + ////////////////////////////////////////////////////////////////////////////////////////////// + // Main loop through alignment columns + for (i=1; i<=L; i++) // Calculate wi[k] at position i as well as Neff[i] + { + if (par.wg==0) // local weights? + { + + // Calculate n[j][a] and ri[j] + nseqi=0; + for (k=0; k<N_in; k++) + { + if (in[k] && I[k][i]>0) + { + if (nseqi==0) // Initialize only if inserts present! Otherwise O(L*L) even for single sequences! + { + // Initialization of n[j][a] + for (j=1; j<=L; j++) + for (a=0; a<NAA+3; a++) n[j][a]=0; + } + nseqi++; + for (int j=1; j<=L; j++) n[j][ (int)X[k][j]]++; + } + } //end for (k) + nseqs[i]=nseqi; + + // If there is no sequence in subalignment j ... + if (nseqi==0) + { + ncol=0; + Neff[i]=0.0; // effective number of sequence = 0! + q.tr[i][I2M]=-100000; + q.tr[i][I2I]=-100000; + continue; + } + + // update weights wi[k] and Neff[i] + // if (1) + { + // Initialize weights and numbers of residues for subalignment i + ncol=0; + for (k=0; k<N_in; k++) wi[k]=0.0; + + // sum wi[k] over all columns j and sequences k of subalignment + for (j=1; j<=L; j++) + { + if (n[j][ENDGAP]>MAXENDGAPFRAC*nseqi) continue; + naa=0; for (a=0; a<20; a++) if(n[j][a]) naa++; + if (naa==0) continue; + ncol++; + for (k=0; k<N_in; k++) + { + if (in[k] && I[k][i]>0 && X[k][j]<ANY) + { + if (!n[j][ (int)X[k][j]]) {fprintf(stderr,"Error: Ii=%i: n[%i][X[%i]]=0! (X[%i]=%i)\n",i,j,k,k,X[k][j]);} + wi[k]+=1.0/float(n[j][ (int)X[k][j] ]*naa); + } + } + } + + // Check whether number of columns in subalignment is sufficient + if (ncol>=NCOLMIN) + // Take global weights + for (k=0; k<N_in; k++) + if(in[k] && I[k][i]>0) wi[k]=wg[k]; else wi[k]=0.0; + + // Calculate Neff[i] + Neff[i]=0.0; + for (j=1; j<=L; j++) + { + if (n[j][ENDGAP]>MAXENDGAPFRAC*nseqi) continue; + for (a=0; a<20; a++) fj[a]=0; + for (k=0; k<N_in; k++) + if (in[k] && I[k][i]>0 && X[k][j]<ANY) + fj[ (int)X[k][j] ]+=wi[k]; + NormalizeTo1(fj,NAA); + for (a=0; a<20; a++) + if (fj[a]>1E-10) Neff[i]-=fj[a]*fast_log2(fj[a]); + } + if (ncol>0) Neff[i]=pow(2.0,Neff[i]/ncol); else Neff[i]=1.0; + + } + // Calculate transition probabilities from I state + q.tr[i][I2M]=q.tr[i][I2I]=0.0; + for (k=0; k<N_in; k++) //for all sequences + { + if (in[k] && I[k][i]>0) //current state is I + { + q.tr[i][I2M]+=wi[k]; + q.tr[i][I2I]+=wi[k]*(I[k][i]-1); + } + } // end for(k) + } + + else // fast global weights? + { + float w_I=-1.0/N_filtered; + ncol=0; + q.tr[i][I2M]=q.tr[i][I2I]=0.0; + // Calculate amino acid frequencies fj[a] from weights wg[k] + for (k=0; k<N_in; k++) + if (in[k] && I[k][i]>0) + { + ncol++; + w_I+=wg[k]; + q.tr[i][I2M]+=wi[k]; + q.tr[i][I2I]+=wi[k]*(I[k][i]-1); + } + if (ncol>0) + { + if (w_I<0) Neff[i]=1.0; + else Neff[i] = Nlim - (Nlim-1.0)*fpow2(scale*w_I); + // fprintf(stderr,"I i=%3i ncol=%3i Neff_M=%5.2f Nlim=%5.2f w_I=%5.3f Neff_I=%5.2f\n",i,ncol,q.Neff_HMM,Nlim,w_I,Neff[i]); + } + else + { + Neff[i]=0.0; + q.tr[i][I2M]=-100000; + q.tr[i][I2I]=-100000; + continue; + } + } + + // Normalize and take log + sum = q.tr[i][I2M]+q.tr[i][I2I]; + q.tr[i][I2M]=log2(q.tr[i][I2M]/sum); + q.tr[i][I2I]=log2(q.tr[i][I2I]/sum); + + } + // end loop through alignment columns i + ////////////////////////////////////////////////////////////////////////////////////////////// + + delete[](wi); wi = NULL; + // delete n[][] + for (j=1; j<=L; j++){ + delete[](n[j]); (n[j]) = NULL; + } + delete[](n); (n) = NULL; + + q.tr[0][I2M]=0; + q.tr[0][I2I]=-100000; + q.tr[L][I2M]=0; + q.tr[L][I2I]=-100000; + q.Neff_I[0]=99.999; + + // Assign Neff_I[i] + for (i=1; i<=L; i++) // Calculate wi[k] at position i as well as Neff[i] and Neff[i] + q.Neff_I[i]=Neff[i]; + + delete[] Neff; Neff = NULL; + return; + +} /* this is the end of Alignment::Transitions_from_I_state() */ + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate transitions q.tr[i][a] (a=DM,DD) with pos-specific subalignments + */ +void +Alignment::Transitions_from_D_state(HMM& q, char* in) +{ + // Calculate position-dependent weights wi[k] for each i. + // For calculation of weights in column i use sub-alignment + // over sequences which have a DELETE in column i + // and over columns where none of these sequences has an end gap. + // This is done by updating the arrays n[j][a] and rj[j] at each step i-1->i while letting i run from 1 to L. + // n[j][a] = number of occurences of index a at column j of the subalignment, + // => only columns with n[j][ENDGAP]=0 are contained in the subalignment! + // If no sequences enter or leave the subalignment at the step i-1 -> i (i.e. change=0) + // then the old values wi[k], Neff[i-1], and ncol are used for the new position i. + // Index a can be an amino acid (0-19), ANY=20, GAP=21, or ENDGAP=22 + + int k; // index of sequence + int i,j; // position in alignment + int a; // amino acid (0..19) + int naa; // number of different amino acids + int** n; // n[j][a] = number of seq's with some residue at column i AND a at position j + //float wi[MAXSEQ]; // weight of sequence k in column i, calculated from subalignment i + float *wi=NULL; // weight of sequence k in column i, calculated from subalignment i + //float Neff[MAXRES]; // diversity of subalignment i + float *Neff = new(float[par.maxResLen]); // diversity of subalignment i + int nseqi=0; // number of sequences in subalignment i (for DEBUGGING) + int ncol=0; // number of columns j that contribute to Neff[i] + char change; // has the set of sequences in subalignment changed? 0:no 1:yes + float fj[NAA+3]; // to calculate entropy + float sum; + float Nlim=0.0; // only for global weights + float scale=0.0; // only for global weights + + wi = new(float[N_in+2]); /* FIXME: FS */ + // Global weights? + if (par.wg==1) + { + for (k=0; k<N_in; k++) wi[k]=wg[k]; + Nlim=fmax(10.0,q.Neff_HMM+1.0); // limiting Neff + scale=log2((Nlim-q.Neff_HMM)/(Nlim-1.0)); // for calculating Neff for those seqs with dels at specific pos + } + + // Initialization + n = new(int*[L+2]); + for (j=1; j<=L; j++) n[j]=new(int[NAA+3]); + for (j=1; j<=L; j++) + for (a=0; a<NAA+3; a++) n[j][a]=0; + + + + ////////////////////////////////////////////////////////////////////////////////////////////// + // Main loop through alignment columns + for (i=1; i<=L; i++) // Calculate wi[k] at position i as well as Neff[i] + { + if (par.wg==0) // if local weights + { + change=0; + // Check all sequences k and update n[j][a] and ri[j] if necessary + for (k=0; k<N_in; k++) + { + if (!in[k]) continue; + if (X[k][i-1]!=GAP && X[k][i]==GAP) + { // ... if sequence k was NOT included in i-1 and has to be included for column i + change=1; + nseqi++; + for (int j=1; j<=L; j++) n[j][ (int)X[k][j]]++; + } + else if (X[k][i-1]==GAP && X[k][i]!=GAP) + { // ... if sequence k WAS included in i-1 and has to be thrown out for column i + change=1; + nseqi--; + for (int j=1; j<=L; j++) n[j][ (int)X[k][j]]--; + } + } //end for (k) + nseqs[i]=nseqi; + + // If there is no sequence in subalignment j ... + if (nseqi==0) + { + ncol=0; + Neff[i]=0.0; // effective number of sequences = 0! + q.tr[i][D2M]=-100000; + q.tr[i][D2D]=-100000; + continue; + } + + // If subalignment changed: update weights wi[k] and Neff[i] + if (change) + { + // Initialize weights and numbers of residues for subalignment i + ncol=0; + for (k=0; k<N_in; k++) wi[k]=0.0; + + // sum wg[k][i] over all columns j and sequences k of subalignment + for (j=1; j<=L; j++) + { + if (n[j][ENDGAP]>MAXENDGAPFRAC*nseqi) continue; + naa=0; for (a=0; a<20; a++) if(n[j][a]) naa++; + if (naa==0) continue; + ncol++; + for (k=0; k<N_in; k++) + { + if (in[k] && X[k][i]==GAP && X[k][j]<ANY) + { + if (!n[j][ (int)X[k][j]]) {fprintf(stderr,"Error: Di=%i: n[%i][X[%i]]=0! (X[%i]=%i)\n",i,j,k,k,X[k][j]);} + wi[k]+=1.0/float(n[j][ (int)X[k][j] ]*naa); + } + } + } + + // Check whether number of columns in subalignment is sufficient + if (ncol<NCOLMIN) + // Take global weights + for (k=0; k<N_in; k++) + if(in[k] && X[k][i]==GAP) wi[k]=wg[k]; else wi[k]=0.0; + + // Calculate Neff[i] + Neff[i]=0.0; + for (j=1; j<=L; j++) + { + if (n[j][ENDGAP]>MAXENDGAPFRAC*nseqi) continue; + for (a=0; a<20; a++) fj[a]=0; + for (k=0; k<N_in; k++) + if (in[k] && X[k][i]==GAP && X[k][j]<ANY) + fj[ (int)X[k][j] ]+=wi[k]; + NormalizeTo1(fj,NAA); + for (a=0; a<20; a++) + if (fj[a]>1E-10) Neff[i]-=fj[a]*fast_log2(fj[a]); + } + if (ncol>0) Neff[i]=pow(2.0,Neff[i]/ncol); else Neff[i]=1.0; + + } + + else //no update was necessary; copy values for i-1 + { + Neff[i]=Neff[i-1]; + } + + // Calculate transition probabilities from D state + q.tr[i][D2M]=q.tr[i][D2D]=0.0; + for (k=0; k<N_in; k++) //for all sequences + { + if (in[k] && X[k][i]==GAP) //current state is D + { + if (X[k][i+1]==GAP) //next state is D + q.tr[i][D2D]+=wi[k]; + else if (X[k][i+1]<=ANY) //next state is M + q.tr[i][D2M]+=wi[k]; + } + } // end for(k) + } + + else // fast global weights? + { + float w_D=-1.0/N_filtered; + ncol=0; + q.tr[i][D2M]=q.tr[i][D2D]=0.0; + // Calculate amino acid frequencies fj[a] from weights wg[k] + for (k=0; k<N_in; k++) //for all sequences + if (in[k] && X[k][i]==GAP) //current state is D + { + ncol++; + w_D+=wg[k]; + if (X[k][i+1]==GAP) //next state is D + q.tr[i][D2D]+=wi[k]; + else if (X[k][i+1]<=ANY) //next state is M + q.tr[i][D2M]+=wi[k]; + } + if (ncol>0) + { + if (w_D<0) Neff[i]=1.0; + else Neff[i] = Nlim - (Nlim-1.0)*fpow2(scale*w_D); + // fprintf(stderr,"D i=%3i ncol=%3i Neff_M=%5.2f Nlim=%5.2f w_D=%5.3f Neff_D=%5.2f\n",i,ncol,q.Neff_HMM,Nlim,w_D,Neff[i]); + } + else + { + Neff[i]=0.0; // effective number of sequences = 0! + q.tr[i][D2M]=-100000; + q.tr[i][D2D]=-100000; + continue; + } + } + + // Normalize and take log + sum = q.tr[i][D2M]+q.tr[i][D2D]; + q.tr[i][D2M]=log2(q.tr[i][D2M]/sum); + q.tr[i][D2D]=log2(q.tr[i][D2D]/sum); + + } + // end loop through alignment columns i + ////////////////////////////////////////////////////////////////////////////////////////////// + + q.tr[0][D2M]=0; + q.tr[0][D2D]=-100000; + q.Neff_D[0]=99.999; + + // Assign Neff_D[i] + for (i=1; i<=L; i++) + q.Neff_D[i]=Neff[i]; + + delete[](wi); wi = NULL;/* FIXME: FS */ + // delete n[][] + for (j=1; j<=L; j++){ + delete[](n[j]); (n[j]) = NULL; + } + delete[](n); (n) = NULL; + + delete[] Neff; Neff = NULL; + return; + +} /* this is the end of Alignment::Transitions_from_D_state() */ + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Write alignment without insert states (lower case) to alignment file? + */ +void +Alignment::WriteWithoutInsertsToFile(char* alnfile) +{ + if (v>=2) cout<<"Writing alignment to "<<alnfile<<"\n"; + FILE* alnf; + if (!par.append) alnf = fopen(alnfile,"w"); else alnf = fopen(alnfile,"a"); + if (!alnf) OpenFileError(alnfile); + // If alignment name is different from that of query: write name into commentary line + if (strncmp(longname,sname[kfirst],DESCLEN-1)) fprintf(alnf,"#%s\n",longname); + if (v>=2) cout<<"Writing alignment to "<<alnfile<<"\n"; + for (int k=0; k<N_in; k++) + if (keep[k] || display[k]==KEEP_ALWAYS) // print if either in profile (keep[k]>0) or display is obligatory (display[k]==2) + { + fprintf(alnf,">%s\n",sname[k]); + for (int i=1; i<=L; i++) fprintf(alnf,"%c",i2aa(X[k][i])); + fprintf(alnf,"\n"); + } + fclose(alnf); +} + +///////////////////////////////////////////////////////////////////////////////////// +// Write stored,filtered sequences WITH insert states (lower case) to alignment file? +///////////////////////////////////////////////////////////////////////////////////// +void Alignment::WriteToFile(char* alnfile, const char format[]) +{ + FILE* alnf; + if (!par.append) alnf = fopen(alnfile,"w"); else alnf = fopen(alnfile,"a"); + if (!alnf) OpenFileError(alnfile); + // If alignment name is different from that of query: write name into commentary line + if (strncmp(longname,sname[kfirst],DESCLEN-1)) fprintf(alnf,"#%s\n",longname); + if (!format || !strcmp(format,"a3m")) + { + if (v>=2) cout<<"Writing A3M alignment to "<<alnfile<<"\n"; + for (int k=0; k<N_in; k++) + if (keep[k] || display[k]==KEEP_ALWAYS) // print if either in profile (keep[k]>0) or display obligatory (display[k]==2) + fprintf(alnf,">%s\n%s\n",sname[k],seq[k]+1); + } + else // PSI-BLAST format + { + if (v>=2) cout<<"Writing PSI-BLAST-formatted alignment to "<<alnfile<<"\n"; + for (int k=kfirst; k<N_in; k++) // skip sequences before kfirst!! + if (keep[k] || display[k]==KEEP_ALWAYS) // print if either in profile (keep[k]>0) or display obligatory (display[k]==2) + { + strcut(sname[k]); + fprintf(alnf,"%-20.20s ",sname[k]); + // for (int i=1; i<=L; i++) fprintf(alnf,"%c",i2aa(X[k][i])); + // fprintf(alnf,"\n"); + char* ptr=seq[k]; + for (; *ptr!='\0'; ptr++) + if (*ptr==45 || (*ptr>=65 && *ptr<=90)) fprintf(alnf,"%c",*ptr); + fprintf(alnf,"\n"); + } + } + + fclose(alnf); +} + + + +/* + * FIXME: this function contains a reference to MAXSEQ & MAXCOL + * however, this may not be accessed (FS) + */ +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Read a3m slave alignment of hit from file and merge into (query) master alignment + */ +void +Alignment::MergeMasterSlave(Hit& hit, char ta3mfile[]) +{ + Alignment Tali; + char* cur_seq = new(char[MAXCOL]); // Sequence currently read in + int maxcol=MAXCOL; + int l,ll; // position in unaligned template (T) sequence Tali.seq[l] + int i; // counts match states in query (Q) HMM + int j; // counts match states in T sequence Tali.seq[l] + int h; // position in aligned T sequence cur_seq[h] + int k; // sequence index + char c; // + printf("****************%s:%s:%d: did get into MergeMasterSlave\n", __FUNCTION__, __FILE__, __LINE__); + if (v>=3) printf("Merging %s to query alignment\n",ta3mfile); + + // If par.append==1 do not print query alignment + if (par.append) for (k=0; k<N_in; k++) keep[k]=display[k]=KEEP_NOT; + + // Read template alignment into Tali + FILE* ta3mf=fopen(ta3mfile,"r"); + if (!ta3mf) OpenFileError(ta3mfile); + Tali.Read(ta3mf,ta3mfile); + fclose(ta3mf); + + // Filter Tali alignment + Tali.Compress(ta3mfile); + N_filtered = Tali.Filter(par.max_seqid,par.coverage,par.qid,par.qsc,par.Ndiff); + + // Record imatch[j] + int* imatch=new(int[hit.j2+1]); + int step = hit.nsteps; + for (j=hit.j1; j<=hit.j2; j++) + { + // Advance to position of next T match state j + while (hit.j[step]<j) step--; + imatch[j] = hit.i[step]; +// printf("step=%-3i i=%-3i j=%-3i\n",step,imatch[j],j); + } + + // Determine number of match states of Qali + for (L=0,l=1; seq[kfirst][l]>'\0'; l++) + if ((seq[kfirst][l]>='A' && seq[kfirst][l]<='Z') || seq[kfirst][l]=='-') L++; + + // For each sequence in T alignment: align to Qali + for (k=0; k<Tali.N_in; k++) + { + if (!Tali.keep[k]) continue; + if (N_in>=MAXSEQ) + { + fprintf(stderr,"WARNING in %s: maximum number of %i sequences exceeded while reading %s. Skipping all following sequences\n",program_name,MAXSEQ,ta3mfile); + break; + } + cur_seq[0]=' '; // 0'th position not used + + // Add the hit.i1-1 left end gaps to aligned sequence + for (h=1; h<hit.i1; h++) cur_seq[h]='-'; + + // Advance to match state hit.j1 of Tali.seq[k] + for (j=0, l=1; (c=Tali.seq[k][l])>'\0'; l++) + if ((c>='A' && c<='Z') || c=='-') // match state at position l? + if ((++j)==hit.j1) break; // yes: increment j. Reached hit,j1? yes: break + + if (j<hit.j1) + {printf("Error: did not find %i match states in sequence %i of %s. Sequence:\n%s\n",hit.j1,k,Tali.name,Tali.seq[k]); exit(1);} + + // Write first match state to cur_seq + int iprev=hit.i1; // index of previous query match state + int lprev=l; // previous T match state in Tali.seq[k][l] + cur_seq[h++] = Tali.seq[k][l]; // first column of alignment is Match-Match state + + // For each further match state j in alignment + step = hit.nsteps; + for (j=hit.j1+1; j<=hit.j2; j++) + { + // Advance to position of next T match state j + i=imatch[j]; + + // Advance to position of next T match state j + while ((c=Tali.seq[k][++l])>'\0' && ((c>='a' && c<='z') || c=='.')) ; + + int di=i-iprev; // number of Match states in Q between T match state j-1 and j + int dl=l-lprev; // 1 + number of inserted residues in T sequence between T match state j-1 and j + if (di==1) + { + // One Q match state for one T match state (treated as special case for speed reasons) + // i: i-1 i di=1 + // Q: XXXXXX.....XXXXXX + // T: YYYYYYyyyyyYYYYYY + // j: j-1 j + // l: lprev l dl=6 + + // Inserts in lower case + for (ll=lprev+1; ll<l; ll++) + if (Tali.seq[k][ll]!='-' && Tali.seq[k][ll]!='.') cur_seq[h++] = lwrchr(Tali.seq[k][ll]); + + // Template Match state -> upper case + cur_seq[h++] = Tali.seq[k][ll]; + } + else if (di==0) + { + // Gap in query: no Q match state for on T match state (special case for speed reasons) + // i: i-1 i-1 di=0 + // Q: XXXXXX.....~~~XXX + // T: YYYYYYyyyyyYYYYYY + // j: j-1 j + // l: lprev l dl=6 + + // All T residues (including T match state) in lower case + for (ll=lprev+1; ll<=l; ll++) + if (Tali.seq[k][ll]!='-' && Tali.seq[k][ll]!='.') cur_seq[h++] = lwrchr(Tali.seq[k][ll]); + } + else if (di>=dl) + { + // More Match states in Q than Inserts in the T sequence + // => half T inserts y left, half right-aligned in uc, gaps to fill up + // Number of T insert residues to be left-aligned: (int)(dl/2) + // i: iprev i di=7 + // Q: XXXXXXXXXXXXXXXXXX + // T: YYYYYYYyyy-yyYYYYY + // j: j-1 j + // l: lprev l dl=6 + + // Add left-bounded template residues + for (ll=lprev+1; ll<=lprev+(int)(dl/2); ll++) + cur_seq[h++]=uprchr(Tali.seq[k][ll]); + + // Add central gaps + for (int gap=1; gap<=di-dl; gap++) cur_seq[h++]='-'; + + // Add right-bounded residues + for (; ll<=l; ll++) + cur_seq[h++]=uprchr(Tali.seq[k][ll]); + } + else if (di<dl) + { + // Fewer Match states in Q than inserts in T sequence + // => half of available space di for left- half for right-aligned T inserts, rest in lc + // number of T inserts to be left-aligned in uc: (int)(di/2), + // i: iprev i di=5 + // Q: XXXXXXXXX.XXXXXXX + // T: YYYYYYYyyyyyYYYYY + // j: j-1 j + // l: lprev l dl=6 + + // Add left-bounded template residues + for (ll=lprev+1; ll<=lprev+(int)(di/2); ll++) + cur_seq[h++]=uprchr(Tali.seq[k][ll]); + + // Add central inserts + for (int ins=1; ins<=dl-di; ins++,ll++) + if (Tali.seq[k][ll]!='-' && Tali.seq[k][ll]!='.') cur_seq[h++] = lwrchr(Tali.seq[k][ll]); + + // Add right-bounded residues + for (; ll<=l; ll++) + cur_seq[h++]=uprchr(Tali.seq[k][ll]); + } +// printf("i=%-3i j=%-3i l=%-3i cur_seq=%s\n",i,j,l,cur_seq); + + iprev=i; lprev=l; + if (h>=maxcol-1000) // too few columns? Reserve double space + { + char* new_seq=new(char[2*maxcol]); + strncpy(new_seq,cur_seq,maxcol); //////// check: maxcol-1 ???? + delete[](cur_seq); (cur_seq) = NULL; + cur_seq=new_seq; + maxcol*=2; + } + } + + // Add the remaining gaps '-' to the end of the template sequence + for (i=hit.i2+1; i<=L; i++) cur_seq[h++]='-'; + cur_seq[h++]='\0'; + + keep[N_in] = display[N_in] = KEEP_CONDITIONALLY; + seq[N_in]=new(char[h]); + if (!seq[N_in]) MemoryError("array for input sequences"); + strcpy(seq[N_in],cur_seq); + X[N_in]=new(char[h]); + if (!X[N_in]) MemoryError("array for input sequences"); + I[N_in]=new(short unsigned int[h]); + if (!I[N_in]) MemoryError("array for input sequences"); + sname[N_in]=new(char[strlen(Tali.sname[k])+1]); + if (!sname[N_in]) MemoryError("array for input sequences"); + strcpy(sname[N_in],Tali.sname[k]); + N_in++; + +// printf("k=%-3i %s\n",k,Tali.seq[k]); +// printf("Query %s\n",seq[kfirst]); +// printf("k=%-3i %s\n\n",k,cur_seq); + + } // end for (k) + +// printf("N_in=%-5i HMM=%s with %i sequences\n",N_in,ta3mfile,N_filtered); + + delete[] cur_seq; cur_seq = NULL; + delete[] imatch; imatch = NULL; + delete[] ksort; ksort=NULL; // if ksort already existed it will be to short for merged alignment + delete[] first; first=NULL; // if first already existed it will be to short for merged alignment + delete[] last; last=NULL; // if last already existed it will be to short for merged alignment + +} /* this is the end of Alignment::MergeMasterSlave() */ + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Add a sequence to Qali + */ +void +Alignment::AddSequence(char Xk[], int Ik[]) +{ + int i; // position in query and target + if (L<=0) InternalError("L is not set in AddSequence()"); + X[N_in]=new(char[L+2]); + for (i=0; i<=L+1; i++) X[N_in][i]=Xk[i]; + if (Ik==NULL) + for (i=0; i<=L+1; i++) I[N_in][i]=0; + else + for (i=0; i<=L+1; i++) I[N_in][i]=Ik[i]; + N_in++; +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Determine matrix of position-specific weights w[k][i] for multiple alignment + * Pos-specific weights are calculated like in "Amino_acid_frequencies_and_transitions_from_M_state()" + */ +void +Alignment::GetPositionSpecificWeights(float* w[]) +{ + // Calculate position-dependent weights wi[k] for each i. + // For calculation of weights in column i use sub-alignment + // over sequences which have a *residue* in column i (no gap, no end gap) + // and over columns where none of these sequences has an end gap. + // This is done by updating the arrays n[j][a] at each step i-1->i while letting i run from 1 to L. + // n[j][a] = number of occurences of amino acid a at column j of the subalignment, + // => only columns with n[j][ENDGAP]=0 are contained in the subalignment! + // If no sequences enter or leave the subalignment at the step i-1 -> i (i.e. change=0) + // then the old values w[k][i] and ncol are used for the new position i. + // Index a can be an amino acid (0-19), ANY=20, GAP=21, or ENDGAP=22 + + char* in=keep; // to keep the code similar to Amino_acid_frequencies_and_transitions_from_M_state() + int k; // index of sequence + int i,j; // position in alignment + int a; // amino acid (0..19) + int naa; // number of different amino acids + int** n; // n[j][a] = number of seq's with some residue at column i AND a at position j + int nseqi=0; // number of sequences in subalignment i + int ncol=0; // number of columns j that contribute to Neff[i] + char change; // has the set of sequences in subalignment changed? 0:no 1:yes + + + // Global weights? + if (par.wg==1) + { + for (k=0; k<N_in; k++) + for (i=1; i<=L; i++) w[k][i]=wg[k]; + } + else + { + + // Initialization + n = new(int*[L+2]); + for (j=1; j<=L; j++) n[j]=new(int[NAA+3]); + for (j=1; j<=L; j++) + for (a=0; a<NAA+3; a++) n[j][a]=0; + + ////////////////////////////////////////////////////////////////////////////////////////////// + // Main loop through alignment columns + for (i=1; i<=L; i++) // Calculate w[k][i] + { + change=0; + // Check all sequences k and update n[j][a] and ri[j] if necessary + for (k=0; k<N_in; k++) + { + if (!in[k]) continue; + if (X[k][i-1]>=ANY && X[k][i]<ANY) + { // ... if sequence k was NOT included in i-1 and has to be included for column i + change=1; + nseqi++; + for (int j=1; j<=L; j++) n[j][ (int)X[k][j]]++; + } + else if (X[k][i-1]<ANY && X[k][i]>=ANY) + { // ... if sequence k WAS included in i-1 and has to be thrown out for column i + change=1; + nseqi--; + for (int j=1; j<=L; j++) n[j][ (int)X[k][j]]--; + } + } //end for (k) + nseqs[i]=nseqi; + + // If subalignment changed: update weights w[k][i] and Neff[i] + if (change) + { + // Initialize weights and numbers of residues for subalignment i + ncol=0; + for (k=0; k<N_in; k++) w[k][i]=0.0; + + // sum wi[k] over all columns j and sequences k of subalignment + for (j=1; j<=L; j++) + { + // do at least a fraction MAXENDGAPFRAC of sequences in subalignment contain an end gap in j? + if (n[j][ENDGAP]>MAXENDGAPFRAC*nseqi) continue; + naa=0; for (a=0; a<20; a++) if(n[j][a]) naa++; + if (naa==0) continue; + ncol++; + for (k=0; k<N_in; k++) + { + if (in[k] && X[k][i]<ANY && X[k][j]<ANY) + { +// if (!n[j][ (int)X[k][j]]) {fprintf(stderr,"Error: Mi=%i: n[%i][X[%i]]=0! (X[%i]=%i)\n",i,j,k,k,X[k][j]);} + w[k][i]+=1.0/float(n[j][ (int)X[k][j] ]*naa); + } + } + } + + // Check whether number of columns in subalignment is sufficient + if (ncol<NCOLMIN) + // Take global weights + for (k=0; k<N_in; k++) + if(in[k]) {if(X[k][i]<ANY) w[k][i]=wg[k]; else w[k][i]=0.0;} + } + } + // end loop through alignment columns i + /////////////////////////////////////////////////////////////////////// + + // delete n[][] + for (j=1; j<=L; j++){ + delete[](n[j]); (n[j]) = NULL; + } + delete[](n); (n) = NULL; + + } + return; +} + +#ifdef CLUSTALO +/* @* Transfer + * + * take sequence data from Clustal and transfer it into + * hhalign accessible information (structure/class) + * + * Note that hhalign does not see all sequences/profiles + * but only sequences that are elements of the 2 profiles + * to be aligned. + * + * References to the required sequences are passed into hhalign + * through auxilliary pointers that are shallow copies of the + * sequence/profile data available to Clustal. + * + * Re-allocating memory for these auxilliary pointers + * would be desaterous, as it might detach the memory + * seen by Clustal. + */ +void +Alignment::Transfer(char **ppcProf, int iCnt){ + + /* @<variables local to Transfer@> */ + int iLen; /* length of profile */ + int k; /* generic iterator */ + + /* @<initialisation@> */ + N_in = iCnt; + N_filtered = N_ss = 0; + kss_dssp = ksa_dssp = kss_pred = kss_conf = -1; + kfirst = 0; + strcpy(longname, "unknown_long_seq_name"); + strcpy(name, "unknown_seq_name"); + strcpy(file, "unknown_file_name"); + n_display = iCnt; + + /* @<determine length of profile@> + all sequences in profile should have same length, + so only do it for 1st */ + for (iLen = 0; '\0' != ppcProf[0][iLen]; iLen++); + + /* @<allocate memory for sequences etc@> */ + for (k = 0; k < iCnt; k++){ +#define GOOD_MEASURE 1000 /* Temporary -- can be removed once rest in place */ + I[k] = new(short unsigned int[iLen+2+GOOD_MEASURE]); + X[k] = new(char[iLen+2+GOOD_MEASURE]); + seq[k] = new(char[iLen+2+GOOD_MEASURE]); + seq[k][0] = ' '; + seq[k][1] = '\0'; + if (NULL == ppcProf[k]){ + printf("%s:%d: Arena[%d]=NULL, cnt=%d\n", __FILE__, __LINE__, k, iCnt); + exit(-1); + } + strcat(seq[k], ppcProf[k]); + keep[k] = KEEP_CONDITIONALLY; + display[k] = KEEP_CONDITIONALLY; + sname[k] = new(char[GOOD_MEASURE]); + strcpy(sname[k], "unknown_sname"); + } /* (0 <= k < iCnt) */ + /* FIXME: Soeding always makes 1st sequence permanent */ + /*keep[0] = KEEP_ALWAYS; + display[k] = KEEP_ALWAYS;*/ +#if 1 + /* Believe that the first and last positions are + most important in stability of this algorithm. + Must make sure that at least 2 sequences with + residues in these positions are kept. + Think any sequence will do, but better to keep + the one with the longest 'contig' + */ + int iSeq; /* sequence iterator */ + int iHeadLen = 0, iHeadID = -1; /* length & ID of longest head contig */ + int iTailLen = 0, iTailID = -1; /* length & ID of longest head contig */ + int iCont = -1; + char *pcFind = NULL; + +#if 0 + printf("%s:%s:%d: NEW PROFILE (%d seq) ================\n", + __FUNCTION__, __FILE__, __LINE__, iCnt); +#endif + for (iSeq = 0; iSeq < iCnt; iSeq++){ +#if 0 + printf("%s:%s:%d: consider seq %d ------------------\n", + __FUNCTION__, __FILE__, __LINE__, iSeq); +#endif + pcFind = strchr(&seq[iSeq][1], '-'); + if (NULL == pcFind){ + /* no gap at all in this sequences, spans entire profile */ + iHeadID = iTailID = iSeq; + iHeadLen = iTailLen = iLen; + break; + } + iCont = (int)(pcFind - &seq[iSeq][1]); + if (iCont > iHeadLen){ + iHeadLen = iCont; + iHeadID = iSeq; + } + pcFind = strrchr(seq[iSeq], '-'); + iCont = iLen - (int)(pcFind - seq[iSeq]); + if (iCont > iTailLen){ + iTailLen = iCont; + iTailID = iSeq; + } + +#if 0 + printf("%s:%s:%d: seq %3d: len = %d(%d) %s\n", + __FUNCTION__, __FILE__, __LINE__, iSeq, iCont, iLen, seq[iSeq]); +#endif + } /* 0 <= iSeq < iCnt */ +#if 0 + printf("%s:%s:%d: seq %d is winner with head contig of %d, seq %d tail contig of %d\n" + , __FUNCTION__, __FILE__, __LINE__, iHeadID, iHeadLen, iTailID, iTailLen); +#endif + if ( (-1 == iHeadID) || (-1 == iTailID) ){ + printf("%s:%s:%d: profile has no leading and/or trailing residues (h=%d:t=%d:#=%d)\n", + __FUNCTION__, __FILE__, __LINE__, iHeadID, iTailID, iCnt); + } + else{ + keep[iHeadID] = KEEP_ALWAYS; + keep[iTailID] = KEEP_ALWAYS; + } +#endif + /* @= */ + return; + +} /* this is the end of Transfer() */ +#endif + +#ifdef CLUSTALO +/* @* Alignment::ClobberGlobal (eg: qali) + * + * Note: originally hhalign() was stand-alone code, + * there are a couple of GLOBAL (!) variables, + * which would have been destroyed on exit. + * However, now there is no 'exit' from hhalign(), + * and on re-entry the global variable must be clean again. + */ +void +Alignment::ClobberGlobal(void){ + + /* @<essentials@> + these are essential to re-set (as some of them are used as flags) */ + for(int k=0; k<N_in; k++) + { + delete[] sname[k]; sname[k] = NULL; + delete[] seq[k]; seq[k] = NULL; + delete[] X[k]; X[k] = NULL; + delete[] I[k]; I[k] = NULL; + } + delete[] nres; nres = NULL; + delete[] first; first = NULL; + delete[] last; last = NULL; + delete[] ksort; ksort = NULL; + N_in = N_filtered = n_display = 0; + L = 0; + kss_dssp = ksa_dssp = kss_pred = kss_conf = kfirst = -1; + + /* @<re-set but keep memory@> + do not free the memory but re-set content */ + longname[0] = '\0'; //delete[] longname; longname = NULL; + keep[0] = '\0'; //delete[] keep; keep = NULL; + display[0] = '\0'; //delete[] display; display = NULL; + wg[0] = 0; //delete[] wg; wg = NULL; + nseqs[0] = 0; //delete[] nseqs; nseqs = NULL; + name[0]='\0'; + fam[0]='\0'; + file[0]='\0'; + //delete[] sname; sname = NULL; + //delete[] seq; seq = NULL; + //delete[] X; X = NULL; + //delete[] I; I = NULL; + //delete[] l; l = NULL; + + /* @= */ + return; +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhalignment.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,129 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhalignment.h 154 2010-11-09 18:29:05Z fabian $ + */ + +// hhalignment.h + +class Alignment +{ +public: + int L; // number of match states of alignment + int N_in; // total number of sequences in alignment + int N_filtered; /* number of sequences after sequence identity + filtering */ + int N_ss; // number of >ss_ or >sa sequences + + int kss_dssp; /* index of sequence with secondary structure + by dssp -1:no >ss_dssp line found */ + int ksa_dssp; /* index of sequence with solvent accessibility + by dssp -1:no >sa_dssp line found */ + int kss_pred; /* index of sequence with predicted secondary + structure -1:no >ss_pred line found */ + int kss_conf; /* index of sequence with confidence values of + prediction -1:no >ss_conf line found */ + int kfirst; // index of first real sequence + + char* longname; /* Full name of first sequence of original alignment + (NAME field) */ + char name[NAMELEN]; // HMM name = first word in longname in lower case + char fam[NAMELEN]; // family ID (derived from name) (FAM field) + char file[NAMELEN]; /* Rootname (w/o path, with extension) of alignment + file that is used to construct the HMM */ + + int n_display; /* number of sequences to be displayed + (INCLUDING >ss_pred, >ss_conf, >ss_dssp sequences) */ + char** sname; // names of display sequences (first seq=0, first char=0) + char** seq; // residues of display sequences (first char=1) + int* l; // l[i] = position of i'th match state in alignment + + char* keep; /* keep[k]=1 if sequence is included in amino acid + frequencies; 0 otherwise (first=0) */ + + double *pdExWeight; /* external sequence weight as given by tree FIXME (FS) */ + + Alignment(int maxseq=MAXSEQ, int maxres=/*MAXRES*/par.maxResLen); + ~Alignment(); + + // Read alignment into X (uncompressed) in ASCII characters + void Read(FILE* inf, char infile[NAMELEN], char* line=NULL); +#ifdef CLUSTALO + void Transfer(char **ppcProf, int iCnt); + void ClobberGlobal(); +#endif + + /* Convert ASCII to numbers between 0 and 20, throw out all insert states, + record their number in I[k][i] and store sequences to be displayed + in sname[k] and seq[k] */ + void Compress(const char infile[NAMELEN]); + + // Apply sequence identity filter + inline int FilterForDisplay(int max_seqid, int coverage=0, int qid=0, float qsc=0, int N=0); + inline int Filter(int max_seqid, int coverage=0, int qid=0, float qsc=0, int N=0); + int Filter2(char keep[], int coverage, int qid, float qsc, int seqid1, int seqid2, int Ndiff); + + bool FilterNeff(); /* MR1 */ + float filter_by_qsc(float qsc, char* dummy); /* MR1 */ + + // Filter alignment for min score per column with core query profile, defined by min_coverage_core and min_seqid_core + int HomologyFilter(int coverage_core, float qsc_core, float coresc); + + // Calculate AA frequencies q.p[i][a] and transition probabilities q.tr[i][a] from alignment + void FrequenciesAndTransitions(HMM& q, char* in=NULL); + + // Calculate freqs q.f[i][a] and transitions q.tr[i][a] (a=MM,MI,MD) with pos-specific subalignments + void Amino_acid_frequencies_and_transitions_from_M_state(HMM& q, char* in); + + // Calculate transitions q.tr[i][a] (a=DM,DD) with pos-specific subalignments + void Transitions_from_D_state(HMM& q, char* in); + + // Calculate transitions q.tr[i][a] (a=DM,DD) with pos-specific subalignments + void Transitions_from_I_state(HMM& q, char* in); + + // Write alignment without insert states to alignment file + void WriteWithoutInsertsToFile(char* alnfile); + + // Write alignment to alignment file + void WriteToFile(char* alnfile, const char format[]=NULL); + + // Read a3m slave alignment of hit from ta3mfile and merge into (query) master alignment + void MergeMasterSlave(Hit& hit, char ta3mfile[]); + + // Read a3m alignment of hit from ta3mfile and merge-combine with query alignment + void Merge(Hit& hit, char ta3mfile[]); + + // Add a sequence to Qali + void AddSequence(char Xk[], int Ik[]=NULL); + + // Determine matrix of position-specific weights w[k][i] for multiple alignment + void GetPositionSpecificWeights(float* w[]); + + char readCommentLine; // Set to 1, if a comment line with '#' is read /* MR1 */ + +private: + char** X; // X[k][i] contains column i of sequence k in alignment (first seq=0, first char=1) (0-3: ARND ..., 20:X, 21:GAP) + short unsigned int** I; // I[k][i] contains the number of inserts AFTER match state i (first=0) + char* display; // display[k]=1 if sequence will be displayed in output alignments; 0 otherwise (first=0) + float* wg; // w[k] = global weight of sequence k + int* nseqs; // number of sequences in subalignment i (only for DEBUGGING) + int* nres; // number of residues in sequence k + int* first; // first residue in sequence k + int* last; // last residue in sequence k + int* ksort; // index for sorting sequences: X[ksort[k]] + int FilterWithCoreHMM(char in[], float coresc, HMM& qcore); +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhdecl-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,243 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhdecl-C.h 227 2011-03-28 17:03:09Z fabian $ + */ + +///////////////////////////////////////////////////////////////////////////////////// +//// Constants +///////////////////////////////////////////////////////////////////////////////////// + +const char VERSION_AND_DATE[]="version 1.5.1.3 (November 2008)"; +const char REFERENCE[]="Soding, J. Protein homology detection by HMM-HMM comparison. Bioinformatics 2005, 21, 951-960.\n"; +const char COPYRIGHT[]="(C) Johannes Soeding (see LICENSE file)\n"; +const int MAXSEQ=65535; //max number of sequences in input alignment (must be <~30000 on cluster nodes) +#if 0 +const int MAXCOL=32765; //max number of residues in input files; must be <= LINELEN and >= MAXRES +const int MAXRES=15002; //max number of columns in HMM; must be <= LINELEN +#else +const int MAXCOL=2/*131072*/; //max number of residues in input files; must be <= LINELEN and >= MAXRES +const int MAXRES=1/*65536*/; //max number of columns in HMM; must be <= LINELEN +#endif +const int LINELEN=262144; //max length of line read in from input files; must be >= MAXCOL +const int MAXSEQDIS=3; //10238;//max number of sequences stored in 'hit' objects and displayed in output alignment +const int IDLEN=255; //max length of scop hierarchy id and pdb-id +const int DESCLEN=32765;//max length of sequence description (longname) +const int NAMELEN=511; //max length of file names etc. +const int MAXOPT=127; //Maximum number of options to be read in from .hhconfig or command line +const int NAA=20; //number of amino acids (0-19) +const int NTRANS=10; //number of transitions recorded in HMM (M2M,M2I,M2D,I2M,I2I,D2M,D2D,M2M_GAPOPEN,GAPOPEN,GAPEXTD) +const int NCOLMIN=10; //min number of cols in subalignment for calculating pos-specific weights w[k][i] +const int ANY=20; //number representing an X (any amino acid) internally +const int GAP=21; //number representing a gap internally +const int ENDGAP=22; //Important to distinguish because end gaps do not contribute to tansition counts +const int HMMSCALE=1000;//Scaling number for log2-values in HMMs +const int NFAMMAX=5119; //Size of hash for counting number of HMMs in each family +const int MAXPROF=32766;//Maximum number of HMM scores for fitting EVD +const float MAXENDGAPFRAC=0.1; //For weighting: include only columns into subalignment i that have a max fraction of seqs with endgap +const float SMIN= 20.; //Minimum score of hit needed to search for another repeat of same profile: p=exp(-(4-mu)/lamda)=0.01 +const float LAMDA=0.388; //lamda in score EVD used for -local mode in length correction: S = S-log(Lq*Lt)/LAMDA) +const float LAMDA_GLOB=0.42; //lamda in score EVD used for -global mode +const float PMAX=1E-2; //Maximum single-repeat p-value that can contribute to whole-protein p-value +const float MINEVALEXCL=0.5; //above this E-value from first ML fit hits are not used for final ML fit of EVD +const int SELFEXCL=3; // exclude self-alignments with j-i<SELFEXCL +const float PLTY_GAPOPEN=6.0f; // for -qsc option (filter for min similarity to query): 6 bits to open gap +const float PLTY_GAPEXTD=1.0f; // for -qsc option (filter for min similarity to query): 1 bit to extend gap +const int MINCOLS_REALIGN=6; // hits with MAC alignments with fewer matched columns will be deleted in hhsearch hitlist + +enum transitions {M2M,M2I,M2D,I2M,I2I,D2M,D2D,M2M_GAPOPEN,GAPOPEN,GAPEXTD}; // index for transitions within a HMM +enum pair_states {STOP=0,SAME=1,GD=2,IM=3,DG=4,MI=5,MS=6,ML=7,SM=8,LM=9,MM=10}; + +// const char aa[]="ARNDCQEGHILKMFPSTWYVX-"; +//Amino acids Sorted by alphabet -> internal numbers a +// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +// A C D E F G H I K L M N P Q R S T V W Y X +const int s2a[]={ 0, 4, 3, 6,13, 7, 8, 9,11,10,12, 2,14, 5, 1,15,16,19,17,18,20}; +//Internal numbers a for amino acids -> amino acids Sorted by alphabet: +// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 +// A R N D C Q E G H I L K M F P S T W Y V X +const int a2s[]={ 0,14,11, 2, 1,13, 3, 5, 6, 7, 9, 8,10, 4,12,15,16,18,19,17,20}; + +// Secondary structure +const int NDSSP=8; //number of different ss states determined by dssp: 0-7 (0: no state available) +const int NSSPRED=4; //number of different ss states predicted by psipred: 0-3 (0: no prediction availabe) +const int MAXCF=11; //number of different confidence values: 0-10 (0: no prediction availabe) +const int NSA=7; //number of classes relative solvent accesiblity (0:no coord, 1:<2%, 2:<14%, 3:<33%, 4:<55%, 5:>55%, 6:S-S bridge) + +///////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////// + +// Input parameters +class Parameters // Parameters for gap penalties and pseudocounts +{ +public: + char** argv; //command line parameters + char argc; //dimension of argv + + char infile[NAMELEN]; // input filename + char outfile[NAMELEN]; // output filename + char pairwisealisfile[NAMELEN]; // output filename with pairwise alignments + char alnfile[NAMELEN]; // name of output alignment file in A3M format (for iterative search) + char hhmfile[NAMELEN]; // name of output HHM file for (iterative search) + char psifile[NAMELEN]; // name of output alignmen file in PSI-BLAST format (iterative search) + char scorefile[NAMELEN];// table of scores etc for all HMMs in searched database + char tfile[NAMELEN]; // template filename (in hhalign) + char buffer[NAMELEN]; // buffer to write results for other programs into + char pngfile[NAMELEN]; // png image file for dotplot + char wfile[NAMELEN]; // weights file generated with hhformat + char* blafile; // output of 'blastpgp -m 8' with PSI-BLAST E-values for HHblast + char* dbfiles; // database filenames, separated by colons + char* exclstr; // optional string containing list of excluded residues, e.g. '1-33,97-168' + int aliwidth; // number of characters per line in output alignments for HMM search + char append; // append to output file? (hhmake) + float p; // minimum probability for inclusion in hit list and alignments + float E; // maximum E-value for inclusion in hit list and alignment list + float e; // maximum E-value for inclusion in output alignment, output HMM, and PSI-BLAST checkpoint model + int Z; // max number of lines in hit list + int z; // min number of lines in hit list + int B; // max number of lines in alignment list + int b; // min number of lines in alignment list + int showcons; // 0: don't show consensus sequence in alignments 1:show + int showdssp; // 0: don't show consensus sequence in alignments 1:show + int showpred; // 0: don't show consensus sequence in alignments 1:show + int nseqdis; // maximum number of query or template sequences in output alignments + char cons; // if set to 1, include consensus as first representative sequence of HMM + char mark; // which sequences to mark for display in output alignments? 0: auto; 1:all + char outformat; // 0: hhr 1: FASTA 2:A2M 3:A3M + char mode; // + //0:MAC alignment, master-slave 1:MAC blending, master-slave 2:MAC alignment, combining + + int max_seqid; // Maximum sequence identity with all other sequences in alignment + int qid; // Minimum sequence identity with query sequence (sequence 0) + float qsc; // Minimum score per column with query sequence (sequence 0) + int coverage; // Minimum coverage threshold + int Ndiff; // Pick Ndiff most different sequences that passed the other filter thresholds + int coverage_core; // Minimum coverage for sequences in core alignment + float qsc_core; // Minimum sequence identity with query for sequences in core alignment + float coresc; // Minimum score per column with core alignment (HMM) + + int maxResLen; /* length of longest sequence/profile, FS 2010-11-05 */ + int maxColCnt; /* maximum number of columns in HMM, FS 2010-11-05 */ + + int Mgaps; // Maximum percentage of gaps for match states + int M; // Match state assignment by 1:upper/lower case 2:percentage rule 3:marked sequence + char matrix; // Subst.matrix 0: Gonnet, 1: HSDM, 2: BLOSUM50 + + char wg; // 0: use local sequence weights 1: use local ones + double *pdWg1; /* seq weights 1st profile, derived from tree */ + double *pdWg2; /* seq weights 2nd profile, derived from tree */ + + char pcm; // 0:no pseudocounts, 1:pos-specific pcs, 2:PSIBLAST pcs + /* pseudo-count parameters for MAC*/ + float pca; // Pseudocount matrix = (1-tau(i))*I + tau(i)*S + float pcb; // tau(i) = pca/(1 + ((Neff-1)/pcb)^pcc + float pcc; // + float pcw; // Decrease pseudocounts for conserved columns + + /* gap parameters for MAC*/ + float gapb; // Diversity threshold for adding pseudocounts to transitions from M state + float gapd; // Gap open penalty factor for deletions + float gape; // Gap extend penalty: factor to multiply hmmer values (def=1) + float gapf; // factor for increasing/reducing the gap opening penalty for deletes + float gapg; // factor for increasing/reducing the gap opening penalty for inserts + float gaph; // factor for increasing/reducing the gap extension penalty for deletes + float gapi; // factor for increasing/reducing the gap extension penalty for inserts + + /* pseudo-count parameters for Viterbi, FS, r226->r227 */ + float pcaV; // Pseudocount matrix = (1-tau(i))*I + tau(i)*S + float pcbV; // tau(i) = pca/(1 + ((Neff-1)/pcb)^pcc + float pccV; // + float pcwV; // Decrease pseudocounts for conserved columns + + /* gap parameters for Viterbi, FS, r226->r227 */ + float gapbV; // Diversity threshold for adding pseudocounts to transitions from M state + float gapdV; // Gap open penalty factor for deletions + float gapeV; // Gap extend penalty: factor to multiply hmmer values (def=1) + float gapfV; // factor for increasing/reducing the gap opening penalty for deletes + float gapgV; // factor for increasing/reducing the gap opening penalty for inserts + float gaphV; // factor for increasing/reducing the gap extension penalty for deletes + float gapiV; // factor for increasing/reducing the gap extension penalty for inserts + + float egq; // penalty for end gaps when query not fully covered + float egt; // penalty for end gaps when template not fully covered + + float neffa; // Coefficients to estimate Neff-dependent weights for HMM merging procedure + float neffb; // Coefficients to estimate Neff-dependent weights for HMM merging procedure + + char ssgap; // 1: add secondary structure-dependent gap penalties 0:off + float ssgapd; // secondary structure-dependent gap-opening penalty (per residue) + float ssgape; // secondary structure-dependent gap-extension penalty (per residue) + char ssgapi; // max. number of inside-integer(ii); gap-open-penalty= -ii*ssgapd + + char ssm; // SS comparison mode: 0:no ss scoring 1:ss scoring AFTER alignment 2:ss score in column score + float ssw; // SS weight as compared to column score + float ssa; // SS state evolution matrix M1 = (1-ssa)*I + ssa*M0 + + char loc; // 0: local alignment (wrt. query), 1: global alignement + char forward; // 0:Viterbi algorithm 1:Forward algorithm 2: MAC + char realign; // realign database hits to be displayed with MAC algorithm + char altali; // find up to this many possibly overlapping alignments + int columnscore; // 0: no aa comp corr 1: 1/2(qav+tav) 2: template av freqs 3: query av freqs 4:... + float corr; // Weight of correlations between scores with |i-j|<=4 + float shift; // Score offset for match-match states + float mact; // Score threshold (negative offset) in MAC alignment + + char calibrate; // calibration of query HMM? 0:no, 1:yes (write lamda,mu into query profile) + char calm; // derive P-values from: 0:query calibration 1:template calibration 2:both + int opt; // for optimization: compare only every opt'th negative; 0: mode off + int readdefaultsfile ; // read defaults file ./.hhdefaults or HOME/.hhdefaults? + int min_overlap; // all cells of dyn. programming matrix with L_T-j+i or L_Q-i+j < min_overlap will be ignored + int hitrank; // rank of hit to be printed as a3m alignment + char notags; // neutralize His-tags, FLAG tags, C-myc tags? + unsigned int maxdbstrlen; // maximum length of database string to be printed in 'Command' line of hhr file + + char trans; // 0: normal pairwise scoring; 1:transitive scoring + float Emax_trans; // max E-value for intermediate HMMs in transitive scoring (i.e. l is intermediate HMM if E_lq, E_lk <Emax_trans) + float wtrans; // Ztot[k] = Zq[k] + wtrans * (Zforward[k]+Zreverse[k]) + + + // SCRAP THE FOLLOWING VARIABLES? + + float wstruc; // weight of structure scores + char repmode; // 1:repeat identification: multiple hits not treated as independent 0: repeat mode off + + int idummy; + int jdummy; + float fdummy; +}; + +///////////////////////////////////////////////////////////////////////////////////// +//// Global variable declarations +///////////////////////////////////////////////////////////////////////////////////// + +char v=1; // 1: show only warnings 2:verbose mode +Parameters par; +char program_name[NAMELEN]; //name of program executed (e.g. hhmake of hhsearch) + +// substitution matrix flavours +float P[21][21]; // P[a][b] = combined probability for a aligned to b +float R[21][21]; // R[a][b]=P[a][b]/p[b]=P(a|b); precalculated for pseudocounts +float Sim[21][21]; // Similarity matrix Sim[a][b]: how similar are a and b? +float S[21][21]; // Substitution score matrix S[a][b] = log2(Pab/pa/pb) +float pb[21]; // pb[a] = background amino acid probabilities for chosen substitution matrix +float qav[21]; // qav[a] = background amino acid probabilities for query HMM (needed for rate matrix rescaling) + +// secondary structure matrices +float S73[NDSSP][NSSPRED][MAXCF]; // P[A][B][cf] = log2 P(A,B,cf)/P(A)/P(B,cf) +float S33[NSSPRED][MAXCF][NSSPRED][MAXCF]; // P[B][cf][B'][cf'] = log2 sum_B' P(A,B',cf)/P(A)/P(B,cf) * P_b(B'|B) +// float S77[NDSSP][DSSP]; // P[A][B] = log2 P(A,B)/P(A)/P(B) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhfullalignment-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,634 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhfullalignment-C.h 230 2011-04-09 15:37:50Z andreas $ + */ + +// hhfullalignment.C + +#ifndef MAIN +#define MAIN +#include <iostream> // cin, cout, cerr +#include <fstream> // ofstream, ifstream +#include <stdio.h> // printf +#include <stdlib.h> // exit +#include <string> // strcmp, strstr +#include <math.h> // sqrt, pow +#include <limits.h> // INT_MIN +#include <float.h> // FLT_MIN +#include <time.h> // clock +#include <ctype.h> // islower, isdigit etc +using std::ios; +using std::ifstream; +using std::ofstream; +using std::cout; +using std::cerr; +using std::endl; +#include "util-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "list.h" // list data structure +#include "hash.h" // hash data structure +#include "hhdecl-C.h" // constants, class +#include "hhutil-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "hhhmm.h" // class HMM +#include "hhalignment.h" // class Alignment +#include "hhhit.h" +#include "hhhalfalignment.h" +#endif + + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// Methods of class FullAlignment +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////////// +// Output Results: use classes HalfAlignment and FullAlignment +// +// Example: +// Each column list contains at least a match state +// Insert states between the match states are omitted +// +// step 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 +// i 0 0 1 2 3 4 5 6 7 8 9 9 9 9 10 11 12 13 14 +// +// Q ~ ~ X X X X X X X X X ~ ~ ~ X X X X X +// T Y Y Y Y Y Y Y Y ~ Y Y Y Y Y Y Y Y ~ ~ +// +// j 7 8 9 10 11 12 13 14 14 15 16 17 18 19 20 21 22 22 22 +// state IM IM MM MM MM MM MM MM DG MM MM GD GD GD MM MM MM MI MI +// +// nsteps=19 +// + + +////////////////////////////////////////////////////////////////////////////// +// Constructor +FullAlignment::FullAlignment(int maxseqdis) +{ + qa = new HalfAlignment(maxseqdis); + ta = new HalfAlignment(maxseqdis); + for (int h=0; h<LINELEN-1; h++) symbol[h]=' '; +} + +////////////////////////////////////////////////////////////////////////////// +// Destructor +FullAlignment::~FullAlignment() +{ + delete qa; qa = NULL; + delete ta; ta = NULL; +} + +////////////////////////////////////////////////////////////////////////////// +// Free memory of arrays s[][], l[][], and m[][] in HalfAlignment +void FullAlignment::FreeMemory() +{ + qa->Unset(); + ta->Unset(); +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Add columns for match (and delete) states. + */ +void +FullAlignment::AddColumns(int i, int j, char prev_state, char state, float S) +{ + switch(state) + { + case MM: //MM pair state (both query and template in Match state) + AddGaps(); //fill up gaps until query and template parts have same length + symbol[qa->pos] =ScoreChr(S); + qa->AddColumn(i); + ta->AddColumn(j); + qa->AddInsertsAndFillUpGaps(i); + ta->AddInsertsAndFillUpGaps(j); + break; + + case GD: //-D state + if (prev_state==DG) AddGaps(); + symbol[ta->pos]='Q'; + ta->AddColumn(j); //query has gap -> add nothing + ta->AddInsertsAndFillUpGaps(j); + break; + case IM: //IM state + if (prev_state==MI) AddGaps(); + symbol[ta->pos]='Q'; + ta->AddColumn(j); //query has gap -> add nothing + ta->AddInsertsAndFillUpGaps(j); + break; + + case DG: //D- state + if (prev_state==GD) AddGaps(); + symbol[qa->pos]='T'; + qa->AddColumn(i);//template has gap -> add nothing + qa->AddInsertsAndFillUpGaps(i); + break; + case MI: //MI state + if (prev_state==IM) AddGaps(); + symbol[qa->pos]='T'; + qa->AddColumn(i);//template has gap -> add nothing + qa->AddInsertsAndFillUpGaps(i); + break; + } +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Fill up gaps until query and template parts have same length + */ +void +FullAlignment::AddGaps() +{ + while (qa->pos<ta->pos) qa->AddChar('.'); + while (ta->pos<qa->pos) ta->AddChar('.'); +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Build full alignment -> qa->s[k][h] and ta->s[k][h] + */ +void +FullAlignment::Build(HMM& q, Hit& hit) +{ + int step; + char prev_state=MM, state=MM; + int n; + int hh; + int k; + identities=0; // number of identical residues in query and template sequence + score_sim=0.0f;// substitution matrix similarity score between query and template + + ClearSymbols(); + + // Set up half-alignments + // n is the sequence index up to which sequences are prepared for display + n = imin( q.n_display,par.nseqdis+( q.nss_dssp>=0)+( q.nsa_dssp>=0)+( q.nss_pred>=0)+( q.nss_conf>=0)+( q.ncons>=0)); + qa->Set( q.name, q.seq, q.sname, n, q.L, q.nss_dssp , q.nss_pred , q.nss_conf, q.nsa_dssp, q.ncons, hit.L/*<--FS*/); + n = imin(hit.n_display,par.nseqdis+(hit.nss_dssp>=0)+(hit.nsa_dssp>=0)+(hit.nss_pred>=0)+(hit.nss_conf>=0)+(hit.ncons>=0)); + ta->Set(hit.name,hit.seq,hit.sname, n,hit.L,hit.nss_dssp,hit.nss_pred,hit.nss_conf,hit.nsa_dssp, hit.ncons, q.L/*<--FS*/); + + +// printf("HMM: %s\nstep nst i j state hq ht\n",hit.name); + +#ifdef CLUSTALO + if ((1 == hit.i1) && (1 == hit.j1)){ + /* do nothing */ + } + else if ((1 == hit.i1) && (1 != hit.j1)){ + for (int j = 1; j < hit.j1; j++){ + AddColumns(0, j, MM, IM, 0.0); + } + if (rLog.iLogLevelEnabled <= LOG_DEBUG){ + int iK, iL; + printf("%d: j1=%d -> temp has leading gaps\n", __LINE__, hit.j1); + for (iK = 0; iK < ta->n; iK++){ + //printf("T%d: %s\n", iK, ta->s[iK]); + for (iL = 0; iL < hit.j1; iL++){ + ta->s[iK][iL] = tolower(ta->s[iK][iL]); + } + } + } + } + else if ((1 != hit.i1) && (1 == hit.j1)){ + for (int i = 1; i < hit.i1; i++){ + AddColumns(i, 0, MM, MI, 0.0); + } + if (rLog.iLogLevelEnabled <= LOG_DEBUG){ + FILE *fp = rLog.prFP[LOG_DEBUG]; + + fprintf(fp, "%d: i1=%d -> query has leading gaps\n", __LINE__, hit.i1); + int iK, iL; + for (iK = 0; iK < qa->n; iK++){ + //printf("Q%d: %s\n", iK, qa->s[iK]); + for (iL = 0; iL < hit.i1; iL++){ + qa->s[iK][iL] = tolower(qa->s[iK][iL]); + } + } + } + } + else{ + printf("+-------------------------------+\n" + "| both sequences truncated left |\n" + "+-------------------------------+\n" + "i1 = %d, j1 = %d\n", hit.i1, hit.j1); + } +#endif + + for (step=hit.nsteps; step>=1; step--) + { + prev_state = state; + state = hit.states[step]; + + // Add column to alignment and compute identities and sequence-sequence similarity score + AddColumns(hit.i[step],hit.j[step],prev_state,state,hit.S[step]); + if (state==MM) + { + char qc=qa->seq[ q.nfirst][ qa->m[ q.nfirst][hit.i[step]] ]; + char tc=ta->seq[hit.nfirst][ ta->m[hit.nfirst][hit.j[step]] ]; + if (qc==tc) identities++; // count identical amino acids + score_sim += S[(int)aa2i(qc)][(int)aa2i(tc)]; + // fprintf(stderr,"%3i %3i %3i %3i %3i %1c %1c %6.2f %6.2f %6.2f %6.2f \n",step,hit.nsteps,hit.i[step],hit.j[step],int(state),qc,tc,S[(int)aa2i(qc)][(int)aa2i(tc)],score_sim,hit.P_posterior[step],hit.sum_of_probs); //DEBUG + } + } + +#ifdef CLUSTALO + if ((qa->L == hit.i2) && (ta->L == hit.j2)){ + /* do nothing */ + } + else if ((qa->L == hit.i2) && (ta->L != hit.j2)){ + for (int j = hit.j2+1; j <= ta->L; j++){ + AddColumns(0, j, MM, IM, 0.0); + } + if (rLog.iLogLevelEnabled <= LOG_DEBUG){ + int iK; + unsigned int uiL; + FILE *fp = rLog.prFP[LOG_DEBUG]; + + fprintf(fp, "%d: j2=%d (%d) -> temp has trailing gaps\n", __LINE__, hit.j2, ta->L); + for (iK = 0; iK < ta->n; iK++){ + //printf("T%d: %s\n", iK, ta->s[iK]+strlen(ta->s[iK])-(ta->L-hit.j2)); + for (uiL = strlen(ta->s[iK])-(ta->L-hit.j2); uiL < strlen(ta->s[iK]); uiL++){ + ta->s[iK][uiL] = tolower(ta->s[iK][uiL]); + } + } + } + } + else if ((qa->L != hit.i2) && (ta->L == hit.j2)){ + for (int i = hit.i2+1; i <= qa->L; i++){ + AddColumns(i, 0, MM, MI, 0.0); + } + if (rLog.iLogLevelEnabled <= LOG_DEBUG){ + int iK; + unsigned int uiL; + printf("%d: i2=%d (%d)-> query has trailing gaps\n", __LINE__, hit.i2, qa->L); + for (iK = 0; iK < qa->n; iK++){ + //printf("Q%d: %s\n", iK, qa->s[iK]+strlen(qa->s[iK])-(qa->L-hit.i2)); + for (uiL = strlen(qa->s[iK])-(qa->L-hit.i2); uiL < strlen(qa->s[iK]); uiL++){ + qa->s[iK][uiL] = tolower(qa->s[iK][uiL]); + } + } + } + } + else{ + printf("+--------------------------------+\n" + "| both sequences truncated right |\n" + "+--------------------------------+\n" + "i2 = %d != %d = qa->L, j2 = %d != %d = ta->L\n", + hit.i2, qa->L, hit.j2, ta->L); + } + +#endif + + AddGaps(); //fill up gaps until query and template parts have same length + qa->AddChar('\0'); + ta->AddChar('\0'); + + // Change gap symbol '.' (gap aligned to insert) to '~' if one HMM has gap with respect to other HMM + for (hh=1; hh<qa->pos; hh++) + { + if (symbol[hh]=='Q') + { + // Gap in query (IM or GD state) + symbol[hh]=' '; + for (k=0; k<qa->n; k++) if (qa->s[k][hh]=='.') qa->s[k][hh]='-'; + } + else if (symbol[hh]=='T') + { + // Gap in target (MI or DG state) + symbol[hh]=' '; + for (k=0; k<ta->n; k++) if (ta->s[k][hh]=='.') ta->s[k][hh]='-'; + } + } +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Print out header before full alignment + */ +void +FullAlignment::PrintHeader(FILE* outf, HMM& q, Hit& hit) +{ + fprintf(outf,">%s\n",hit.longname); + fprintf(outf,"Probab=%-.2f E-value=%-.2g Score=%-.2f Aligned_cols=%i Identities=%i%% Similarity=%-.3f Sum_probs=%.1f\n\n", + hit.Probab,hit.Eval,hit.score,hit.matched_cols,iround(100.0*identities/hit.matched_cols),score_sim/hit.matched_cols,hit.sum_of_probs); +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Print out full alignment in HHR format + */ +void +FullAlignment::PrintHHR(FILE* outf, Hit& hit) +{ + const int NLEN=14; //Length of name field in front of multiple alignment + int h=0; //counts position (column) in alignment + int hh=0; //points to column at start of present output block of alignment + int k; //counts sequences in query and template + //short unsigned int lq[MAXSEQ]; // lq[k] counts index of residue from query sequence k to be printed next; + short unsigned int *lq = NULL; // lq[k] counts index of residue from query sequence k to be printed next; + //short unsigned int lt[MAXSEQ]; // lt[k] counts index of residue from template sequence k to be printed next; + short unsigned int *lt = NULL; // lt[k] counts index of residue from template sequence k to be printed next; + char namestr[NAMELEN]; //name of sequence + int iq=hit.i1; // match state counter for query HMM (displayed in consensus line) + int jt=hit.j1; // match state counter for template HMM (displayed in consensus line) + + lq = new(short unsigned int[qa->n+2]); + lt = new(short unsigned int[ta->n+2]); + + for (k=0; k<qa->n; k++) lq[k]=qa->l[k][hit.i1]; + for (k=0; k<ta->n; k++) lt[k]=ta->l[k][hit.j1]; + + while (hh<ta->pos-1) // print alignment block + { + // Print query secondary structure sequences + for (k=0; k<qa->n; k++) + { + if (k==qa->nsa_dssp) continue; + if (!(k==qa->nss_dssp || k==qa->nsa_dssp || k==qa->nss_pred || k==qa->nss_conf)) continue; + if (k==qa->nss_dssp && !par.showdssp) continue; + if ((k==qa->nss_pred || k==qa->nss_conf) && !par.showpred) continue; + strncpy(namestr,qa->sname[k],NAMELEN-2); + namestr[NAMELEN-1]='\0'; + strcut(namestr); + fprintf(outf,"Q %-*.*s ",NLEN,NLEN,namestr); + for (h=hh; h<imin(hh+par.aliwidth,qa->pos-1); h++) fprintf(outf,"%1c",qa->s[k][h]); + fprintf(outf,"\n"); + } + + // Print query sequences + for (k=0; k<qa->n; k++) + { + if (k==qa->nss_dssp || k==qa->nsa_dssp || k==qa->nss_pred || k==qa->nss_conf || k==qa->ncons) continue; + strncpy(namestr,qa->sname[k],NAMELEN-2); + namestr[NAMELEN-1]='\0'; + strcut(namestr); + fprintf(outf,"Q %-*.*s %4i ",NLEN,NLEN,namestr,lq[k]); + for (h=hh; h<imin(hh+par.aliwidth,qa->pos-1); h++) + {fprintf(outf,"%1c",qa->s[k][h]); lq[k]+=WordChr(qa->s[k][h]);} //WordChr() returns 1 if a-z or A-Z; 0 otherwise + fprintf(outf," %4i (%i)\n",lq[k]-1,qa->l[k][qa->L+1]); + } + + // Print query consensus sequence + if (par.showcons && qa->ncons>=0) + { + k=qa->ncons; + strncpy(namestr,qa->sname[k],NAMELEN-2); + namestr[NAMELEN-1]='\0'; + strcut(namestr); + fprintf(outf,"Q %-*.*s %4i ",NLEN,NLEN,namestr,iq); + for (h=hh; h<imin(hh+par.aliwidth,qa->pos-1); h++) + { + if (qa->s[k][h]=='x') qa->s[k][h]='~'; + if (qa->s[k][h]!='-' && qa->s[k][h]!='.') iq++; + fprintf(outf,"%1c",qa->s[k][h]); + } + fprintf(outf," %4i (%i)\n",iq-1,qa->L); + } + + + // Print symbols representing the score + fprintf(outf," %*.*s ",NLEN,NLEN," "); + for (h=hh; h<imin(hh+par.aliwidth,qa->pos-1); h++) fprintf(outf,"%1c",symbol[h]); + fprintf(outf,"\n"); + + // Print template consensus sequence + if (par.showcons && ta->ncons>=0) + { + k=ta->ncons; + strncpy(namestr,ta->sname[k],NAMELEN-2); + namestr[NAMELEN-1]='\0'; + strcut(namestr); + fprintf(outf,"T %-*.*s %4i ",NLEN,NLEN,namestr,jt); + for (h=hh; h<imin(hh+par.aliwidth,ta->pos-1); h++) + { + if (ta->s[k][h]=='x') ta->s[k][h]='~'; + if (ta->s[k][h]!='-' && ta->s[k][h]!='.') jt++; + fprintf(outf,"%1c",ta->s[k][h]); + } + fprintf(outf," %4i (%i)\n",jt-1,ta->L); + } + // Print template sequences + for (k=0; k<ta->n; k++) + { + if (k==ta->nss_dssp || k==ta->nsa_dssp || k==ta->nss_pred || k==ta->nss_conf || k==ta->ncons) continue; + strncpy(namestr,ta->sname[k],NAMELEN-2); + namestr[NAMELEN-1]='\0'; + strcut(namestr); + fprintf(outf,"T %-*.*s %4i ",NLEN,NLEN,namestr,lt[k]); + for (h=hh; h<imin(hh+par.aliwidth,ta->pos-1); h++) + {fprintf(outf,"%1c",ta->s[k][h]); lt[k]+=WordChr(ta->s[k][h]);} //WordChr() returns 1 if a-z or A-Z; 0 otherwise + fprintf(outf," %4i (%i)\n",lt[k]-1,ta->l[k][ta->L+1]); + } + + // Print template secondary structure sequences + for (k=0; k<ta->n; k++) + { + if (k==ta->nsa_dssp) continue; + if (!(k==ta->nss_dssp || k==ta->nss_pred || k==ta->nss_conf)) continue; + if (k==ta->nss_dssp && !par.showdssp) continue; + if ((k==ta->nss_pred || k==ta->nss_conf)&& !par.showpred) continue; + strncpy(namestr,ta->sname[k],NAMELEN-2); + namestr[NAMELEN-1]='\0'; + strcut(namestr); + fprintf(outf,"T %-*.*s ",NLEN,NLEN,namestr); + for (h=hh; h<imin(hh+par.aliwidth,ta->pos-1); h++) fprintf(outf,"%1c",ta->s[k][h]); + fprintf(outf,"\n"); + } + + hh=h; + fprintf(outf,"\n\n"); + } + + delete[](lq); lq = NULL; + delete[](lt); lt = NULL; + +} /* this is the rnd of PrintHHR() */ + +////////////////////////////////////////////////////////////////////////////// +// Print out full alignment in A2M format +////////////////////////////////////////////////////////////////////////////// +#define TELOMER_PRINT 0 +void FullAlignment::PrintA2M(FILE* outf, Hit& hit) +{ + int k; //counts sequences in query and template + int h,hh; +#if TELOMER_PRINT + int iTelomerLeft = hit.i1 - hit.j1; + int iTelomerRght = (qa->L - hit.i2) - (ta->L - hit.j2); +#endif + + // Print query sequences + for (k=0; k<qa->n; k++) + { + if (k==qa->nsa_dssp) continue; + if (k==qa->nss_dssp && !par.showdssp) continue; + if ((k==qa->nss_pred || k==qa->nss_conf) && !par.showpred) continue; + if (k==qa->ncons && !par.showcons) continue; + fprintf(outf,">%s\n",qa->sname[k]); +#if TELOMER_PRINT + /* @<print left cut-off@> */ + if (iTelomerLeft > 0){ + for (int iI = 1; iI <= iTelomerLeft; iI++){ + fprintf(outf, "%1c", qa->seq[k][iI]); + } + /* this may be unnecessary */ + for (int iI = iTelomerLeft+1; iI < hit.i1; iI++){ + fprintf(outf, "%1c", qa->seq[k][iI]); + } + } + else { + for (int iI = iTelomerLeft; iI < 0; iI++){ + fprintf(outf, "%1c", '-'); + } + /* this may be unnecessary */ + /* think about it */ + } + /* @<print consensus@> */ + for (h = 0; qa->s[k][h] > 0; h++){ + fprintf(outf, "%1c", qa->s[k][h]); + } + /* @<print out rght cut-off@> */ + for (int iI = hit.i2+1; iI <= qa->L; iI++){ + fprintf(outf, "%1c", qa->seq[k][iI]); + } + for (int iI = 0; iI > iTelomerRght; iI--){ + fprintf(outf, "%1c", '-'); + } +#else + for (h=0,hh=-par.aliwidth; qa->s[k][h]>0; h++,hh++) + { + if (!hh) {fprintf(outf,"\n"); hh-=par.aliwidth;} + fprintf(outf,"%1c",qa->s[k][h]); + } +#endif + fprintf(outf,"\n"); + } + + // Print template sequences + for (k=0; k<ta->n; k++) + { + if (k==ta->nsa_dssp) continue; + if (k==ta->nss_dssp && !par.showdssp) continue; + if ((k==ta->nss_pred || k==ta->nss_conf) && !par.showpred) continue; + if (k==ta->ncons && !par.showcons) continue; + fprintf(outf,">%s\n",ta->sname[k]); +#if TELOMER_PRINT + /* @<print left cut-off@> */ + if (iTelomerLeft > 0){ + for (int iI = 1; iI <= iTelomerLeft; iI++){ + fprintf(outf, "%1c", '-'); + } + /* this may be unnecessary */ + for (int iI = iTelomerLeft+1; iI < hit.j1; iI++){ + fprintf(outf, "%1c", ta->seq[k][iI]); + } + } + else{ + for (int iI = 1; iI <= -iTelomerLeft; iI++){ + fprintf(outf, "%1c", ta->seq[k][iI]); + } + /* this may be unnecessary */ + /* think about it */ + } + /* @<print consensus@> */ + for (h = 0; ta->s[k][h] > 0; h++){ + fprintf(outf, "%1c", ta->s[k][h]); + } + + /* @<print out rght cut-off@> */ + for (int iI = hit.j2+1; iI <= ta->L; iI++){ + fprintf(outf, "%1c", ta->seq[k][iI]); + } + for (int iI = 0; iI < iTelomerRght; iI++){ + fprintf(outf, "%1c", '-'); + } + +#else + for (h=0,hh=-par.aliwidth; ta->s[k][h]>0; h++,hh++) + { + if (!hh) {fprintf(outf,"\n"); hh-=par.aliwidth;} + fprintf(outf,"%1c",ta->s[k][h]); + } +#endif + fprintf(outf,"\n"); + } + fprintf(outf,"\n"); + +} /* this is the end of PrintA2M() */ + +//////////////////////////////////////////////////////////////////////////// +/** + * @brief Print out full alignment in A2M format + */ +void +FullAlignment::PrintFASTA(FILE* outf, Hit& hit) +{ + // Transform sequences to uppercase and '.' to '-' + qa->ToFASTA(); + ta->ToFASTA(); + PrintA2M(outf,hit); +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Print out full alignment in A2M format + */ +void +FullAlignment::PrintA3M(FILE* outf, Hit& hit) +{ + // Remove all '.' from sequences + qa->RemoveChars('.'); + ta->RemoveChars('.'); + PrintA2M(outf,hit); +} + + +/* + * @* OverWriteSeqs() + */ +void +FullAlignment::OverWriteSeqs(char **ppcFirstProf, char **ppcSecndProf){ + + int iS, iR; + char cRes; + + for (iS = 0; iS < qa->n; iS++){ + for (iR = 0; iR < qa->pos; iR++){ + cRes = qa->s[iS][iR]; + ppcFirstProf[iS][iR] = ('.' == cRes) ? '-' : cRes; + + } /* 0 <= iR < qa.L */ + ppcFirstProf[iS][iR] = '\0'; + } /* 0 <= iS < qa.n */ + + for (iS = 0; iS < ta->n; iS++){ + for (iR = 0; iR < ta->pos; iR++){ + cRes = ta->s[iS][iR]; + ppcSecndProf[iS][iR] = ('.' == cRes) ? '-' : cRes; + + } /* 0 <= iR < ta.L */ + ppcSecndProf[iS][iR] = '\0'; + } /* 0 <= iS < ta.n */ + +} /* this is the end of OverWriteSeqs() */ + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhfullalignment.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,49 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhfullalignment.h 143 2010-10-14 13:11:14Z andreas $ + */ + +////////////////////////////////////////////////////////////////////////////// +// Class for output alignment of query against template sequences +////////////////////////////////////////////////////////////////////////////// + +class FullAlignment +{ +public: + FullAlignment(int maxseqdis=MAXSEQDIS); + ~FullAlignment(); + void FreeMemory(); + void Build(HMM& q, Hit& hit); + void PrintHeader(FILE* outf, HMM& q, Hit& hit); + void PrintHHR(FILE* outf, Hit& hit); + void PrintA2M(FILE* outf, Hit& hit); + void PrintFASTA(FILE* outf, Hit& hit); + void PrintA3M(FILE* outf, Hit& hit); + void OverWriteSeqs(char **ppcFirstProf, char **ppcSecndProf); + int identities; // number of identical residues in query and template sequence + float score_sim; // substitution matrix similarity score between query and template + +private: + HalfAlignment* qa; //query and template parts of the alignment + HalfAlignment* ta; //query and template parts of the alignment + char symbol[LINELEN]; //symbol[h] = symbol (= - . + |) indicating match score for col h of alignment + void ClearSymbols() {for (int h=0; h<LINELEN-1; h++) symbol[h]=' ';} + void AddColumns(int i, int j, char prev_state, char state, float S); + void AddGaps(); + int ScoreChr(float S) {return (S<-1.5?'=':(S<-0.5?'-':(S<0.5?'.':(S<1.5?'+':'|'))));} +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhfunc-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1216 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhfunc-C.h 199 2011-02-21 18:24:49Z fabian $ + */ + +/* + * Changelog: Michael Remmert made changes to hhalign stand-alone code + * FS implemented some of the changes on 2010-11-11 -> MR1 + * + * did not incorporate SS prediction PSIpred (yet); functions are: + * CalculateSS(3), + */ + + +// hhfunc.C + + +/** + * AddBackgroundFrequencies() + * + * @brief add background frequencies (derived from HMM) to + * sequence/profile + * + * @param[in,out] ppfFreq, + * [in] residue frequencies of sequence/profile, + * [out] overlayed with HMM background frequencies + * @param[in,out] ppfPseudoF, + * [in] residue frequencies+pseudocounts of sequence/profile, + * [out] overlayed with HMM background frequencies+pseudocounts + * @param[in] iSeqLen, + * length of sequence/profile (not aligned to HMM) + * @pram[in] prHMM, + * background HMM + * @param[in] ppcSeq, + * sequences/profile to be 'softened' + * @param[in] pcPrealigned, + * sequence aligned to HMM, this is not quite a consensus, + * it is identical to 1st sequence but over-writes gap information, + * if other sequences in profile have (non-gap) residues + * @param[in] iPreCnt + * number of sequences pre-aligned (pcPrealigned is 'consensus' of these sequences) + * @param[in] pcRepresent + * sequence representative of HMM, aligned to pcSeq0 + */ +void +AddBackgroundFrequencies(float **ppfFreq, float **ppfPseudoF, float **ppfPseudoTr, + int iSeqLen, hmm_light *prHMM, + char **ppcSeq, char *pcPrealigned, int iPreCnt, char *pcRepresent) +{ + + char *pcS = pcPrealigned; /* current residue in pre-aligned sequence */ + char *pcH = pcRepresent; /* current residue in pre-aligned HMM */ + int iS = 0; /* position in un-aligned sequence (corresponds to pcS) */ + int iH = 0; /* position in un-aligned HMM (corresponds to pcH) */ + int iA; /* residue iterator */ + int iT; /* transition state iterator */ + float fFWeight = 0.50 / sqrt((float)(iPreCnt)); /* weight of backgroud frequencies */ /* FIXME: tune value, 0.50 default */ + //float fFWeight = 0.75; + float fFThgiew = UNITY - fFWeight; /* weight of 'true' frequencies */ + float fGWeight = 0.50 / sqrt((float)(iPreCnt)); /* weight of backgroud transitions */ /* FIXME: tune value, 0.50 default */ + //float fGWeight = 0.50 /*/ (float)(iPreCnt)*/; /* weight of backgroud transitions */ /* FIXME: tune value, 0.50 default */ + float fGThgiew = UNITY - fGWeight; /* weight of 'true' transitions */ + float fAux; + /* zf1SeqTrans[] are the (phenomenological) transition probabilities (+ pseudo-counts) + for a single sequence. It is almost certain (0.99) to stay in a match state, and very + unlikely (0.05) to go from match to insertion/deletion */ + float zf1SeqTrans[] = {0.98, 0.01, 0.01, 0.25, 0.75, 0.25, 0.75}; + float zf1SeqInit[] = {0.98, 0.01, 0.01, 0.99, 0.01, 0.99, 0.01}; + float zf1SeqDel[] = {0.24, 0.01, 0.75, 0.01, 0.01, 0.01, 0.01}; + float zf1SeqRevrt[] = {0.98, 0.01, 0.01, 0.01, 0.01, 0.99, 0.01}; + + if ( (NULL == pcPrealigned) || (NULL == pcRepresent) ){ + /*printf("%s/%s:%d: WARNING HMM=NULL -- didn't think I would get here (carry on, no danger)\n", + __FUNCTION__, __FILE__, __LINE__);*/ + return; + } + + if (NULL == prHMM->p){ + printf("%s:%s:%d: WARNING -- Background Pseudocounts point to NULL\n" + "\tthis is not intended - don't add background but CONTINUE\n", + __FUNCTION__, __FILE__, __LINE__); + return; + + } + + /* FIXME: should be 0 (FS thinks) but -1 gives better results */ + iH = iS = 0/*-1*//*+1*/; + while ( ('\0' != *pcS) && ('\0' != *pcH) ){ + + if ( ('-' != *pcH) && ('-' != *pcS) ){ + iH++; + iS++; + +#if 0 + /* match state + * - HMM had a gap in previous position (now closed) + * FIXME: this does not really work */ + if ((iH > 0) && ('-' == *(pcH-1))){ + + for (iT = 0; iT < STATE_TRANSITIONS; iT++){ + ppfPseudoTr[iS-1][iT] = log2f(zf1SeqRevrt[iT]); + } + } +#endif + +#if 1 + /* do frequencies -- this is not really useful; + frequencies are derived from HMM + and contain already pseudocounts (PCs), + adding frequencies and then PCs will add PCs _twice_ + results are better than not to add them, + but not as good as PCs */ + for (iA = 0; iA < AMINOACIDS; iA++){ + fAux = fFThgiew * ppfFreq[iS][iA] + fFWeight * prHMM->f[iH][iA]; + ppfFreq[iS][iA] = fAux; + } +#endif + /* do pseudo-counts */ + for (iA = 0; iA < AMINOACIDS; iA++){ + fAux = + fFThgiew * ppfPseudoF[iS][iA] + fFWeight * prHMM->p[iH][iA]; + ppfPseudoF[iS][iA] = fAux; + } +#if 0 /* do state transitions */ + for (iT = 0; iT < STATE_TRANSITIONS; iT++){ +#if 1 + /* this is a very crude method, + which averages the logarithms of the transitions, + effectively performing a geometric mean - + this presumably violates normalisation. + however, results are surprisingly good */ + fAux = + fGThgiew * ppfPseudoTr[iS][iT] + + fGWeight * prHMM->tr[iH][iT]; + ppfPseudoTr[iS][iT] = fAux; +#else /* crude averaging */ + /* There are 2 things to consider: + (1) one should really blend the probabilities of + the transitions, however, by default we have + the logarithms thereof. + So must exponentiate, blend, and then take log again. + This is expensive, and does not seem to lead to better + results than blending the logarithms + (and violating normalisation) + (2) transition probabilities for a single sequence + are really easy, there are no insert/delete transitions. + However, there is a begin state that is different + from the main body. + But again, this does not seem to make a blind bit + of difference + */ + if (iS > 0){ + fAux = + fGThgiew * zf1SeqTrans[iT] + + fGWeight * prHMM->linTr[iH][iT]; + ppfPseudoTr[iS][iT] = log2f(fAux); + } + else { + fAux = + fGThgiew * zf1SeqInit[iT] + + fGWeight * prHMM->linTr[iH][iT]; + ppfPseudoTr[iS][iT] = log2f(fAux); + } +#endif /* mixing of linear/log */ + } /* 0 <= iT < STATE_TRANSITIONS */ +#endif /* did state transitions */ + } /* was Match -- neither HMM nor sequence have gap */ + + else if ('-' == *pcH){ + /* sequence opened up gap in HMM */ +#if 0 + if ((iH > 0) && ('-' != *(pcH-1)) && (iS > 0)){ + /* this is the first gap in HMM + * FIXME: this does not really work */ + for (iT = 0; iT < STATE_TRANSITIONS; iT++){ + ppfPseudoTr[iS-1][iT] = log2f(zf1SeqDel[iT]); + } + } + else { + /* do nothing, keep single sequence values exactly as they are*/ + } +#endif + iS++; + } + else if ('-' == *pcS){ + /* here the single sequence has a gap, + and the HMM (as a whole) does not. There may be individual gaps + in the HMM at this stage. By ignoring this we say that the HMM + dominates the overall behaviour - as in the M2M state as well + */ + iH++; + } + + pcH++; + pcS++; + + } /* !EO[seq/hmm] */ + + return; + +} /* this is the end of AddBackgroundFrequencies() */ + + + +/** + * ReadAndPrepare() + * + * @brief Read HMM input file or transfer alignment + * and add pseudocounts etc. + * + * @param[in] iRnPtype + * type of read/prepare + * enum {INTERN_ALN_2_HMM = 0, READ_ALN_2_HMM, READ_HMM_2_HMM}; + * @param[in] ppcProf + * alignment + * @param[in] iCnt + * number of seqs in alignment + * @param[in,out] prHMM, + * [in] if sequences read/prepared, [out] if HMM from file + * @param[in] pcPrealigned, + * (single) sequence aligned to background HMM + * @param[in] pcRepresent, + * sequence representing HMM aligned to individual sequence + * param[in] pdExWeights + * (external) sequence weights, derived from tree + * @param[in] infile + * name of file with HMM info (formerly also alignment) + * @param[out] q + * HMM structure with transition probabilities, residue frequencies etc + * @param[???] qali + * FIXME: what is qali? + * + * @return FAILURE on error, OK otherwise + */ +int +ReadAndPrepare(int iRnPtype, + char **ppcProf, int iCnt, hmm_light *prHMM, + char *pcPrealigned, char *pcRepresent, double *pdExWeights, + char* infile, HMM& q, Alignment* qali=NULL) { + + //#ifndef CLUSTALO_NOFILE + char path[NAMELEN]; + + /* NOTE: there are different scenarios: + + (i) ("" != infile) - read HMM from file, + transfer frequency/transition/pseudo-count (f/t/p) info into prHMM + + (ii) ('\0' != ppcProf[0]) - transfer sequence/alignment into q/qali, + don't save f/t/p into prHMM, + on the contrary, if prior f/t/p available then add it to q/qali, + this is only done if (1==iCnt) + + (iii) ('\0' == ppcProf[0]) - re-cycle old HMM information + recreate a HMM from previous data + */ + + /********************************/ + /*** (o) Recycle internal HMM ***/ + /********************************/ + if ( (INTERN_ALN_2_HMM == iRnPtype) && (iCnt <= 0) ){ + + /* NOTE: here we are writing into a HMM structure/class; + memory has been allocated for this in hhalign.cpp; + however, as iCnt<=0, there may not be memory for + prHMM->n_display sequences/names. + But then, there doesn't have to be. + At this stage we are just copying one HMM into another HMM, + sequences are irrelevant. The only sequence of (marginal) + interest is the consensus sequence */ + /* FIXME: check that prHMM is valid -- how? */ + + const int ciCons = 0; + const int ciNoof = ciCons+1; + const int ciInvalid = -1; + q.n_display = ciNoof; /* only consensus */ + q.sname = NULL; + q.ncons = ciCons; + q.nfirst = ciCons;//prHMM->nfirst; + q.nss_dssp = ciInvalid;//prHMM->nss_dssp; + q.nsa_dssp = ciInvalid;//prHMM->nsa_dssp; + q.nss_pred = ciInvalid;//prHMM->nss_pred; + q.nss_conf = ciInvalid;//prHMM->nss_conf; + q.L = prHMM->L; + q.N_in = prHMM->N_in; + q.N_filtered = prHMM->N_filtered; + /* NOTE: I (FS) think that only ever 1 sequence will be transferred here, + that is, the consensus sequence. However, we might want to allow + (in the future) to transfer more sequences, + hence the awkward for() loop */ +#if 0 + for (int i = prHMM->ncons+0; i < prHMM->ncons+q.n_display; i++){ + /* NOTE: In the original hhalign code the first position + is kept open ('\0'). This makes it difficult to use + string functions like strlen/strdup etc. + Insert a temporary gap (.) to facilitate string operations */ + char cHead = prHMM->seq[i][0]; + prHMM->seq[i][0] = '.'; + q.seq[i] = strdup(prHMM->seq[i]); + prHMM->seq[i][0] = q.seq[i][0] = cHead; + } +#else + { + char cHead = prHMM->seq[prHMM->ncons][0]; + prHMM->seq[prHMM->ncons][0] = '.'; + q.seq[q.ncons] = strdup(prHMM->seq[prHMM->ncons]); + prHMM->seq[prHMM->ncons][0] = q.seq[q.ncons][0] = cHead; + } +#endif + const int NEFF_SCORE = 10; /* FIXME: Magic Number */ + for (int i = 0; i < prHMM->L+1; i++){ + q.Neff_M[i] = prHMM->Neff_M[i]; + q.Neff_I[i] = prHMM->Neff_I[i]; + q.Neff_D[i] = prHMM->Neff_D[i]; + } + q.Neff_HMM = prHMM->Neff_HMM; + /* skip longname,name,file,fam,sfam,fold,cl */ + q.lamda = prHMM->lamda; + q.mu = prHMM->mu; + + HMMshadow rShadow = {0}; /* friend of HMM to access private members */ + rShadow.copyShadowToHMM(q, *prHMM); + + /* skip trans_lin,ss_dssp,sa_dssp,ss_pred,ss_conf,Xcons */ + /* pav already done in copyShadowToHMM */ + /* skip pnul */ + + return OK; + + + } /* INTERN_ALN_2_HMM && iCnt<=0 */ + + /******************************/ + /*** (i) Read HMM from file ***/ + /******************************/ + char line[LINELEN] = {0}; // input line + FILE *inf = NULL; + //if ( (0 != strcmp(infile,"")) /*&& (iCnt > 0)*/ ) + if ( (READ_HMM_2_HMM == iRnPtype) || (READ_ALN_2_HMM == iRnPtype)) { + + if (0 == strcmp(infile,"")){ + printf("%s:%s:%d:\n" + "\texpected to re %s from file but no file specified\n" + "" + , __FUNCTION__, __FILE__, __LINE__ + , (READ_HMM_2_HMM==iRnPtype?"HMM":"alignment")); + return FAILURE; + } + inf = fopen(infile, "r"); + if (!inf) OpenFileError(infile); + Pathname(path,infile); + + //} + //else { + //inf = stdin; + //if (v>=2) printf("Reading HMM / multiple alignment from standard input ...\n(To get a help list instead, quit and type %s -h.)\n",program_name); + //*path='\0'; + //} + + fgetline(line,LINELEN-1,inf); + } + + //if ( (0 != strcmp(infile,"")) && (iCnt > 0) ) + if ( (READ_HMM_2_HMM == iRnPtype) ){ + + if (0 == strcmp(infile,"")){ + printf("%s:%s:%d: expected to read HMM from file but no file-name\n", + __FUNCTION__, __FILE__, __LINE__); + } + + // Is infile a HMMER3 file? /* MR1 */ + if (!strncmp(line,"HMMER3",6)) + { + if (v>=2) { + cout<<"Query file is in HMMER3 format\n"; + cout<<"WARNING! Use of HMMER3 format as input results in dramatically loss of sensitivity!\n"; + } + + // Read 'query HMMER file + rewind(inf); + q.ReadHMMer3(inf,path); + + // Don't add transition pseudocounts to query!! + + // Generate an amino acid frequency matrix from f[i][a] with full pseudocount admixture (tau=1) -> g[i][a] + q.PreparePseudocounts(); + + // DON'T ADD amino acid pseudocounts to query: pcm=0! q.p[i][a] = f[i][a] + q.AddAminoAcidPseudocounts(0, par.pca, par.pcb, par.pcc); + + /* further down there is a q.Log2LinTransitionProbs + but only if (iCnt>0), however, we still need it it here (i think), + there is no danger of doing this twice, as trans_lin is checked + FIXME (FS, 2011-01-12) */ + /* further down there is a q.Log2LinTransitionProbs + but only if (iCnt>0), however, we still need it it here (i think), + there is no danger of doing this twice, as trans_lin is checked + FIXME (FS, 2011-01-12) */ + //if (par.forward >= 1) + { + q.Log2LinTransitionProbs(1.0); + } + + } + // ... or Is infile an old HMMER file? + else if (!strncmp(line,"HMMER",5)) { + if (v>=2) { + cout<<"Query file is in HMMER format\n"; + cout<<"WARNING! Use of HMMER format as input results in dramatically loss of sensitivity!\n"; + } + + // Read 'query HMMER file + q.ReadHMMer(inf,path); + if (v>=2 && q.Neff_HMM>11.0) + fprintf(stderr,"WARNING: HMM %s looks too diverse (Neff=%.1f>11). Better check the underlying alignment... \n",q.name,q.Neff_HMM); + + // Don't add transition pseudocounts to query!! + + // Generate an amino acid frequency matrix from f[i][a] with full pseudocount admixture (tau=1) -> g[i][a] + q.PreparePseudocounts(); + + // DON'T ADD amino acid pseudocounts to query: pcm=0! q.p[i][a] = f[i][a] + q.AddAminoAcidPseudocounts(0, par.pca, par.pcb, par.pcc); + + /* further down there is a q.Log2LinTransitionProbs + but only if (iCnt>0), however, we still need it it here (i think), + there is no danger of doing this twice, as trans_lin is checked + FIXME (FS, 2011-01-12) */ + //if (par.forward >= 1) + { + q.Log2LinTransitionProbs(1.0); + } + + } /* it was a HMMer file */ + + // ... or is it an hhm file? + else if (!strncmp(line,"NAME",4) || !strncmp(line,"HH",2)) { + + if (v>=2) cout<<"Query file is in HHM format\n"; + + // Rewind to beginning of line and read query hhm file + rewind(inf); + q.Read(inf,path); + if (v>=2 && q.Neff_HMM>11.0) + fprintf(stderr,"WARNING: HMM %s looks too diverse (Neff=%.1f>11). Better check the underlying alignment... \n",q.name,q.Neff_HMM); + + // Add transition pseudocounts to query -> q.p[i][a] + q.AddTransitionPseudocounts(); + + // Generate an amino acid frequency matrix from f[i][a] with full pseudocount admixture (tau=1) -> g[i][a] + q.PreparePseudocounts(); + + // Add amino acid pseudocounts to query: q.p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] + q.AddAminoAcidPseudocounts(); + + } /* it was a HHM file */ + else { + fprintf(stderr, "%s:%s:%d: Unknown HMM format in infile\n" + "infile=%s, #seq=%d\n" + , __FUNCTION__, __FILE__, __LINE__ + , infile, iCnt); + return FAILURE; + } + + /*fclose(inf);*/ + + /*** transfer class info to struct */ + prHMM->n_display = q.n_display; + /* ignore sname*/ + prHMM->seq = (char **)calloc((q.n_display+1), sizeof(char *)); + /* FIXME valgrind says bytes get lost in the above calloc during + * hmm-iteration + */ + for (int i = 0; i < q.n_display; i++){ + /* NOTE: In the original hhalign code the first position + is kept open ('\0'). This makes it difficult to use + string functions like strlen/strdup etc. + Insert a temporary gap (.) to facilitate string operations */ + char cHead = q.seq[i][0]; + q.seq[i][0] = '.'; + prHMM->seq[i] = strdup(q.seq[i]); + q.seq[i][0] = prHMM->seq[i][0] = cHead; + } + prHMM->ncons = q.ncons; + prHMM->nfirst = q.nfirst; + prHMM->nss_dssp = q.nss_dssp; + prHMM->nsa_dssp = q.nsa_dssp; + prHMM->nss_pred = q.nss_pred; + prHMM->nss_conf = q.nss_conf; + prHMM->L = q.L; + prHMM->N_in = q.N_in; + prHMM->N_filtered = q.N_filtered; + const int NEFF_SCORE = 10; /* FIXME: Magic Number */ + prHMM->Neff_M = (float *)calloc(prHMM->L+1, sizeof(float)); + prHMM->Neff_I = (float *)calloc(prHMM->L+1, sizeof(float)); + prHMM->Neff_D = (float *)calloc(prHMM->L+1, sizeof(float)); + /*for (int i = 0; i < prHMM->L+1; i++){ + prHMM->Neff_M[i] = prHMM->Neff_I[i] = prHMM->Neff_D[i] = NEFF_SCORE; + }*/ + prHMM->Neff_HMM = q.Neff_HMM; + /* skip longname,name,file,fam,sfam,fold,cl */ + prHMM->lamda = q.lamda; + prHMM->mu = q.mu; + + HMMshadow rShadow = {0}; /* friend of HMM to access private members */ + rShadow.copyHMMtoShadow(q); + + prHMM->f = (float **)calloc(prHMM->L+1, sizeof(float *)); + prHMM->g = (float **)calloc(prHMM->L+1, sizeof(float *)); + prHMM->p = (float **)calloc(prHMM->L+1, sizeof(float *)); + prHMM->tr = (float **)calloc(prHMM->L+1, sizeof(float *)); + prHMM->linTr = (float **)calloc(prHMM->L+1, sizeof(float *)); + for (int i = 0; i < prHMM->L+1; i++){ + prHMM->f[i] = (float *)calloc(AMINOACIDS, sizeof(float)); + prHMM->g[i] = (float *)calloc(AMINOACIDS, sizeof(float)); + prHMM->p[i] = (float *)calloc(AMINOACIDS, sizeof(float)); + for (int j = 0; j < AMINOACIDS; j++){ + prHMM->f[i][j] = (float)rShadow.f[i][j]; + prHMM->g[i][j] = (float)rShadow.g[i][j]; + prHMM->p[i][j] = (float)rShadow.p[i][j]; + } + prHMM->tr[i] = (float *)calloc(STATE_TRANSITIONS, sizeof(float)); + prHMM->linTr[i] = (float *)calloc(STATE_TRANSITIONS, sizeof(float)); + for (int j = 0; j< STATE_TRANSITIONS; j++){ + prHMM->tr[i][j] = (float)rShadow.tr[i][j]; + prHMM->linTr[i][j] = fpow2(rShadow.tr[i][j]); + } + } /*0 <= i < prHMM->L+1 */ + /* skip trans_lin,ss_dssp,sa_dssp,ss_pred,ss_conf,Xcons */ + for (int j = 0; j < AMINOACIDS; j++){ + prHMM->pav[j] = (float)rShadow.pav[j]; + } + /* skip pnul */ + + } /* have read HHM from file */ + /*else if ( ((NULL != ppcProf) && (iCnt > 0) && ('\0' != ppcProf[0][0])) || + ( (0 != strcmp(infile,"") && (0 == iCnt) )) )*/ + else if ( (INTERN_ALN_2_HMM == iRnPtype) || (READ_ALN_2_HMM == iRnPtype) ) { + + if ( (INTERN_ALN_2_HMM == iRnPtype) && + ( (NULL == ppcProf) || (iCnt <= 0) || ('\0' == ppcProf[0][0]) ) ){ + printf("%s:%s:%d: was expecting internal alignment but\n" + "\tppcProf=%p, #seq=%d, ppcProf[0][0]=%c\n" + , __FUNCTION__, __FILE__, __LINE__ + , ppcProf, iCnt, ppcProf[0][0]); + return FAILURE; + } + else if ( (READ_ALN_2_HMM == iRnPtype) && + (0 == strcmp(infile,"")) ){ + printf("%s:%s:%d: was expecting to read alignment from file but no filename\n" + , __FUNCTION__, __FILE__, __LINE__); + return FAILURE; + } + + /*******************************/ + /*** (ii) it is an alignment ***/ + /*******************************/ + /* transfer alignment information from clustal character array + into pali/q/t classes */ + /* + * NOTE that emissions in HMMer file format contain pseudo-counts. + * HHM file format does not contain emission pseudo-counts. + * the structure that stores background HMM information does contain pseudo-counts + */ + Alignment* pali; + if (qali==NULL){ + pali=new Alignment(iCnt); /* FIXME: pass in iCnt to get rid of MAXSEQ */ + } + else{ + pali=qali; + } + + if (par.calibrate) { + printf("\nError in %s: only HHM files can be calibrated.\n",program_name); + printf("Build an HHM file from your alignment with 'hhmake -i %s' and rerun hhsearch with the hhm file\n\n",infile); + exit(1); + } + + if (v>=2 && strcmp(infile,"stdin")) cout<<infile<<" is in A2M, A3M or FASTA format\n"; + + /* Read alignment from infile into matrix X[k][l] as ASCII + (and supply first line as extra argument) */ + //if (iCnt > 0) + if (INTERN_ALN_2_HMM == iRnPtype){ + pali->Transfer(ppcProf, iCnt); + } + //else if (0 == iCnt) + else if (READ_ALN_2_HMM == iRnPtype){ + pali->Read(inf, infile, line); + } + else { + printf("%s:%s:%d: FATAL problem\n" + "infile = (%s), #seq = %d\n" + , __FUNCTION__, __FILE__, __LINE__ + , infile, iCnt); + return FAILURE; + } + + /* Convert ASCII to int (0-20), throw out all insert states, + record their number in I[k][i] + and store marked sequences in name[k] and seq[k] */ + pali->Compress(infile); + + /* Sort out the nseqdis most dissimilar sequences for display + in the output alignments */ + pali->FilterForDisplay(par.max_seqid, par.coverage, par.qid, + par.qsc,par.nseqdis); + + // Filter alignment for min score per column with core query profile, defined by coverage_core and qsc_core + //if (par.coresc>-10) pali->HomologyFilter(par.coverage_core, par.qsc_core, par.coresc); + + /* Remove sequences with seq. identity larger than seqid percent + (remove the shorter of two) */ + pali->N_filtered = pali->Filter(par.max_seqid, par.coverage, + par.qid, par.qsc, par.Ndiff); + + /* Calculate pos-specific weights, + AA frequencies and transitions -> f[i][a], tr[i][a] */ + pali->FrequenciesAndTransitions(q); + if (v>=2 && q.Neff_HMM>11.0) + fprintf(stderr,"WARNING: alignment %s looks too diverse (Neff=%.1f>11). Better check it with an alignment viewer... \n",q.name,q.Neff_HMM); + + /*printf("%d %d %f %d (N,Nf,Neff,L) %s:%s:%d\n" + , q.N_in, q.N_filtered, q.Neff_HMM, q.L, __FUNCTION__, __FILE__, __LINE__);*/ + + // Add transition pseudocounts to query -> p[i][a] + q.AddTransitionPseudocounts(); + + /* Generate an amino acid frequency matrix from f[i][a] + with full pseudocount admixture (tau=1) -> g[i][a] */ + q.PreparePseudocounts(); + + /* Add amino acid pseudocounts to query: + p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] */ + q.AddAminoAcidPseudocounts(); + + /* ****** add aligned background pseudocounts ***** */ + HMMshadow rShadowQ = {0}; + rShadowQ.copyHMMtoShadow(q); + + AddBackgroundFrequencies(rShadowQ.f, rShadowQ.p, rShadowQ.tr, + q.L, prHMM, + q.seq, pcPrealigned, iCnt, pcRepresent); + + + if (qali==NULL){ + delete(pali); pali = NULL; + } + + } /* else if (NULL != ppcProf) // not hmmer/hhalign but alignment */ + + //else if ((prHMM->L > 0) && ('\0' == ppcProf[0][0])) + else if (INTERN_HMM_2_HMM == iRnPtype){ + + /******************************************/ + /*** (iii) re-cycle old HMM information ***/ + /******************************************/ + + if (prHMM->L <= 0){ + printf("%s:%s:%d: was expecting to copy HMM structure but L=%d\n" + , __FUNCTION__, __FILE__, __LINE__, prHMM->L); + } + + printf("%s:%s:%d: RE-CYCLING HMM\n", __FUNCTION__, __FILE__, __LINE__); + +#if 0 + q.n_display = prHMM->n_display; + /* ignore sname*/ + for (int i = 0; i < q.n_display; i++){ + /* NOTE: In the original hhalign code the first position + is kept open ('\0'). This makes it difficult to use + string functions like strlen/strdup etc. + Insert a temporary gap (.) to facilitate string operations */ + char cHead = prHMM->seq[i][0]; + prHMM->seq[i][0] = '.'; + q.seq[i] = strdup(prHMM->seq[i]); + q.seq[i][0] = prHMM->seq[i][0] = cHead; + } + q.nfirst = prHMM->nfirst; +#else + q.n_display = 1; + q.nfirst = 0; + char cHead = prHMM->seq[prHMM->nfirst][0]; + prHMM->seq[prHMM->nfirst][0] = '.'; + q.seq[0] = strdup(prHMM->seq[prHMM->nfirst]); + q.seq[q.n_display-1][0] = prHMM->seq[prHMM->nfirst][0] = cHead; +#endif + q.ncons = prHMM->ncons; + q.nss_dssp = prHMM->nss_dssp; + q.nsa_dssp = prHMM->nsa_dssp; + q.nss_pred = prHMM->nss_pred; + q.nss_conf = prHMM->nss_conf; + q.L = prHMM->L; + q.N_in = prHMM->N_in; + q.N_filtered = prHMM->N_filtered; +#define NEFF_SCORE 10 /* FIXME: Magic Number */ + /*for (int i; i < prHMM->L+1; i++){ + q.Neff_M[i] = q.Neff_I[i] = q.Neff_D[i] = NEFF_SCORE; + }*/ + q.Neff_HMM = prHMM->Neff_HMM; + /* skip longname,name,file,fam,sfam,fold,cl */ + q.lamda = prHMM->lamda; + q.mu = prHMM->mu; + + HMMshadow rShadow = {0}; /* friend of HMM to access private members */ + rShadow.copyShadowToHMM(q, *prHMM); + + } + + if (iCnt > 0){ + if (par.forward>=1) q.Log2LinTransitionProbs(1.0); + } + + if (NULL != inf){ + fclose(inf); + } + + return OK; + +} /*** end: ReadAndPrepare() ***/ + +/** + * FreeHMMstruct() + * + * @brief FIXME + * + * @param[in,out] + */ +extern "C" void +FreeHMMstruct(hmm_light *prHMM) +{ + int i; + + if (NULL != prHMM->f){ + for (i = 0; i < prHMM->L+1; i++){ + if (NULL != prHMM->f[i]){ + free(prHMM->f[i]); prHMM->f[i] = NULL; + } + } /* 0 <= i < prHMM->L+1 */ + free(prHMM->f); prHMM->f = NULL; + } + if (NULL != prHMM->g){ + for (i = 0; i < prHMM->L+1; i++){ + if (NULL != prHMM->g[i]){ + free(prHMM->g[i]); prHMM->g[i] = NULL; + } + } /* 0 <= i < prHMM->L+1 */ + free(prHMM->g); prHMM->g = NULL; + } + if (NULL != prHMM->p){ + for (i = 0; i < prHMM->L+1; i++){ + if (NULL != prHMM->p[i]){ + free(prHMM->p[i]); prHMM->p[i] = NULL; + } + } /* 0 <= i < prHMM->L+1 */ + free(prHMM->p); prHMM->p = NULL; + } + if (NULL != prHMM->tr){ + for (i = 0; i < prHMM->L+1; i++){ + if (NULL != prHMM->tr[i]){ + free(prHMM->tr[i]); prHMM->tr[i] = NULL; + } + } /* 0 <= i < prHMM->L+1 */ + free(prHMM->tr); prHMM->tr = NULL; + } + if (NULL != prHMM->linTr){ + for (i = 0; i < prHMM->L+1; i++){ + if (NULL != prHMM->linTr[i]){ + free(prHMM->linTr[i]); prHMM->linTr[i] = NULL; + } + } /* 0 <= i < prHMM->L+1 */ + free(prHMM->linTr); prHMM->linTr = NULL; + } + + if (NULL != prHMM->Neff_M){ + free(prHMM->Neff_M); prHMM->Neff_M = NULL; + } + if (NULL != prHMM->Neff_I){ + free(prHMM->Neff_I); prHMM->Neff_I = NULL; + } + if (NULL != prHMM->Neff_D){ + free(prHMM->Neff_D); prHMM->Neff_D = NULL; + } + + if (NULL != prHMM->seq){ + for (i = 0; i < prHMM->n_display; i++){ + if (NULL != prHMM->seq[i]){ + free(prHMM->seq[i]); prHMM->seq[i] = NULL; + } + } + free(prHMM->seq); prHMM->seq = NULL; + } + + memset(prHMM, 0, sizeof(hmm_light)); + +} /*** end: FreeHMMstruct() ***/ + + +/** + * @brief comparisin function for ascending qsort() of doubles + */ +int +CompDblAsc(const void *pv1, const void *pv2){ + + double d1 = *(double *)pv1; + double d2 = *(double *)pv2; + + if (d1 > d2) { return +1; } + else if (d1 < d2) { return -1; } + else { return 0; } + +} /*** end: CompDblAsc() ***/ + + +/** + * AlnToHMM2() + * + * @brief convert alignment into HMM (hhmake) + * + * @param[out] prHMM + * structure with pseudocounts etc + * @param[in] pcHMM_input + * name of file with HMM + * + */ +extern "C" int +AlnToHMM2(hmm_light *rHMM_p, + char **ppcSeq, int iN){ + + if (0 == par.M){ + SetDefaults(); + SetSubstitutionMatrix(); + par.cons = 1; + par.M = 2; + par.forward=2; + par.Mgaps=100; + const int ciGoodMeasureSeq = 10; + int iAuxLen = strlen(ppcSeq[0]); + par.maxResLen = iAuxLen; + par.maxResLen += ciGoodMeasureSeq; + par.maxColCnt = iAuxLen + ciGoodMeasureSeq; + par.max_seqid=DEFAULT_FILTER; + par.loc=0; par.mact=0; + /* some minor parameters, affecting alignment (i think) */ + par.p = 0.0; /* minimum threshold for inclusion in hit list */ + par.Z = 100; /* minimum threshold for inclusion in hit list and alignment listing */ + par.z = 1; /* min number of lines in hit list */ + par.B = 100; /* max number of alignments */ + par.b = 1; /* min number of alignments */ + par.E = 1e6; /* maximum threshold for inclusion in hit list and alignment listing */ + par.altali=1;par.hitrank=0;par.showcons=1; par.showdssp=1;par.showpred=1;par.nseqdis=iN;par.cons=1; + } + + const int ciGoodMeasure = 10; + int iLen = strlen(ppcSeq[0]) + ciGoodMeasure; + if (iLen > par.maxResLen){ + par.maxResLen = par.maxColCnt = iLen; + } + HMM rTemp(iN+2, iLen); /* temporary template */ + Alignment rTempAli(iN+2, iLen); /* temporary alignment */ + int iParCons = par.cons; + + /*printf(">>>>>>>>>>> %s:%s:%d: there are %d sequences\n", __FUNCTION__, __FILE__, __LINE__, iN);*/ + + par.cons = 1; + if (OK != ReadAndPrepare(INTERN_ALN_2_HMM, + ppcSeq, iN, rHMM_p, + NULL/*prealigned*/, NULL/*representative*/, NULL/*weights*/, //YES/*transfer*/, + (char*)("")/*in-file*/, rTemp, &rTempAli)) { + return FAILURE; + } + par.cons = iParCons; + + /******/ + /*** transfer class info to struct */ + rHMM_p->n_display = rTemp.n_display; + rHMM_p->sname = NULL; + rHMM_p->seq = (char **)calloc((rTemp.n_display+1), sizeof(char *)); + + for (int i = 0; i < rTemp.n_display; i++){ + /* NOTE: In the original hhalign code the first position + is kept open ('\0'). This makes it difficult to use + string functions like strlen/strdup etc. + Insert a temporary gap (.) to facilitate string operations */ + char cHead = rTemp.seq[i][0]; + rTemp.seq[i][0] = '.'; + rHMM_p->seq[i] = strdup(rTemp.seq[i]); + rTemp.seq[i][0] = rHMM_p->seq[i][0] = cHead; + } + rHMM_p->ncons = rTemp.ncons; + rHMM_p->nfirst = rTemp.nfirst; + if (-1 == rHMM_p->ncons){ + /* ncons needed later for alignment of + representative sequence and copy of profile. + ncons not always set (-1 default), + this will cause segmentation fault. + nfirst (probably) right index - + no problem if not */ + rHMM_p->ncons = rTemp.nfirst; + } + rHMM_p->nss_dssp = rTemp.nss_dssp; + rHMM_p->nsa_dssp = rTemp.nsa_dssp; + rHMM_p->nss_pred = rTemp.nss_pred; + rHMM_p->nss_conf = rTemp.nss_conf; + rHMM_p->L = rTemp.L; + rHMM_p->N_in = rTemp.N_in; + rHMM_p->N_filtered = rTemp.N_filtered; +#define NEFF_SCORE 10 /* FIXME: Magic Number */ //// get rid of that, FS, 2010-12-22 + rHMM_p->Neff_M = (float *)calloc(rHMM_p->L+1, sizeof(float)); + rHMM_p->Neff_I = (float *)calloc(rHMM_p->L+1, sizeof(float)); + rHMM_p->Neff_D = (float *)calloc(rHMM_p->L+1, sizeof(float)); + for (int i = 0; i < rHMM_p->L+1; i++){ + rHMM_p->Neff_M[i] = rHMM_p->Neff_I[i] = rHMM_p->Neff_D[i] = NEFF_SCORE; //// get rid of that, FS, 2010-12-22 + } + rHMM_p->Neff_HMM = rTemp.Neff_HMM; + /* skip longname,name,file,fam,sfam,fold,cl */ + rHMM_p->lamda = rTemp.lamda; + rHMM_p->mu = rTemp.mu; + + HMMshadow rShadow = {0}; /* friend of HMM to access private members */ + rShadow.copyHMMtoShadow(rTemp); + + rHMM_p->Neff_M = (float *)calloc(rHMM_p->L+1, sizeof(float)); + rHMM_p->Neff_I = (float *)calloc(rHMM_p->L+1, sizeof(float)); + rHMM_p->Neff_D = (float *)calloc(rHMM_p->L+1, sizeof(float)); + rHMM_p->f = (float **)calloc(rHMM_p->L+1, sizeof(float *)); + rHMM_p->g = (float **)calloc(rHMM_p->L+1, sizeof(float *)); + rHMM_p->p = (float **)calloc(rHMM_p->L+1, sizeof(float *)); + rHMM_p->tr = (float **)calloc(rHMM_p->L+1, sizeof(float *)); + rHMM_p->linTr = (float **)calloc(rHMM_p->L+1, sizeof(float *)); + + for (int i = 0; i < rHMM_p->L+1; i++){ + rHMM_p->Neff_M[i] = (float)rShadow.Neff_M[i]; + rHMM_p->Neff_I[i] = (float)rShadow.Neff_I[i]; + rHMM_p->Neff_D[i] = (float)rShadow.Neff_D[i]; + rHMM_p->f[i] = (float *)calloc(AMINOACIDS, sizeof(float)); + rHMM_p->g[i] = (float *)calloc(AMINOACIDS, sizeof(float)); + rHMM_p->p[i] = (float *)calloc(AMINOACIDS, sizeof(float)); + for (int j = 0; j < AMINOACIDS; j++){ + rHMM_p->f[i][j] = (float)rShadow.f[i][j]; + rHMM_p->g[i][j] = (float)rShadow.g[i][j]; + rHMM_p->p[i][j] = (float)rShadow.p[i][j]; + } + rHMM_p->tr[i] = (float *)calloc(STATE_TRANSITIONS, sizeof(float)); + rHMM_p->linTr[i] = (float *)calloc(STATE_TRANSITIONS, sizeof(float)); + for (int j = 0; j< STATE_TRANSITIONS; j++){ + rHMM_p->tr[i][j] = (float)rShadow.tr[i][j]; + rHMM_p->linTr[i][j] = fpow2(rShadow.tr[i][j]); + } + } /*0 <= i < prHMM->L+1 */ + /* skip trans_lin,ss_dssp,sa_dssp,ss_pred,ss_conf,Xcons */ + for (int j = 0; j < AMINOACIDS; j++){ + rHMM_p->pav[j] = (float)rShadow.pav[j]; + } + /* skip pnul */ + + + /******/ + + + rTemp.ClobberGlobal(); + rTempAli.ClobberGlobal(); + + return OK; + +} /*** end of AlnToHMM2() ***/ + + +/** + * HHMake_Wrapper() + * + * @brief turn alignment (from file) into HHM (HMM) on file + * + * @param[out] hmm_out + * name of file with HMM info corresponding to tmp_aln + * @param[in] tmp_aln + * name of file with alignment, to be turned into HMM (HHM) + * + */ +extern "C" int +HHMake_Wrapper(char *tmp_aln, char *hmm_out) +{ + + HMM rTemp; /* temporary template */ + Alignment rTempAli; /* temporary alignment */ + hmm_light *rHMM_p = NULL; + + /** Note: + this is a wrapper for a stand-alone program hhmake. + hhmake uses a different set of parameters than hhalign. + However, all parameters are GLOBAL. + So at this point we register the hhalign settings, + reset them to hhmake settings and set them back + at the end of the function + */ + + /* save settings from hhalign */ + int iParShowcons=par.showcons; + int iParAppend=par.append; + int iParNseqdis=par.nseqdis; + int iParMark=par.mark; + int iParMaxSeqid=par.max_seqid; + int iParQid=par.qid; + double dParQsc=par.qsc; + int iParCoverage=par.coverage; + int iParNdiff=par.Ndiff; + int iParCoverageCore=par.coverage_core; + double dParQscCore=par.qsc_core; + double dParCoresc=par.coresc; + int iParM=par.M; + int iParMgaps=par.Mgaps; + int iParMatrix=par.matrix; + int iParPcm=par.pcm; + int iParPcw=par.pcw; + double dParGapb=par.gapb; + int iParWg=par.wg; + + /* these are settings suitable for hhmake */ + par.showcons=1; // write consensus sequence into hhm file + par.append=0; // overwrite output file + par.nseqdis=10; // maximum number of query or template sequences to be recoreded in HMM and diplayed in output alignments + par.mark=0; // 1: only marked sequences (or first) get displayed; 0: most divergent ones get displayed + par.max_seqid=90; // default for maximum sequence identity threshold + par.qid=0; // default for maximum sequence identity threshold + par.qsc=-20.0f; // default for minimum score per column with query + par.coverage=0; // default for minimum coverage threshold + par.Ndiff=100; // pick Ndiff most different sequences from alignment + par.coverage_core=30; // Minimum coverage for sequences in core alignment + par.qsc_core=0.3f; // Minimum score per column with core alignment (HMM) + par.coresc=-20.0f; // Minimum score per column with core alignment (HMM) + par.M=1; // match state assignment is by A2M/A3M + par.Mgaps=50; // above this percentage of gaps, columns are assigned to insert states + par.matrix=0; // Subst.matrix 0: Gonnet, 1: HSDM, 2: BLOSUM50 3: BLOSUM62 + par.pcm=0; // no amino acid and transition pseudocounts added + par.pcw=0; // wc>0 weighs columns according to their intra-clomun similarity + par.gapb=0.0; // default values for transition pseudocounts; 0.0: add no transition pseudocounts! + par.wg=0; // 0: use local sequence weights 1: use local ones + + + if (OK != ReadAndPrepare(READ_ALN_2_HMM, + NULL, 0, rHMM_p, NULL, NULL, NULL, + tmp_aln, rTemp, &rTempAli)) { + return FAILURE; + } + + rTemp.WriteToFile(hmm_out); + + + + /* restore settings from hhalign */ + par.showcons=iParShowcons; + par.append=iParAppend; + par.nseqdis=iParNseqdis; + par.mark=iParMark; + par.max_seqid=iParMaxSeqid; + par.qid=iParQid; + par.qsc=dParQsc; + par.coverage=iParCoverage; + par.Ndiff=iParNdiff; + par.coverage_core=iParCoverageCore; + par.qsc_core=dParQscCore; + par.coresc=dParCoresc; + par.M=iParM; + par.Mgaps=iParMgaps; + par.matrix=iParMatrix; + par.pcm=iParPcm; + par.pcw=iParPcw; + par.gapb=dParGapb; + par.wg=iParWg; + + + /* prepare exit */ + rTemp.ClobberGlobal(); + rTempAli.ClobberGlobal(); + + return OK; +} + +/** + * readHMMWrapper() + * + * @brief read HMM from file, copy (relevant) info into struct + * + * @param[out] prHMM + * structure with pseudocounts etc, probably uninitialised on entry + * @param[in] pcHMM_input + * name of file with HMM + * + */ +extern "C" int +readHMMWrapper(hmm_light *rHMM_p, + char *pcHMM_input) +{ + par.maxResLen = 15002; + HMM rTemp(1000,par.maxResLen); /* temporary template */ + Alignment rTempAli; /* temporary alignment */ + /* AW changed init from {0} to 0 because it failed to compile with + * gcc 4.3.3 with the following error: + * error: braces around initializer for non-aggregate type + */ + /* FS taken out initialiser alltogether */ + + /* 0th arg of RnP is the type of RnP, ie, + enum {INTERN_ALN_2_HMM = 0, READ_ALN_2_HMM, READ_HMM_2_HMM};*/ + /* 1st arg of ReadAndPrepare() is ppcSeqs, 2nd is #seq */ + /* FIXME: at this stage the 3rd arg, rHMM_p, only acts as a dummy. + this is rather silly, as it is the actual struct that will + carry the HMM info at the end. + If we write it already in ReadAndPrepare() then we could + dispense with all this friend-class nonsense */ + if (OK != ReadAndPrepare(READ_HMM_2_HMM, + NULL, 0, rHMM_p, NULL, NULL, NULL, + pcHMM_input, rTemp, &rTempAli)) { + return FAILURE; + } + + /* an important piece of information I want to get out of here + is the consenssus sequence. there are however certain + Pfam HMMs that don't trigger consensus calculation. + at the moment I (FS) don't understand why this is + (or rather why this is not). The proper place to do this + should be inside ReadAndPrepare():ReadHMMer(), but + I have not quite penetrated the logic there. + Therefore I try to catch this condition at this point (here) + and rectify it. + */ + if (-1 == rHMM_p->ncons){ + int i, iA; + rHMM_p->ncons = rHMM_p->nfirst; + + for (i = 0; i < rHMM_p->L; i++){ + double dPmax = 0.00; + int iAmax = -1; + for (iA = 0; iA < AMINOACIDS; iA++){ + if (rHMM_p->f[i][iA] > dPmax){ + iAmax = iA; + dPmax = rHMM_p->f[i][iA]; + } + } /* (0 <= iA < AMINOACIDS) */ + rHMM_p->seq[rHMM_p->ncons][i] = i2aa(iAmax); + } /* (0 <= i < rHMM_p->L) */ + + } /* ncons not set */ + + + rTemp.ClobberGlobal(); + rTempAli.ClobberGlobal(); + + return OK; + +} /*** end: readHMMWrapper() ***/ + + + + + + +///////////////////////////////////////////////////////////////////////////// +/** + * @brief Do precalculations for q and t to prepare comparison + */ +void +PrepareTemplate(HMM& q, HMM& t, int format) +{ + if (format==0) // HHM format + { + // Add transition pseudocounts to template + t.AddTransitionPseudocounts(); + + // Generate an amino acid frequency matrix from t.f[i][a] with max pseudocounts (tau=1) -> t.g[i][a] + t.PreparePseudocounts(); + + // Add amino acid pseudocounts to template: t.p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] + t.AddAminoAcidPseudocounts(); + } + else // HHMER format + { + // Don't add transition pseudocounts to template + // t.AddTransitionPseudocounts(par.gapd, par.gape, par.gapf, par.gapg, par.gaph, par.gapi, 0.0); + + // Generate an amino acid frequency matrix from f[i][a] with full pseudocount admixture (tau=1) -> g[i][a] + t.PreparePseudocounts(); + + // DON'T ADD amino acid pseudocounts to temlate: pcm=0! t.p[i][a] = t.f[i][a] + t.AddAminoAcidPseudocounts(0, par.pca, par.pcb, par.pcc); + } + + // Modify transition probabilities to include SS-dependent penalties + if (par.ssgap) t.UseSecStrucDependentGapPenalties(); + + if (par.forward>=1) t.Log2LinTransitionProbs(1.0); + + // Factor Null model into HMM t + // ATTENTION! t.p[i][a] is divided by pnul[a] (for reasons of efficiency) => do not reuse t.p + t.IncludeNullModelInHMM(q,t); // Can go BEFORE the loop if not dependent on template + + return; +} + + +/*** end of hhfunc-C.h ***/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhfunc.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,25 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhfunc.h 143 2010-10-14 13:11:14Z andreas $ + */ + + +int readHMMWrapper(hmm_light *rHMM_p, + char *pcHMM_input); +void FreeHMMstruct(hmm_light *prHMM); +int AlnToHMM2(hmm_light *rHMM_p, + char **ppcSeq, int iN); +int HHMake_Wrapper(char *tmp_aln, char *hmm_out);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhhalfalignment-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,450 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhhalfalignment-C.h 227 2011-03-28 17:03:09Z fabian $ + */ + +// hhfullalignment.C + +#ifndef MAIN +#define MAIN +#include <iostream> // cin, cout, cerr +#include <fstream> // ofstream, ifstream +#include <stdio.h> // printf +#include <stdlib.h> // exit +#include <string> // strcmp, strstr +#include <math.h> // sqrt, pow +#include <limits.h> // INT_MIN +#include <float.h> // FLT_MIN +#include <time.h> // clock +#include <ctype.h> // islower, isdigit etc +using std::ios; +using std::ifstream; +using std::ofstream; +using std::cout; +using std::cerr; +using std::endl; +#include "util-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "list.h" // list data structure +#include "hash.h" // hash data structure +#include "hhdecl-C.h" // constants, class +#include "hhutil-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "hhhmm.h" // class HMM +#include "hhalignment.h" // class Alignment +#include "hhhit.h" +#endif + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +// Methods of class HalfAlignment +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + + + +///////////////////////////////////////////////////////////////////////////// +// Constructor +HalfAlignment::HalfAlignment(int maxseqdis) +{ + n=0; + sname=seq=NULL; + nss_dssp = nss_pred = nss_conf = nsa_dssp = ncons= -1; + h = new(int[maxseqdis]); //h[k] = next position of sequence k to be written + s = new(char*[maxseqdis]); //s[k][h] = character in column h, sequence k of output alignment + l = new(int*[maxseqdis]); //counts non-gap residues: l[k][i] = index of last residue AT OR BEFORE match state i in seq k + m = new(int*[maxseqdis]); //counts positions: m[k][i] = position of match state i in string seq[k] +} + +///////////////////////////////////////////////////////////////////////////////////// +// Destructor +HalfAlignment::~HalfAlignment() +{ + Unset(); + delete[] h; h = NULL; + delete[] s; s = NULL; + delete[] l; l = NULL; + delete[] m; m = NULL; +} + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Free memory in HalfAlignment arrays s[][], l[][], and m[][] + */ +void +HalfAlignment::Unset() +{ + // Free memory for alignment characters and residue counts + for (int k=0; k<n; k++) + { + delete[] s[k]; s[k] = NULL; + delete[] l[k]; l[k] = NULL; + delete[] m[k]; m[k] = NULL; + } + n=0; + sname=seq=NULL; + nss_dssp = nss_pred = nss_conf = nsa_dssp = ncons= -1; +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Prepare a2m/a3m alignment: + * Calculate l[k][i] (residue indices) and m[k][i] (position in seq[k]) +*/ +void +HalfAlignment::Set(char* name, char** seq_in, char** sname_in, int n_in, int L_in, int n1, int n2, int n3, int n4, int nc, int L_in2/*<--FS*/) +{ + int i; /* counts match states in seq[k] */ + int ll; /* counts residues LEFT from or at current position in seq[k] */ + int mm; /* counts postions in string seq[k] */ + int k; /* counts sequences */ + char c; + char warned=0; + + nss_dssp=n1; nss_pred=n2; nss_conf=n3; nsa_dssp=n4; ncons=nc; + seq=seq_in; /* flat copy of sequences */ + sname=sname_in; /* flat copy of sequence names */ + n=n_in; + L=L_in; + pos=0; + + /* Allocate memory for alignment characters and residue counts */ + for (k=0; k<n; k++) { + s[k]=new char[LINELEN]; + l[k]=new int[L+10+L_in2/*<--FS*/]; + m[k]=new int[L+10+L_in2/*<--FS*/]; + if (!s[k] || !l[k] || !m[k]) MemoryError("space for formatting HMM-HMM alignment"); + h[k]=0; //starting positions in alignment = 0 + } /* k <= 0 < n (= n_in) */ + + for (k=0; k<n; k++) { + m[k][0]=0; // 0'th match state (virtual) is begin state at 0 + //if k is consensus sequence + if (k==nc) { + for (i=1; i<=L; i++) m[k][i]=l[k][i]=i; + m[k][L+1]=l[k][L+1]=L; + continue; + } + i=1; mm=1; ll=1; + while ((c=seq[k][mm])) + { + if (MatchChr(c)==c) //count match/delete states + { + l[k][i]=ll; + m[k][i]=mm; + i++; + } + if (WordChr(c)) ll++; //index of next residue + mm++; + } + l[k][i]=ll-1; //set l[k][L+1] eq number of residues in seq k (-1 since there is no residue at L+1st match state) + m[k][i]=mm; //set m[k][L+1] + + if ((i-1)!=L && !warned) + { + cerr<<"Warning: sequence "<<sname[k]<<" in HMM "<<name<<" has "<<i<<" match states but should have "<<L<<"\n"; + warned=1; + } + } /* k <= 0 < n (= n_in) */ + //DEBUG + if (v>=5) + { + printf(" i chr m l\n"); + for(i=0;i<=L+1;i++) printf("%3i %1c %3i %3i\n",i,seq[0][m[0][i]],m[0][i],l[0][i]); + printf("\n"); + } + +} /*** end HalfAlignment::Set() ***/ + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Fill in insert states following match state i (without inserting '.' to fill up) + */ +void +HalfAlignment::AddInserts(int i) +{ + for (int k=0; k<n; k++) // for all sequences... + for (int mm=m[k][i]+1; mm<m[k][i+1]; mm++) // for all inserts between match state i and i+1... + s[k][h[k]++]=seq[k][mm]; // fill inserts into output alignment s[k] +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Fill up alignment with gaps '.' to generate flush end (all h[k] equal) + */ +void +HalfAlignment::FillUpGaps() +{ + int k; //counts sequences + pos=0; + + // Determine max position h[k] + for (k=0; k<n; k++) pos = imax(h[k],pos); + + // Fill in gaps up to pos + for (k=0; k<n; k++) + { + for (int hh=h[k]; hh<pos; hh++) s[k][hh]='.'; + h[k]=pos; + } +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Fill in insert states following match state i and fill up gaps with '.' + */ +void +HalfAlignment::AddInsertsAndFillUpGaps(int i) +{ + AddInserts(i); + FillUpGaps(); +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Add gap column '.' + */ +void +HalfAlignment::AddChar(char c) +{ + for (int k=0; k<n; k++) s[k][h[k]++]=c; + pos++; +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Add match state column i as is + */ +void +HalfAlignment::AddColumn(int i) +{ + for (int k=0; k<n; k++) s[k][h[k]++]=seq[k][m[k][i]]; + pos++; +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Add match state column i as insert state + */ +void +HalfAlignment::AddColumnAsInsert(int i) +{ + char c; + for (int k=0; k<n; k++) + if ((c=seq[k][m[k][i]])!='-' && (c<'0' || c>'9')) + s[k][h[k]++]=InsertChr(c); + pos++; +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Remove all characters c from template sequences + */ +void +HalfAlignment::RemoveChars(char c) +{ + int k,h,hh; + for (k=0; k<n; k++) + { + for (h=hh=0; h<pos; h++) + if (s[k][h]!=c) s[k][hh++]=s[k][h]; + s[k][++hh]='\0'; + } +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transform alignment sequences from A3M to A2M (insert ".") + */ +void +HalfAlignment::BuildFASTA() +{ + AddInserts(0); + FillUpGaps(); + for (int i=1; i<=L; i++) + { + AddColumn(i); + AddInserts(i); + FillUpGaps(); + } + ToFASTA(); +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transform alignment sequences from A3M to A2M (insert ".") + */ +void +HalfAlignment::BuildA2M() +{ + AddInserts(0); + FillUpGaps(); + for (int i=1; i<=L; i++) + { + AddColumn(i); + AddInserts(i); + FillUpGaps(); + } + AddChar('\0'); +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transform alignment sequences from A3M to A2M (insert ".") + */ +void +HalfAlignment::BuildA3M() +{ + AddInserts(0); + for (int i=1; i<=L; i++) + { + AddColumn(i); + AddInserts(i); + } + AddChar('\0'); +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transform alignment sequences from A2M to FASTA ( lowercase to uppercase and '.' to '-') + */ +void +HalfAlignment::ToFASTA() +{ + for (int k=0; k<n; k++) + { + uprstr(s[k]); + strtr(s[k],".","-"); + } +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Align query (HalfAlignment) to template (i.e. hit) match state structure + */ +void +HalfAlignment::AlignToTemplate(Hit& hit) +{ + int i,j; + int step; // column of the HMM-HMM alignment (first:nstep, last:1) + char state; + + if(0) { //par.loc==0) { //////////////////////////////////////////// STILL NEEDED?? + // If in global mode: Add part of alignment before first MM state + AddInserts(0); // Fill in insert states before first match state + for (i=1; i<hit.i[hit.nsteps]; i++) + { + AddColumnAsInsert(i); + AddInserts(i); + if (par.outformat<=2) FillUpGaps(); + } + } + + // Add endgaps (First state must be an MM state!!) + for (j=1; j<hit.j[hit.nsteps]; j++) + { + AddChar('-'); + } + + // Add alignment between first and last MM state + for (step=hit.nsteps; step>=1; step--) + { + state = hit.states[step]; + i = hit.i[step]; + + switch(state) + { + case MM: //MM pair state (both query and template in Match state) + AddColumn(i); + AddInserts(i); + break; + case DG: //D- state + case MI: //MI state + AddColumnAsInsert(i); + AddInserts(i); + break; + case GD: //-D state + case IM: //IM state + AddChar('-'); + break; + } + if (par.outformat<=2) FillUpGaps(); + + } + + if(0) { //par.loc==0) { //////////////////////////////////////////// STILL NEEDED?? + + // If in global mode: Add part of alignment after last MM state + for (i=hit.i[1]+1; i<=L; i++) + { + AddColumnAsInsert(i); + AddInserts(i); + if (par.outformat==2) FillUpGaps(); + } + } + + // Add endgaps + for (j=hit.j[1]+1; j<=hit.L; j++) + { + AddChar('-'); + } + + // Add end-of-string character + AddChar('\0'); +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Write the a2m/a3m alignment into alnfile + */ +void +HalfAlignment::Print(char* alnfile) +{ + int k; //counts sequences + int omitted=0; // counts number of sequences with no residues in match states + FILE *outf; + if (strcmp(alnfile,"stdout")) + { + if (par.append) outf=fopen(alnfile,"a"); else outf=fopen(alnfile,"w"); + if (!outf) OpenFileError(alnfile); + } + else + outf = stdout; + if (v>=3) cout<<"Writing alignment to "<<alnfile<<"\n"; + + for (k=0; k<n; k++) + { + // Print sequence only if it contains at least one residue in a match state + if (1) //strpbrk(s[k],"ABCDEFGHIKLMNPQRSTUVWXYZ1234567890")) + { + fprintf(outf,">%s\n",sname[k]); + fprintf(outf,"%s\n",s[k]); + } else { + omitted++; + if (v>=3) printf("%-14.14s contains no residue in match state. Omitting sequence\n",sname[k]); + } + } + if (v>=2 && omitted) printf("Omitted %i sequences in %s which contained no residue in match state\n",omitted,alnfile); + fclose(outf); +} + + +/** EOF hhhalfalignment-C.h **/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhhalfalignment.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,101 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhhalfalignment.h 143 2010-10-14 13:11:14Z andreas $ + */ + +///////////////////////////////////////////////////////////////////////////////////// +// Class representing a2m/a3m-formatted alignment corresponding to one HMM +///////////////////////////////////////////////////////////////////////////////////// + + +class HalfAlignment +{ +public: + HalfAlignment(int maxseqdis=MAXSEQDIS); + ~HalfAlignment(); + + // Initialize HalfAlignment; create index arrays s [],l[], m[] + void Set(char* name, char** seq_in, char** sname_in, int n_in, int L_in, int n1, int n2, int n3, int n4, int nc, int L_in2/*<--FS*/); + + // Free memory in HalfAlignment arrays s[][], l[][], and m[][] + void Unset(); + + // Align query (HalfAlignment) to template (i.e. hit) match state structure + void AlignToTemplate(Hit& hit); + + // Write the a2m/a3m query alignment into alnfile + void Print(char* outfile); + + // Fill in insert states following match state i + void AddInserts(int i); + + // Fill up alignment with gaps '.' to generate flush end (all h[k] equal) + void FillUpGaps(); + + // Fill in insert states following match state i and fill up gaps with '.' + void AddInsertsAndFillUpGaps(int i); + + // Add gap column '.' or character column + void AddChar(char c); + + // Add match state column i as is + void AddColumn(int i); + + // Add match state column i as insert state + void AddColumnAsInsert(int i); + + // Build alignment in FASTA format + void BuildFASTA(); + + // Build alignment in A2M format + void BuildA2M(); + + // Build alignment in A3M format + void BuildA3M(); + + // Transform alignment sequences from A2M to FASTA ( lowercase to uppercase and '.' to '-') + void ToFASTA(); + + // Remove all characters c from template sequences + void RemoveChars(char c); + +private: + friend class FullAlignment; + + int n; //number of sequences in half-alignment + char** seq; //sequences (in ASCII) in alignment + char** sname; //names of sequences in alignment + int nss_dssp; //index of sequence with dssp sec structure states + int nsa_dssp; //index of sequence with dssp solvent accessiblity states + int nss_pred; //index of sequence with predicted sec structure states + int nss_conf; //index of sequence with prediction confidence values + int ncons; //index of consensus sequence + + int pos; //After FillUpGaps() all h[k] have value pos + int L; //number of match states in corresponding profile + int* h; //h[k] = next position of sequence k to be written + char** s; //s[k][h] = column h, sequence k of output alignment + int** l; //counts non-gap residues: l[k][i] = index of last residue AT OR BEFORE match state i in seq k + int** m; //counts positions: m[k][i] = position of match state i in string seq[k] +/* int h[MAXSEQ]; //h[k] = next position of sequence k to be written */ +/* char* s[MAXSEQ]; //s[k][h] = column h, sequence k of output alignment */ +/* int* l[MAXSEQ]; //counts non-gap residues: l[k][i] = index of last residue AT OR BEFORE match state i in seq k */ +/* int* m[MAXSEQ]; //counts positions: m[k][i] = position of match state i in string seq[k] */ +}; + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhhit-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,2204 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhhit-C.h 237 2011-04-14 15:01:48Z fabian $ + */ + +// hhhit.C + +#ifndef MAIN +#define MAIN +#include <iostream> // cin, cout, cerr +#include <fstream> // ofstream, ifstream +#include <stdio.h> // printf +using std::cout; +using std::cerr; +using std::endl; +using std::ios; +using std::ifstream; +using std::ofstream; +#include <stdlib.h> // exit +#include <string> // strcmp, strstr +#include <math.h> // sqrt, pow +#include <limits.h> // INT_MIN +#include <float.h> // FLT_MIN +#include <time.h> // clock +#include <ctype.h> // islower, isdigit etc +#include "util-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "list.h" // list data structure +#include "hash.h" // hash data structure +#include "hhdecl-C.h" // constants, class +#include "hhutil-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "hhhmm.h" // class HMM +#include "hhalignment.h" // class Alignment +#include "hhhitlist.h" // class HitList +#endif + +#define CALCULATE_MAX6(max, var1, var2, var3, var4, var5, var6, varb) \ +if (var1>var2) { max=var1; varb=STOP;} \ +else { max=var2; varb=MM;}; \ +if (var3>max) { max=var3; varb=GD;}; \ +if (var4>max) { max=var4; varb=IM;}; \ +if (var5>max) { max=var5; varb=DG;}; \ +if (var6>max) { max=var6; varb=MI;}; + +#define CALCULATE_SUM6(sum, var1, var2, var3, var4, var5, var6, varb) \ +if (var1>var2) { sum=var1; varb=STOP;} \ +else { sum=var2; varb=MM;}; \ +if (var3>sum) { sum=var3; varb=GD;}; \ +if (var4>sum) { sum=var4; varb=IM;}; \ +if (var5>sum) { sum=var5; varb=DG;}; \ +if (var6>sum) { sum=var6; varb=MI;}; \ +sum = var1 + var2 + var3 + var4 + var5 + var6; + +#define CALCULATE_MAX4(max, var1, var2, var3, var4, varb) \ +if (var1>var2) { max=var1; varb=STOP;} \ +else { max=var2; varb=MM;}; \ +if (var3>max) { max=var3; varb=MI;}; \ +if (var4>max) { max=var4; varb=IM;}; + +// Generate random number in [0,1[ +#define frand() ((float) rand()/(RAND_MAX+1.0)) + + +// Function declarations +inline float Score(float* qi, float* tj); +inline float ProbFwd(float* qi, float* tj); +inline float max2(const float& xMM, const float& xX, char& b); +inline int pickprob2(const double& xMM, const double& xX, const int& state); +inline int pickprob3_GD(const double& xMM, const double& xDG, const double& xGD); +inline int pickprob3_IM(const double& xMM, const double& xMI, const double& xIM); +inline int pickprob6(const double& x0, const double& xMM, const double& xGD, const double& xIM, const double& xDG, const double& xMI); +inline int pickmax2(const double& xMM, const double& xX, const int& state); +inline int pickmax3_GD(const double& xMM, const double& xDG, const double& xGD); +inline int pickmax3_IM(const double& xMM, const double& xMI, const double& xIM); +inline int pickmax6(const double& x0, const double& xMM, const double& xGD, const double& xIM, const double& xDG, const double& xMI); +inline double Pvalue(double x, double a[]); +inline double Pvalue(float x, float lamda, float mu); +inline double logPvalue(float x, float lamda, float mu); +inline double logPvalue(float x, double a[]); +inline double Probab(Hit& hit); + +////////////////////////////////////////////////////////////////////////////// +//// Constructor +////////////////////////////////////////////////////////////////////////////// +Hit::Hit() +{ + longname = name = file = dbfile = NULL; + sname = NULL; + seq = NULL; + bMM = bGD = bDG = bIM = bMI = NULL; + self = 0; + i = j = NULL; + states = NULL; + S = S_ss = P_posterior = NULL; + Xcons = NULL; + B_MM=B_MI=B_IM=B_DG=B_GD=NULL; + F_MM=F_MI=F_IM=F_DG=F_GD=NULL; + cell_off = NULL; + scale = NULL; + sum_of_probs=0.0; + Neff_HMM=0.0; + score_ss = Pval = logPval = Eval = Probab = Pforward = 0.0; + nss_conf = nfirst = i1 = i2 = j1 = j2 = matched_cols = ssm1 = ssm2 = 0; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Free all allocated memory (to delete list of hits) + */ +void +Hit::Delete() +{ + if (i){ + delete[] i; i = NULL; + } + if (j){ + delete[] j; j = NULL; + } + if (states){ + delete[] states; states = NULL; + } + if (S){ + delete[] S; S = NULL; + } + if (S_ss){ + delete[] S_ss; S_ss = NULL; + } + if (P_posterior){ + delete[] P_posterior; P_posterior = NULL; + } + if (Xcons){ + delete[] Xcons; Xcons = NULL; + } + // delete[] l; l = NULL; + i = j = NULL; + states = NULL; + S = S_ss = P_posterior = NULL; + Xcons = NULL; + if (irep==1) // if irep>1 then longname etc point to the same memory locations as the first repeat. + { // but these have already been deleted. + // printf("Delete name = %s\n",name);////////////////// + delete[] longname; longname = NULL; + delete[] name; name = NULL; + delete[] file; file = NULL; + delete[] dbfile; dbfile = NULL; + for (int k=0; k<n_display; k++) + { + //delete[] sname[k]; sname[k] = NULL; + delete[] seq[k]; seq[k] = NULL; + } + //delete[] sname; sname = NULL; + delete[] seq; seq = NULL; + } +} + + +/////////////////////////////////////////////////////////////////////////// +/** + * @brief Allocate/delete memory for dynamic programming matrix + */ +void +Hit::AllocateBacktraceMatrix(int Nq, int Nt) +{ + int i; + bMM=new(char*[Nq]); + bMI=new(char*[Nq]); + bIM=new(char*[Nq]); + bDG=new(char*[Nq]); + bGD=new(char*[Nq]); + cell_off=new(char*[Nq]); + for (i=0; i<Nq; i++) + { + bMM[i]=new(char[Nt]); + bMI[i]=new(char[Nt]); + bIM[i]=new(char[Nt]); + bGD[i]=new(char[Nt]); + bDG[i]=new(char[Nt]); + cell_off[i]=new(char[Nt]); + if (!bMM[i] || !bMI[i] || !bIM[i] || !bGD[i] || !bDG[i] || !cell_off[i]) + { + fprintf(stderr,"Error: out of memory while allocating row %i (out of %i) for dynamic programming matrices \n",i+1,Nq); + fprintf(stderr,"Suggestions:\n"); + fprintf(stderr,"1. Cut query sequence into shorter segments\n"); + fprintf(stderr,"2. Check stack size limit (Linux: ulimit -a)\n"); + fprintf(stderr,"3. Run on a computer with bigger memory\n"); + exit(3); + } + } +} + +/** + * @brief + */ +void +Hit::DeleteBacktraceMatrix(int Nq) +{ + int i; + for (i=0; i<Nq; i++) + { + delete[] bMM[i]; bMM[i] = NULL; + delete[] bMI[i]; bMI[i] = NULL; + delete[] bIM[i]; bIM[i] = NULL; + delete[] bGD[i]; bGD[i] = NULL; + delete[] bDG[i]; bDG[i] = NULL; + delete[] cell_off[i]; cell_off[i] = NULL; + } + delete[] bMM; bMM = NULL; + delete[] bMI; bMI = NULL; + delete[] bIM; bIM = NULL; + delete[] bDG; bDG = NULL; + delete[] bGD; bGD = NULL; + delete[] cell_off; cell_off = NULL; +} + + +/////////////////////////////////////////////////////////////////////////////// +/** + * @brief Allocate/delete memory for Forward dynamic programming matrix + */ +void +Hit::AllocateForwardMatrix(int Nq, int Nt) +{ + F_MM=new(double*[Nq]); + F_MI=new(double*[Nq]); + F_DG=new(double*[Nq]); + F_IM=new(double*[Nq]); + F_GD=new(double*[Nq]); + scale=new(double[Nq+1]); // need Nq+3? + for (int i=0; i<Nq; i++) + { + F_MM[i] = new(double[Nt]); + F_MI[i] = new(double[Nt]); + F_DG[i] = new(double[Nt]); + F_IM[i] = new(double[Nt]); + F_GD[i] = new(double[Nt]); + if (!F_MM[i] || !F_MI[i] || !F_IM[i] || !F_GD[i] || !F_DG[i]) + { + fprintf(stderr,"Error: out of memory while allocating row %i (out of %i) for dynamic programming matrices \n",i+1,Nq); + fprintf(stderr,"Suggestions:\n"); + fprintf(stderr,"1. Cut query sequence into shorter segments\n"); + fprintf(stderr,"2. Check stack size limit (Linux: ulimit -a)\n"); + fprintf(stderr,"3. Run on a computer with bigger memory\n"); + exit(3); + } + + } +} + +/** + * @brief + */ +void +Hit::DeleteForwardMatrix(int Nq) +{ + for (int i=0; i<Nq; i++) + { + delete[] F_MM[i]; F_MM[i] = NULL; + delete[] F_MI[i]; F_MI[i] = NULL; + delete[] F_IM[i]; F_IM[i] = NULL; + delete[] F_GD[i]; F_GD[i] = NULL; + delete[] F_DG[i]; F_DG[i] = NULL; + } + delete[] F_MM; F_MM = NULL; + delete[] F_MI; F_MI = NULL; + delete[] F_IM; F_IM = NULL; + delete[] F_DG; F_DG = NULL; + delete[] F_GD; F_GD = NULL; + delete[] scale; scale = NULL; +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Allocate/delete memory for Backward dynamic programming matrix (DO ONLY AFTER FORWARD MATRIX HAS BEEN ALLOCATED) + */ +void +Hit::AllocateBackwardMatrix(int Nq, int Nt) +{ + B_MM=new(double*[Nq]); + B_MI=F_MI; + B_DG=F_DG; + B_IM=F_IM; + B_GD=F_GD; + for (int i=0; i<Nq; i++) + { + B_MM[i] = new(double[Nt]); + if (!B_MM[i]) + { + fprintf(stderr,"Error: out of memory while allocating row %i (out of %i) for dynamic programming matrices \n",i+1,Nq); + fprintf(stderr,"Suggestions:\n"); + fprintf(stderr,"1. Cut query sequence into shorter segments\n"); + fprintf(stderr,"2. Check stack size limit (Linux: ulimit -a)\n"); + fprintf(stderr,"3. Run on a computer with bigger memory\n"); + exit(3); + } + } +} + +void Hit::DeleteBackwardMatrix(int Nq) +{ + for (int i=0; i<Nq; i++) + { + delete[] B_MM[i]; B_MM[i] = NULL; /* is this all? FS */ + } + delete[] B_MM; B_MM = NULL; + B_MM=B_MI=B_IM=B_DG=B_GD=NULL; +} + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Compare HMMs with one another and look for sub-optimal alignments that share no pair with previous ones + * The function is called with q and t + * If q and t are equal (self==1), only the upper right part of the matrix is calculated: j>=i+3 + */ +void +Hit::Viterbi(HMM& q, HMM& t, float** Sstruc) +{ + + // Linear topology of query (and template) HMM: + // 1. The HMM HMM has L+2 columns. Columns 1 to L contain + // a match state, a delete state and an insert state each. + // 2. The Start state is M0, the virtual match state in column i=0 (j=0). (Therefore X[k][0]=ANY) + // This column has only a match state and it has only a transitions to the next match state. + // 3. The End state is M(L+1), the virtual match state in column i=L+1.(j=L+1) (Therefore X[k][L+1]=ANY) + // Column L has no transitions to the delete state: tr[L][M2D]=tr[L][D2D]=0. + // 4. Transitions I->D and D->I are ignored, since they do not appear in PsiBlast alignments + // (as long as the gap opening penalty d is higher than the best match score S(a,b)). + + // Pairwise alignment of two HMMs: + // 1. Pair-states for the alignment of two HMMs are + // MM (Q:Match T:Match) , GD (Q:Gap T:Delete), IM (Q:Insert T:Match), DG (Q:Delelte, T:Match) , MI (Q:Match T:Insert) + // 2. Transitions are allowed only between the MM-state and each of the four other states. + + // Saving space: + // The best score ending in pair state XY sXY[i][j] is calculated from left to right (j=1->t.L) + // and top to bottom (i=1->q.L). To save space, only the last row of scores calculated is kept in memory. + // (The backtracing matrices are kept entirely in memory [O(t.L*q.L)]). + // When the calculation has proceeded up to the point where the scores for cell (i,j) are caculated, + // sXY[i-1][j'] = sXY[j'] for j'>=j (A below) + // sXY[i][j'] = sXY[j'] for j'<j (B below) + // sXY[i-1][j-1]= sXY_i_1_j_1 (C below) + // sXY[i][j] = sXY_i_j (D below) + // j-1 + // j + // i-1: CAAAAAAAAAAAAAAAAAA + // i : BBBBBBBBBBBBBD + + + // Variable declarations + //float sMM[MAXRES]; // sMM[i][j] = score of best alignment up to indices (i,j) ending in (Match,Match) + //float sGD[MAXRES]; // sGD[i][j] = score of best alignment up to indices (i,j) ending in (Gap,Delete) + //float sDG[MAXRES]; // sDG[i][j] = score of best alignment up to indices (i,j) ending in (Delete,Gap) + //float sIM[MAXRES]; // sIM[i][j] = score of best alignment up to indices (i,j) ending in (Ins,Match) + //float sMI[MAXRES]; // sMI[i][j] = score of best alignment up to indices (i,j) ending in (Match,Ins) + float *sMM = new(float[par.maxResLen]); // sMM[i][j] = score of best alignment up to indices (i,j) ending in (Match,Match) + float *sGD = new(float[par.maxResLen]); // sGD[i][j] = score of best alignment up to indices (i,j) ending in (Gap,Delete) + float *sDG = new(float[par.maxResLen]); // sDG[i][j] = score of best alignment up to indices (i,j) ending in (Delete,Gap) + float *sIM = new(float[par.maxResLen]); // sIM[i][j] = score of best alignment up to indices (i,j) ending in (Ins,Match) + float *sMI = new(float[par.maxResLen]); // sMI[i][j] = score of best alignment up to indices (i,j) ending in (Match,Ins) + float smin=(par.loc? 0:-FLT_MAX); //used to distinguish between SW and NW algorithms in maximization + int i,j; //query and template match state indices + float sMM_i_j=0,sMI_i_j,sIM_i_j,sGD_i_j,sDG_i_j; + float sMM_i_1_j_1,sMI_i_1_j_1,sIM_i_1_j_1,sGD_i_1_j_1,sDG_i_1_j_1; + int jmin,jmax; + + // Reset crossed out cells? + if(irep==1) InitializeForAlignment(q,t); + + // Initialization of top row, i.e. cells (0,j) + for (j=0; j<=t.L; j++) + { + sMM[j] = (self? 0 : -j*par.egt); + sIM[j] = sMI[j] = sDG[j] = sGD[j] = -FLT_MAX; + } + score=-INT_MAX; i2=j2=0; bMM[0][0]=STOP; + + // Viterbi algorithm + for (i=1; i<=q.L; i++) // Loop through query positions i + { +// if (v>=5) printf("\n"); + + + if (self) + { + // If q is compared to itself, ignore cells below diagonal+SELFEXCL + jmin = i+SELFEXCL; + jmax = t.L; + if (jmin>jmax) continue; + } + else + { + // If q is compared to t, exclude regions where overlap of q with t < min_overlap residues + jmin=imax( 1, i+min_overlap-q.L); // Lq-i+j>=Ovlap => j>=i+Ovlap-Lq => jmin=max{1, i+Ovlap-Lq} + jmax=imin(t.L,i-min_overlap+t.L); // Lt-j+i>=Ovlap => j<=i-Ovlap+Lt => jmax=min{Lt,i-Ovlap+Lt} + } + + // Initialize cells + if (jmin==1) + { + sMM_i_1_j_1 = -(i-1)*par.egq; // initialize at (i-1,0) + sMM[0] = -i*par.egq; // initialize at (i,0) + sIM_i_1_j_1 = sMI_i_1_j_1 = sDG_i_1_j_1 = sGD_i_1_j_1 = -FLT_MAX; // initialize at (i-1,jmin-1) + } + else + { + // Initialize at (i-1,jmin-1) if lower left triagonal is excluded due to min overlap + sMM_i_1_j_1 = sMM[jmin-1]; // initialize at (i-1,jmin-1) + sIM_i_1_j_1 = sIM[jmin-1]; // initialize at (i-1,jmin-1) + sMI_i_1_j_1 = sMI[jmin-1]; // initialize at (i-1,jmin-1) + sDG_i_1_j_1 = sDG[jmin-1]; // initialize at (i-1,jmin-1) + sGD_i_1_j_1 = sGD[jmin-1]; // initialize at (i-1,jmin-1) + sMM[jmin-1] = -FLT_MAX; // initialize at (i,jmin-1) + } + if (jmax<t.L) // initialize at (i-1,jmmax) if upper right triagonal is excluded due to min overlap + sMM[jmax] = sIM[jmax] = sMI[jmax] = sDG[jmax] = sGD[jmax] = -FLT_MAX; + sIM[jmin-1] = sMI[jmin-1] = sDG[jmin-1] = sGD[jmin-1] = -FLT_MAX; // initialize at (i,jmin-1) + + for (j=jmin; j<=jmax; j++) // Loop through template positions j + { + + if (cell_off[i][j]) + { + sMM_i_1_j_1 = sMM[j]; // sMM_i_1_j_1 (for j->j+1) = sMM(i-1,(j+1)-1) = sMM[j] + sGD_i_1_j_1 = sGD[j]; + sIM_i_1_j_1 = sIM[j]; + sDG_i_1_j_1 = sDG[j]; + sMI_i_1_j_1 = sMI[j]; + sMM[j]=sMI[j]=sIM[j]=sDG[j]=sGD[j]=-FLT_MAX; // sMM[j] = sMM(i,j) is cell_off + } + else + { + // Recursion relations +// printf("S[%i][%i]=%4.1f ",i,j,Score(q.p[i],t.p[j])); // DEBUG!! + + CALCULATE_MAX6( sMM_i_j, + smin, + sMM_i_1_j_1 + q.tr[i-1][M2M] + t.tr[j-1][M2M], + sGD_i_1_j_1 + q.tr[i-1][M2M] + t.tr[j-1][D2M], + sIM_i_1_j_1 + q.tr[i-1][I2M] + t.tr[j-1][M2M], + sDG_i_1_j_1 + q.tr[i-1][D2M] + t.tr[j-1][M2M], + sMI_i_1_j_1 + q.tr[i-1][M2M] + t.tr[j-1][I2M], + bMM[i][j] + ); + sMM_i_j += Score(q.p[i],t.p[j]) + ScoreSS(q,t,i,j) + par.shift + + (Sstruc==NULL? 0: Sstruc[i][j]); + + + sGD_i_j = max2 + ( + sMM[j-1] + t.tr[j-1][M2D], // MM->GD gap opening in query + sGD[j-1] + t.tr[j-1][D2D], // GD->GD gap extension in query + bGD[i][j] + ); + sIM_i_j = max2 + ( +// sMM[j-1] + q.tr[i][M2I] + t.tr[j-1][M2M] , + sMM[j-1] + q.tr[i][M2I] + t.tr[j-1][M2M_GAPOPEN], // MM->IM gap opening in query + sIM[j-1] + q.tr[i][I2I] + t.tr[j-1][M2M], // IM->IM gap extension in query + bIM[i][j] + ); + sDG_i_j = max2 + ( +// sMM[j] + q.tr[i-1][M2D], +// sDG[j] + q.tr[i-1][D2D], //gap extension (DD) in query + sMM[j] + q.tr[i-1][M2D] + t.tr[j][GAPOPEN], // MM->DG gap opening in template + sDG[j] + q.tr[i-1][D2D] + t.tr[j][GAPEXTD], // DG->DG gap extension in template + bDG[i][j] + ); + sMI_i_j = max2 + ( + sMM[j] + q.tr[i-1][M2M] + t.tr[j][M2I], // MM->MI gap opening M2I in template + sMI[j] + q.tr[i-1][M2M] + t.tr[j][I2I], // MI->MI gap extension I2I in template + bMI[i][j] + ); + + sMM_i_1_j_1 = sMM[j]; + sGD_i_1_j_1 = sGD[j]; + sIM_i_1_j_1 = sIM[j]; + sDG_i_1_j_1 = sDG[j]; + sMI_i_1_j_1 = sMI[j]; + sMM[j] = sMM_i_j; + sGD[j] = sGD_i_j; + sIM[j] = sIM_i_j; + sDG[j] = sDG_i_j; + sMI[j] = sMI_i_j; + + //if (isnan(sMM_i_j)||isinf(sMM_i_j)){ + // printf("."); /* <DEBUG> FS*/ + //} + // Find maximum score; global alignment: maxize only over last row and last column + if(sMM_i_j>score && (par.loc || i==q.L)) { i2=i; j2=j; score=sMM_i_j; } + + } // end if + + } //end for j + + // if global alignment: look for best cell in last column + if (!par.loc && sMM_i_j>score) { i2=i; j2=jmax; score=sMM_i_j; } + + } // end for i + + state=MM; // state with maximum score is MM state + + // If local alignment do length correction: -log(length) + if (par.loc) + { + if (self) + score=score-log(0.5*t.L*q.L/200.0/200.0)/LAMDA - 11.2; // offset of -11.2 to get approx same mean as for -global + else + if (par.idummy==0 && q.lamda>0) ////////////////////////////////////////////// + score=score-log(t.L*q.L/200.0/200.0)/q.lamda - 11.2; // offset of -11.2 to get approx same mean as for -global + else if (par.idummy<=1) ////////////////////////////////////////////// + score=score-log(t.L*q.L/200.0/200.0)/LAMDA - 11.2; // offset of -11.2 to get approx same mean as for -global + } +// printf("Template=%-12.12s i=%-4i j=%-4i score=%6.3f\n",t.name,i2,j2,score); + + delete[] sMM; sMM = NULL; + delete[] sGD; sGD = NULL; + delete[] sDG; sDG = NULL; + delete[] sIM; sIM = NULL; + delete[] sMI; sMI = NULL; + + return; + +} /* this is the end of Hit::Viterbi() */ + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Compare two HMMs with Forward Algorithm in lin-space (~ 2x faster than in log-space) + */ +void +Hit::Forward(HMM& q, HMM& t, float** Pstruc) +{ + + // Variable declarations + int i,j; // query and template match state indices + double pmin=(par.loc? 1.0: 0.0); // used to distinguish between SW and NW algorithms in maximization + double Cshift = pow(2.0,par.shift); // score offset transformed into factor in lin-space + double Pmax_i; // maximum of F_MM in row i + double scale_prod=1.0; // Prod_i=1^i (scale[i]) + int jmin; + + // First alignment of this pair of HMMs? + if(irep==1) + { + q.tr[0][M2D] = q.tr[0][M2I] = 0.0; + q.tr[0][I2M] = q.tr[0][I2I] = 0.0; + q.tr[0][D2M] = q.tr[0][D2D] = 0.0; + t.tr[0][M2M] = 1.0; + t.tr[0][M2D] = t.tr[0][M2I] = 0.0; + t.tr[0][I2M] = t.tr[0][I2I] = 0.0; + t.tr[0][D2M] = t.tr[0][D2D] = 0.0; + q.tr[q.L][M2M] = 1.0; + q.tr[q.L][M2D] = q.tr[q.L][M2I] = 0.0; + q.tr[q.L][I2M] = q.tr[q.L][I2I] = 0.0; + q.tr[q.L][D2M] = 1.0; + q.tr[q.L][D2D] = 0.0; + t.tr[t.L][M2M] = 1.0; + t.tr[t.L][M2D] = t.tr[t.L][M2I] = 0.0; + t.tr[t.L][I2M] = t.tr[t.L][I2I] = 0.0; + t.tr[t.L][D2M] = 1.0; + t.tr[t.L][D2D] = 0.0; + InitializeForAlignment(q,t); + } + + + // Initialization of top row, i.e. cells (0,j) + F_MM[1][0] = F_IM[1][0] = F_GD[1][0] = F_MM[0][1] = F_MI[0][1] = F_DG[0][1] = 0.0; + for (j=1; j<=t.L; j++) + { + if (cell_off[1][j]) + F_MM[1][j] = F_MI[1][j] = F_DG[1][j] = F_IM[1][j] = F_GD[1][j] = 0.0; + else + { + F_MM[1][j] = ProbFwd(q.p[1],t.p[j]) * fpow2(ScoreSS(q,t,1,j)) * Cshift * (Pstruc==NULL? 1: Pstruc[1][j]) ; + F_MI[1][j] = F_DG[1][j] = 0.0; + F_IM[1][j] = F_MM[1][j-1] * q.tr[1][M2I] * t.tr[j-1][M2M] + F_IM[1][j-1] * q.tr[1][I2I] * t.tr[j-1][M2M]; + F_GD[1][j] = F_MM[1][j-1] * t.tr[j-1][M2D] + F_GD[1][j-1] * t.tr[j-1][D2D]; + } + } + scale[0]=scale[1]=scale[2]=1.0; + + // Forward algorithm + for (i=2; i<=q.L; i++) // Loop through query positions i + { +// if (v>=5) printf("\n"); + + if (self) jmin = imin(i+SELFEXCL+1,t.L); else jmin=1; + + if (scale_prod<DBL_MIN*100) scale_prod = 0.0; else scale_prod *= scale[i]; + + // Initialize cells at (i,0) + if (cell_off[i][jmin]) + F_MM[i][jmin] = F_MI[i][jmin] = F_DG[i][jmin] = F_IM[i][jmin] = F_GD[i][jmin] = 0.0; + else + { + F_MM[i][jmin] = scale_prod * ProbFwd(q.p[i],t.p[jmin]) * fpow2(ScoreSS(q,t,i,jmin)) * Cshift * (Pstruc==NULL? 1: Pstruc[i][jmin]); + F_IM[i][jmin] = F_GD[i][jmin] = 0.0; + F_MI[i][jmin] = scale[i] * (F_MM[i-1][jmin] * q.tr[i-1][M2M] * t.tr[jmin][M2I] + F_MI[i-1][jmin] * q.tr[i-1][M2M] * t.tr[jmin][I2I]); + F_DG[i][jmin] = scale[i] * (F_MM[i-1][jmin] * q.tr[i-1][M2D] + F_DG[i-1][jmin] * q.tr[i-1][D2D]); + } + Pmax_i=0; + + for (j=jmin+1; j<=t.L; j++) // Loop through template positions j + { + // Recursion relations + // printf("S[%i][%i]=%4.1f ",i,j,Score(q.p[i],t.p[j])); + + if (cell_off[i][j]) + F_MM[i][j] = F_MI[i][j] = F_DG[i][j] = F_IM[i][j] = F_GD[i][j] = 0.0; + else + { + F_MM[i][j] = ProbFwd(q.p[i],t.p[j]) * fpow2(ScoreSS(q,t,i,j)) * Cshift * (Pstruc==NULL? 1: Pstruc[i][j]) * scale[i] * + ( pmin + + F_MM[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][M2M] // BB -> MM (BB = Begin/Begin, for local alignment) + + F_GD[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][D2M] // GD -> MM + + F_IM[i-1][j-1] * q.tr[i-1][I2M] * t.tr[j-1][M2M] // IM -> MM + + F_DG[i-1][j-1] * q.tr[i-1][D2M] * t.tr[j-1][M2M] // DG -> MM + + F_MI[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][I2M] // MI -> MM + ); + F_GD[i][j] = + ( F_MM[i][j-1] * t.tr[j-1][M2D] // GD -> MM + + F_GD[i][j-1] * t.tr[j-1][D2D] // GD -> GD + + (Pstruc==NULL? 0 : F_DG[i][j-1] * t.tr[j-1][M2D] * q.tr[i][D2M] ) // DG -> GD (only when structure scores given) + ); + F_IM[i][j] = + ( F_MM[i][j-1] * q.tr[i][M2I] * t.tr[j-1][M2M] // MM -> IM + + F_IM[i][j-1] * q.tr[i][I2I] * t.tr[j-1][M2M] // IM -> IM + + (Pstruc==NULL? 0 : F_MI[i][j-1] * q.tr[i][M2I] * t.tr[j-1][I2M] ) // MI -> IM (only when structure scores given) + ); + F_DG[i][j] = scale[i] * + ( F_MM[i-1][j] * q.tr[i-1][M2D] // DG -> MM + + F_DG[i-1][j] * q.tr[i-1][D2D] // DG -> DG + ) ; + F_MI[i][j] = scale[i] * + ( F_MM[i-1][j] * q.tr[i-1][M2M] * t.tr[j][M2I] // MI -> MM + + F_MI[i-1][j] * q.tr[i-1][M2M] * t.tr[j][I2I] // MI -> MI + ); + + if(F_MM[i][j]>Pmax_i) Pmax_i=F_MM[i][j]; + + } // end else + + } //end for j + + pmin *= scale[i]; + scale[i+1] = 1.0/(Pmax_i+1.0); +// scale[i+1] = 1.0; + + } // end for i + + // Calculate P_forward * Product_{i=1}^{Lq+1}(scale[i]) + if (par.loc) + { + Pforward = 1.0; // alignment contains no residues (see Mueckstein, Stadler et al.) + for (i=1; i<=q.L; i++) // Loop through query positions i + { + for (j=1; j<=t.L; j++) // Loop through template positions j + Pforward += F_MM[i][j]; + Pforward *= scale[i+1]; + } + } + else // global alignment + { + Pforward = 0.0; + for (i=1; i<q.L; i++) { + Pforward = (Pforward + F_MM[i][t.L]) * scale[i+1]; + } + for (j=1; j<=t.L; j++) { + Pforward += F_MM[q.L][j]; + } + Pforward *= scale[q.L+1]; + } + + // Calculate log2(P_forward) + score = log2(Pforward)-10.0f; + for (i=1; i<=q.L+1; i++) score -= log2(scale[i]); +// state = MM; + + if (par.loc) + { + if (self) + score=score-log(0.5*t.L*q.L)/LAMDA+14.; // +14.0 to get approx same mean as for -global + else + score=score-log(t.L*q.L)/LAMDA+14.; // +14.0 to get approx same mean as for -global + } + + // Debugging output + if (v>=6) + { + const int i0=0, i1=q.L; + const int j0=0, j1=t.L; + scale_prod=1; + printf("\nFwd scale "); + for (j=j0; j<=j1; j++) printf("%3i ",j); + printf("\n"); + for (i=i0; i<=i1; i++) + { + scale_prod *= scale[i]; + printf("%3i: %9.3G ",i,1/scale_prod); + for (j=j0; j<=j1; j++) + printf("%7.4f ",(F_MM[i][j]+F_MI[i][j]+F_IM[i][j]+F_DG[i][j]+F_GD[i][j])); + printf("\n"); +// printf(" MM %9.5f ",1/scale[i]); +// for (j=j0; j<=j1; j++) +// printf("%7.4f ",F_MM[i][j]); +// printf("\n"); + } + } +// printf("Template=%-12.12s score=%6.3f i2=%i j2=%i \n",t.name,score,i2,j2); + return; + +} /* this is the end of Hit::Forward() */ + + + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Compare two HMMs with Backward Algorithm (in lin-space, 2x faster), for use in MAC alignment + */ +void +Hit::Backward(HMM& q, HMM& t) +{ + + // Variable declarations + int i,j; // query and template match state indices + double pmin=(par.loc? 1.0: 0.0); // used to distinguish between SW and NW algorithms in maximization + double Cshift = pow(2.0,par.shift); // score offset transformed into factor in lin-space + double scale_prod=scale[q.L+1]; + int jmin; + //double dMaxB = -1.0; + + // Initialization of top row, i.e. cells (0,j) + for (j=t.L; j>=1; j--) + { + if (cell_off[q.L][j]) + B_MM[q.L][j] = 0.0; + else + B_MM[q.L][j] = scale[q.L+1]; + //dMaxB = dMaxB>B_MM[q.L][j]?dMaxB:B_MM[q.L][j]; + B_IM[q.L][j] = B_MI[q.L][j] = B_DG[q.L][j] = B_GD[q.L][j] = 0.0; + } + if (par.loc) pmin = scale[q.L+1]; // transform pmin (for local alignment) to scale of present (i'th) row + + // Backward algorithm + for (i=q.L-1; i>=1; i--) // Loop through query positions i + { + // if (v>=5) printf("\n"); + + if (self) jmin = imin(i+SELFEXCL,t.L); else jmin=1; // jmin = i+SELFEXCL and not (i+SELFEXCL+1) to set matrix element at boundary to zero + + // Initialize cells at (i,t.L+1) + scale_prod *= scale[i+1]; + if (cell_off[i][t.L]) + B_MM[i][t.L] = 0.0; + else + B_MM[i][t.L] = scale_prod; + //if (isnan(B_MM[i][t.L])||isinf(B_MM[i][t.L])){ + // printf("."); /* <DEBUG> FS*/ + //} + //dMaxB = dMaxB>B_MM[i][t.L]?dMaxB:B_MM[i][t.L]; + B_IM[i][t.L] = B_MI[i][t.L] = B_DG[i][t.L] = B_GD[i][t.L] = 0.0; + pmin *= scale[i+1]; // transform pmin (for local alignment) to scale of present (i'th) row + + for (j=t.L-1; j>=jmin; j--) // Loop through template positions j + { + // Recursion relations + // printf("S[%i][%i]=%4.1f ",i,j,Score(q.p[i],t.p[j])); + if (cell_off[i][j]) + B_MM[i][j] = B_GD[i][j] = B_IM[i][j] = B_DG[i][j] = B_MI[i][j] = 0.0; + else + { + double pmatch = B_MM[i+1][j+1] * ProbFwd(q.p[i+1],t.p[j+1]) * fpow2(ScoreSS(q,t,i+1,j+1)) * Cshift * scale[i+1]; + //if (isnan(pmatch)||isinf(pmatch)){ + // printf("."); /* <DEBUG> FS*/ + //} + B_MM[i][j] = + ( + + pmin // MM -> EE (End/End, for local alignment) + + pmatch * q.tr[i][M2M] * t.tr[j][M2M] // MM -> MM + + B_GD[i][j+1] * t.tr[j][M2D] // MM -> GD (q.tr[i][M2M] is already contained in GD->MM) + + B_IM[i][j+1] * q.tr[i][M2I] * t.tr[j][M2M] // MM -> IM + + B_DG[i+1][j] * q.tr[i][M2D] * scale[i+1] // MM -> DG (t.tr[j][M2M] is already contained in DG->MM) + + B_MI[i+1][j] * q.tr[i][M2M] * t.tr[j][M2I] * scale[i+1] // MM -> MI + ); + //if (isnan(B_MM[i][j])||isinf(B_MM[i][j])){ + // printf("."); /* <DEBUG> FS*/ + //} + //dMaxB = dMaxB>B_MM[i][j]?dMaxB:B_MM[i][j]; + + B_GD[i][j] = + ( + + pmatch * q.tr[i][M2M] * t.tr[j][D2M] // GD -> MM + + B_GD[i][j+1] * t.tr[j][D2D] // DG -> DG + ); + B_IM[i][j] = + ( + + pmatch * q.tr[i][I2M] * t.tr[j][M2M] // IM -> MM + + B_IM[i][j+1] * q.tr[i][I2I] * t.tr[j][M2M] // IM -> IM + ); + B_DG[i][j] = + ( + + pmatch * q.tr[i][D2M] * t.tr[j][M2M] // DG -> MM + + B_DG[i+1][j] * q.tr[i][D2D] * scale[i+1] // DG -> DG + // + B_GD[i][j+1] * q.tr[i][D2M] * t.tr[j][M2D] // DG -> GD + ); + B_MI[i][j] = + ( + + pmatch * q.tr[i][M2M] * t.tr[j][I2M] // MI -> MM + + B_MI[i+1][j] * q.tr[i][M2M] * t.tr[j][I2I] * scale[i+1] // MI -> MI + // + B_IM[i][j+1] * q.tr[i][M2I] * t.tr[j][I2M] // MI -> IM + ); + + } // end else + + } //end for j + + } // end for i + + // Debugging output + if (v>=6) + { + const int i0=0, i1=q.L; + const int j0=0, j1=t.L; + double scale_prod[q.L+2]; + scale_prod[q.L] = scale[q.L+1]; + for (i=q.L-1; i>=1; i--) scale_prod[i] = scale_prod[i+1] * scale[i+1]; + + printf("\nBwd scale "); + for (j=j0; j<=j1; j++) printf("%3i ",j); + printf("\n"); + for (i=i0; i<=i1; i++) + { + printf("%3i: %9.3G ",i,1/scale_prod[i]); + for (j=j0; j<=j1; j++) + printf("%7.4f ",(B_MM[i][j]+B_MI[i][j]+B_IM[i][j]+B_DG[i][j]+B_GD[i][j]) * (ProbFwd(q.p[i],t.p[j])*fpow2(ScoreSS(q,t,i,j)) * Cshift)); + printf("\n"); + + // printf("MM %9.5f ",1/scale[i]); + // for (j=j0; j<=j1; j++) + // printf("%7.4f ",B_MM[i][j] * (ProbFwd(q.p[i],t.p[j])*fpow2(ScoreSS(q,t,i,j)) * Cshift)); + // printf("\n"); + } + printf("\nPost scale "); + for (j=j0; j<=j1; j++) printf("%3i ",j); + printf("\n"); + for (i=i0; i<=i1; i++) + { + printf("%3i: %9.3G ",i,1/scale_prod[i]); + for (j=j0; j<=j1; j++) + printf("%7.4f ",B_MM[i][j]*F_MM[i][j]/Pforward); + printf("\n"); + } + printf("\n"); + } + + if (v>=4) printf("\nForward total probability ratio: %8.3G\n",Pforward); + + // Calculate Posterior matrix and overwrite Backward matrix with it + for (i=1; i<=q.L; i++) { + for (j=1; j<=t.L; j++) { + B_MM[i][j] *= F_MM[i][j]/Pforward; + //if (isnan(B_MM[i][j]) || isinf(B_MM[i][j])){ + // printf("."); /* <DEBUG> FS*/ + //} + //dMaxB = dMaxB>B_MM[i][j]?dMaxB:B_MM[i][j]; + } + } + + //printf("Max-B_MM = %f\n", dMaxB); + + return; + +} /* this is the end of Hit::Backward() */ + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Maximum Accuracy alignment + */ +void +Hit::MACAlignment(HMM& q, HMM& t) +{ + // Use Forward and Backward matrices to find that alignment which + // maximizes the expected number of correctly aligned pairs of residues (mact=0) + // or, more generally, which maximizes the expectation value of the number of + // correctly aligned pairs minus (mact x number of aligned pairs) + // "Correctly aligned" can be based on posterior probabilities calculated with + // a local or a global version of the Forward-Backward algorithm. + + int i,j; // query and template match state indices + int jmin,jmax; // range of dynamic programming for j + double** S=F_MI; // define alias for new score matrix + double score_MAC; // score of the best MAC alignment + + // Initialization of top row, i.e. cells (0,j) + for (j=0; j<=t.L; j++) S[0][j] = 0.0; + score_MAC=-INT_MAX; i2=j2=0; bMM[0][0]=STOP; + + // Dynamic programming + for (i=1; i<=q.L; i++) // Loop through query positions i + { + + if (self) + { + // If q is compared to itself, ignore cells below diagonal+SELFEXCL + jmin = i+SELFEXCL; + jmax = t.L; + if (jmin>jmax) continue; + } + else + { + // If q is compared to t, exclude regions where overlap of q with t < min_overlap residues + jmin=imax( 1, i+min_overlap-q.L); // Lq-i+j>=Ovlap => j>=i+Ovlap-Lq => jmin=max{1, i+Ovlap-Lq} + jmax=imin(t.L,i-min_overlap+t.L); // Lt-j+i>=Ovlap => j<=i-Ovlap+Lt => jmax=min{Lt,i-Ovlap+Lt} + } + + // Initialize cells + S[i][jmin-1] = 0.0; + if (jmax<t.L) S[i-1][jmax] = 0.0; // initialize at (i-1,jmax) if upper right triagonal is excluded due to min overlap + + for (j=jmin; j<=jmax; j++) // Loop through template positions j + { + + if (cell_off[i][j]) + S[i][j] = -FLT_MIN; + else + { + // Recursion + + // NOT the state before the first MM state) + CALCULATE_MAX4( + S[i][j], + B_MM[i][j] - par.mact, // STOP signifies the first MM state, NOT the state before the first MM state (as in Viterbi) + S[i-1][j-1] + B_MM[i][j] - par.mact, // B_MM[i][j] contains posterior probability + S[i-1][j] - 0.5*par.mact, // gap penalty prevents alignments such as this: XX--xxXX + S[i][j-1] - 0.5*par.mact, // YYyy--YY + bMM[i][j] // backtracing matrix + ); + +// if (i==6 && j==8) +// printf("i=%i j=%i S[i][j]=%8.3f MM:%7.3f MI:%7.3f IM:%7.3f b:%i\n",i,j,S[i][j],S[i-1][j-1]+B_MM[i][j]-par.mact,S[i-1][j],S[i][j-1],bMM[i][j]); + + // Find maximum score; global alignment: maximize only over last row and last column + if(S[i][j]>score_MAC && (par.loc || i==q.L)) { i2=i; j2=j; score_MAC=S[i][j]; } + + } // end if + + } //end for j + + // if global alignment: look for best cell in last column + if (!par.loc && S[i][jmax]>score_MAC) { i2=i; j2=jmax; score_MAC=S[i][jmax]; } + + } // end for i + + // DEBUG + if (v>=5) + { + printf("\nScore "); + for (j=0; j<=t.L; j++) printf("%3i ",j); + printf("\n"); + for (i=0; i<=q.L; i++) + { + printf("%2i: ",i); + for (j=0; j<=t.L; j++) + printf("%5.2f ",S[i][j]); + printf("\n"); + } + printf("\n"); + printf("Template=%-12.12s i=%-4i j=%-4i score=%6.3f\n",t.name,i2,j2,score); + } + + return; + +} /* this is the end of Hit::MACAlignment() */ + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Trace back alignment of two profiles based on matrices bXX[][] + */ +void +Hit::Backtrace(HMM& q, HMM& t) +{ + // Trace back trough the matrices bXY[i][j] until first match state is found (STOP-state) + + int step; // counts steps in path through 5-layered dynamic programming matrix + int i,j; // query and template match state indices + + InitializeBacktrace(q,t); + + // Make sure that backtracing stops when t:M1 or q:M1 is reached (Start state), e.g. sMM[i][1], or sIM[i][1] (M:MM, B:IM) + for (i=0; i<=q.L; i++) bMM[i][1]=bGD[i][1]=bIM[i][1] = STOP; + for (j=1; j<=t.L; j++) bMM[1][j]=bDG[1][j]=bMI[1][j] = STOP; + + + // Back-tracing loop + matched_cols=0; // for each MACTH (or STOP) state matched_col is incremented by 1 + step=0; // steps through the matrix correspond to alignment columns (from 1 to nsteps) + // state=MM; // state with maximum score must be MM state // already set at the end of Viterbi() + i=i2; j=j2; // last aligned pair is (i2,j2) + while (state) // while (state!=STOP) because STOP=0 + { + step++; + states[step] = state; + this->i[step] = i; + this->j[step] = j; + // Exclude cells in direct neighbourhood from all further alignments + for (int ii=imax(i-2,1); ii<=imin(i+2,q.L); ii++) + cell_off[ii][j]=1; + for (int jj=imax(j-2,1); jj<=imin(j+2,t.L); jj++) + cell_off[i][jj]=1; + + switch (state) + { + case MM: // current state is MM, previous state is bMM[i][j] + matched_cols++; + state = bMM[i--][j--]; + break; + case GD: // current state is GD + switch (bGD[i][j--]) + { + case STOP: state = STOP; break; // current state does not have predecessor + case MM: state = MM; break; // previous state is Match state + } // default: previous state is same state (GD) + break; + case IM: + switch (bIM[i][j--]) + { + case STOP: state = STOP; break; // current state does not have predecessor + case MM: state = MM; break; // previous state is Match state + } // default: previous state is same state (IM) + break; + case DG: + switch (bDG[i--][j]) + { + case STOP: state = STOP; break; // current state does not have predecessor + case MM: state = MM; break; // previous state is Match state + } // default: previous state is same state (DG) + break; + case MI: + switch (bMI[i--][j]) + { + case STOP: state = STOP; break; // current state does not have predecessor + case MM: state = MM; break; // previous state is Match state + } // default: previous state is same state (MI) + break; + default: + fprintf(stderr,"Error: unallowed state value %i occurred during backtracing at step %i, (i,j)=(%i,%i)\n",state,step,i,j); + state=0; + v=4; + break; + } //end switch (state) + } //end while (state) + + i1 = this->i[step]; + j1 = this->j[step]; + states[step] = MM; // first state (STOP state) is set to MM state + nsteps=step; + + // Allocate new space for alignment scores + if (t.Xcons) Xcons = new( char[q.L+2]); // for template consensus sequence aligned to query + S = new( float[nsteps+1]); + S_ss = new( float[nsteps+1]); + if (!S_ss) MemoryError("space for HMM-HMM alignments"); + + // Add contribution from secondary structure score, record score along alignment, + // and record template consensus sequence in master-slave-alignment to query sequence + score_ss=0.0f; + int ssm=ssm1+ssm2; + for (step=1; step<=nsteps; step++) + { + switch(states[step]) + { + case MM: + i = this->i[step]; + j = this->j[step]; + S[step] = Score(q.p[i],t.p[j]); + S_ss[step] = ScoreSS(q,t,i,j,ssm); + score_ss += S_ss[step]; + if (Xcons) Xcons[i]=t.Xcons[j]; //record database consensus sequence + break; + case MI: //if gap in template + case DG: + if (Xcons) Xcons[this->i[step]]=GAP; //(no break hereafter) + default: //if gap in T or Q + S[step]=S_ss[step]=0.0f; + break; + } + } + if (ssm2>=1) score-=score_ss; // subtract SS score added during alignment!!!! + if (Xcons) + { + for (i=0; i<i1; i++) Xcons[i]=ENDGAP; // set end gap code at beginning and end of template consensus sequence + for (i=i2+1; i<=q.L+1; i++) Xcons[i]=ENDGAP; + } + + // Add contribution from correlation of neighboring columns to score + float Scorr=0; + if (nsteps) + { + for (step=2; step<=nsteps; step++) Scorr+=S[step]*S[step-1]; + for (step=3; step<=nsteps; step++) Scorr+=S[step]*S[step-2]; + for (step=4; step<=nsteps; step++) Scorr+=S[step]*S[step-3]; + for (step=5; step<=nsteps; step++) Scorr+=S[step]*S[step-4]; + score+=par.corr*Scorr; + } + + // Set score, P-value etc. + score_sort = score_aass = -score; + logPval=0; Pval=1; + if (t.mu) + { + logPvalt=logPvalue(score,t.lamda,t.mu); + Pvalt=Pvalue(score,t.lamda,t.mu); + } + else { logPvalt=0; Pvalt=1;} + // printf("%-10.10s lamda=%-9f score=%-9f logPval=%-9g\n",name,t.lamda,score,logPvalt); + + + //DEBUG: Print out Viterbi path + if (v>=4) + { + printf("NAME=%7.7s score=%7.3f score_ss=%7.3f\n",name,score,score_ss); + printf("step Q T i j state score T Q cf ss-score\n"); + for (step=nsteps; step>=1; step--) + { + switch(states[step]) + { + case MM: + printf("%4i %1c %1c ",step,q.seq[q.nfirst][this->i[step]],seq[nfirst][this->j[step]]); + break; + case GD: + case IM: + printf("%4i - %1c ",step,seq[nfirst][this->j[step]]); + break; + case DG: + case MI: + printf("%4i %1c - ",step,q.seq[q.nfirst][this->i[step]]); + break; + } + printf("%4i %4i %2i %7.2f ",this->i[step],this->j[step],(int)states[step],S[step]); + printf("%c %c %1i %7.2f\n",i2ss(t.ss_dssp[this->j[step]]),i2ss(q.ss_pred[this->i[step]]),q.ss_conf[this->i[step]]-1,S_ss[step]); + } + } + + return; + +} /* this is the end of Hit::Backtrace() */ + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief GLOBAL stochastic trace back through the forward matrix of probability ratios + */ +void +Hit::StochasticBacktrace(HMM& q, HMM& t, char maximize) +{ + int step; // counts steps in path through 5-layered dynamic programming matrix + int i,j; // query and template match state indices +// float pmin=(par.loc? 1.0: 0.0); // used to distinguish between SW and NW algorithms in maximization + const float pmin=0; + double* scale_cum = new(double[q.L+2]); + + + scale_cum[0]=1; + for (i=1; i<=q.L+1; i++) scale_cum[i] = scale_cum[i-1]*scale[i]; + + // Select start cell for GLOBAL alignment + // (Implementing this in a local version would make this method work for local backtracing as well) + if (maximize) + { + double F_max=0; + for (i=q.L-1; i>=1; i--) + if (F_MM[i][t.L]/scale_cum[i]>F_max) {i2=i; j2=t.L; F_max=F_MM[i][t.L]/scale_cum[i];} + for (j=t.L; j>=1; j--) + if (F_MM[q.L][j]/scale_cum[q.L]>F_max) {i2=q.L; j2=j; F_max=F_MM[q.L][j]/scale_cum[q.L];} + } + else + { +// float sumF[q.L+t.L]; + double* sumF=new(double[q.L+t.L]); + sumF[0]=0.0; + for (j=1; j<=t.L; j++) sumF[j] = sumF[j-1] + F_MM[q.L][j]/scale_cum[q.L];; + for (j=t.L+1; j<t.L+q.L; j++) sumF[j] = sumF[j-1] + F_MM[j-t.L][t.L]/scale_cum[j-t.L];; + float x = sumF[t.L+q.L-1]*frand(); // generate random number between 0 and sumF[t.L+q.L-1] + for (j=1; j<t.L+q.L; j++) + if (x<sumF[j]) break; + if (j<=t.L) {i2=q.L; j2=j;} else {i2=j-t.L; j2=t.L;} + delete[] sumF; sumF = NULL; + } + + InitializeBacktrace(q,t); + + int (*pick2)(const double&, const double&, const int&); + int (*pick3_GD)(const double&, const double&, const double&); + int (*pick3_IM)(const double&, const double&, const double&); + int (*pick6)(const double&, const double&, const double&, const double&, const double&, const double&); + if (maximize) + { + pick2 = &pickmax2; + pick3_GD = &pickmax3_GD; + pick3_IM = &pickmax3_IM; + pick6 = &pickmax6; + } + else + { + pick2 = &pickprob2; + pick3_GD = &pickprob3_GD; + pick3_IM = &pickprob3_IM; + pick6 = &pickprob6; + } + + // Back-tracing loop + matched_cols=0; // for each MACTH (or STOP) state matched_col is incremented by 1 + step=0; // steps through the matrix correspond to alignment columns (from 1 to nsteps) + state = MM; + i=i2; j=j2; // start at end of query and template + while (state) // while not reached STOP state or upper or left border + { + step++; + states[step] = state; + this->i[step] = i; + this->j[step] = j; + + switch (state) + { + + case MM: // current state is MM, previous state is state +// fprintf(stderr,"%4i %1c %1c %4i %4i MM %7.2f\n",step,q.seq[q.nfirst][i],seq[nfirst][j],i,j,Score(q.p[i],t.p[j])); +// printf("0:%7.3f MM:%7.3f GD:%7.3f IM:%7.3f DG:%7.3f MI:%7.3f \n", +// pmin*scale_cum[i-1], +// F_MM[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][M2M], +// F_GD[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][D2M], +// F_IM[i-1][j-1] * q.tr[i-1][I2M] * t.tr[j-1][M2M], +// F_DG[i-1][j-1] * q.tr[i-1][D2M] * t.tr[j-1][M2M], +// F_MI[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][I2M]); + matched_cols++; + if (j>1 && i>1) + state = (*pick6)( + pmin*scale_cum[i-1], + F_MM[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][M2M], + F_GD[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][D2M], + F_IM[i-1][j-1] * q.tr[i-1][I2M] * t.tr[j-1][M2M], + F_DG[i-1][j-1] * q.tr[i-1][D2M] * t.tr[j-1][M2M], + F_MI[i-1][j-1] * q.tr[i-1][M2M] * t.tr[j-1][I2M] + ); + else state=0; + i--; j--; + break; + case GD: // current state is GD +// fprintf(stderr,"%4i - %1c %4i %4i GD %7.2f\n",step,q.seq[q.nfirst][j],i,j,Score(q.p[i],t.p[j])); + if (j>1) + state = (*pick3_GD)( + F_MM[i][j-1] * t.tr[j-1][M2D], + F_DG[i][j-1] * t.tr[j-1][M2D] * q.tr[i][D2M], // DG -> GD + F_GD[i][j-1] * t.tr[j-1][D2D] // gap extension (DD) in template + ); + else state=0; + j--; + break; + case IM: +// fprintf(stderr,"%4i - %1c %4i %4i IM %7.2f\n",step,q.seq[q.nfirst][j],i,j,Score(q.p[i],t.p[j])); + if (j>1) + state = (*pick3_IM)( + F_MM[i][j-1] * q.tr[i][M2I] * t.tr[j-1][M2M_GAPOPEN], + F_MI[i][j-1] * q.tr[i][M2I] * t.tr[j-1][I2M], // MI -> IM + F_IM[i][j-1] * q.tr[i][I2I] * t.tr[j-1][M2M] // gap extension (II) in query + ); + else state=0; + j--; + break; + case DG: +// fprintf(stderr,"%4i %1c - %4i %4i DG %7.2f\n",step,q.seq[q.nfirst][i],i,j,Score(q.p[i],t.p[j])); + if (i>1) + state = (*pick2)( + F_MM[i-1][j] * q.tr[i-1][M2D] * t.tr[j][GAPOPEN], + F_DG[i-1][j] * q.tr[i-1][D2D] * t.tr[j][GAPEXTD], //gap extension (DD) in query + DG + ); + else state=0; + i--; + break; + case MI: +// fprintf(stderr,"%4i %1c - %4i %4i MI %7.2f\n",step,q.seq[q.nfirst][i],i,j,Score(q.p[i],t.p[j])); + if (i>1) + state = (*pick2)( + F_MM[i-1][j] * q.tr[i-1][M2M] * t.tr[j][M2I], + F_MI[i-1][j] * q.tr[i-1][M2M] * t.tr[j][I2I], //gap extension (II) in template + MI + ); + else state=0; + i--; + break; + + } //end switch (state) + + } //end while (state) + + i1 = this->i[step]; + j1 = this->j[step]; + states[step] = MM; // first state (STOP state) is set to MM state + nsteps=step; + + // Allocate new space for alignment scores + if (t.Xcons) Xcons = new( char[q.L+2]); // for template consensus sequence aligned to query + S = new( float[nsteps+1]); + S_ss = new( float[nsteps+1]); + if (!S_ss) MemoryError("space for HMM-HMM alignments"); + + // Add contribution from secondary structure score, record score along alignment, + // and record template consensus sequence in master-slave-alignment to query sequence + score_ss=0.0f; + int ssm=ssm1+ssm2; + for (step=1; step<=nsteps; step++) + { + switch(states[step]) + { + case MM: + i = this->i[step]; + j = this->j[step]; + S[step] = Score(q.p[i],t.p[j]); + S_ss[step] = ScoreSS(q,t,i,j,ssm); + score_ss += S_ss[step]; + if (Xcons) Xcons[i]=t.Xcons[j]; //record database consensus sequence + break; + case MI: //if gap in template + case DG: + if (Xcons) Xcons[this->i[step]]=GAP; //(no break hereafter) + default: //if gap in T or Q + S[step]=S_ss[step]=0.0f; + break; + } + } + if (ssm2>=1) score-=score_ss; // subtract SS score added during alignment!!!! + if (Xcons) + { + for (i=0; i<i1; i++) Xcons[i]=ENDGAP; // set end gap code at beginning and end of template consensus sequence + for (i=i2+1; i<=q.L+1; i++) Xcons[i]=ENDGAP; + } + + delete[] scale_cum; scale_cum = NULL; + + return; +} + + + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Trace back alignment of two profiles based on matrices bXX[][] + */ +void +Hit::BacktraceMAC(HMM& q, HMM& t) +{ + // Trace back trough the matrix b[i][j] until STOP state is found + + char** b=bMM; // define alias for backtracing matrix + int step; // counts steps in path through 5-layered dynamic programming matrix + int i,j; // query and template match state indices + + InitializeBacktrace(q,t); + + // Make sure that backtracing stops when t:M1 or q:M1 is reached (Start state), e.g. sMM[i][1], or sIM[i][1] (M:MM, B:IM) + for (i=0; i<=q.L; i++) b[i][1] = STOP; + for (j=1; j<=t.L; j++) b[1][j] = STOP; + + + // Back-tracing loop + // In contrast to the Viterbi-Backtracing, STOP signifies the first Match-Match state, NOT the state before the first MM state + matched_cols=1; // for each MACTH (or STOP) state matched_col is incremented by 1 + state=MM; // lowest state with maximum score must be match-match state + step=0; // steps through the matrix correspond to alignment columns (from 1 to nsteps) + i=i2; j=j2; // last aligned pair is (i2,j2) + while (state!=STOP) + { + step++; + states[step] = state = b[i][j]; + this->i[step] = i; + this->j[step] = j; + // Exclude cells in direct neighbourhood from all further alignments + for (int ii=imax(i-2,1); ii<=imin(i+2,q.L); ii++) + cell_off[ii][j]=1; + for (int jj=imax(j-2,1); jj<=imin(j+2,t.L); jj++) + cell_off[i][jj]=1; + if (state==MM) matched_cols++; + + switch (state) + { + case MM: i--; j--; break; + case IM: j--; break; + case MI: i--; break; + case STOP: break; + default: + fprintf(stderr,"Error: unallowed state value %i occurred during backtracing at step %i, (i,j)=(%i,%i)\n",state,step,i,j); + state=0; + v=4; + break; + } //end switch (state) + } //end while (state) + + i1 = this->i[step]; + j1 = this->j[step]; + states[step] = MM; // first state (STOP state) is set to MM state + nsteps=step; + + // Allocate new space for alignment scores + if (t.Xcons) Xcons = new( char[q.L+2]); // for template consensus sequence aligned to query + S = new( float[nsteps+1]); + S_ss = new( float[nsteps+1]); + P_posterior = new( float[nsteps+1]); + if (!P_posterior) MemoryError("space for HMM-HMM alignments"); + + // Add contribution from secondary structure score, record score along alignment, + // and record template consensus sequence in master-slave-alignment to query sequence + score_ss=0.0f; + sum_of_probs=0.0; // number of identical residues in query and template sequence + int ssm=ssm1+ssm2; +// printf("Hit=%s\n",name); ///////////////////////////////////////////////////////////// + for (step=1; step<=nsteps; step++) + { + switch(states[step]) + { + case MM: + i = this->i[step]; + j = this->j[step]; + S[step] = Score(q.p[i],t.p[j]); + S_ss[step] = ScoreSS(q,t,i,j,ssm); + score_ss += S_ss[step]; + P_posterior[step] = B_MM[this->i[step]][this->j[step]]; + // Add probability to sum of probs if no dssp states given or dssp states exist and state is resolved in 3D structure + if (t.nss_dssp<0 || t.ss_dssp[j]>0) sum_of_probs += P_posterior[step]; +// printf("j=%-3i dssp=%1i P=%4.2f sum=%6.2f\n",j,t.ss_dssp[j],P_posterior[step],sum_of_probs); ////////////////////////// + if (Xcons) Xcons[i]=t.Xcons[j]; //record database consensus sequence + break; + case MI: //if gap in template + case DG: + if (Xcons) Xcons[this->i[step]]=GAP; //(no break hereafter) + default: //if gap in T or Q + S[step] = S_ss[step] = P_posterior[step] = 0.0; + break; + } + } +// printf("\n"); ///////////////////////////////////////////////////////////// + if (ssm2>=1) score-=score_ss; // subtract SS score added during alignment!!!! + if (Xcons) + { + for (i=0; i<i1; i++) Xcons[i]=ENDGAP; // set end gap code at beginning and end of template consensus sequence + for (i=i2+1; i<=q.L+1; i++) Xcons[i]=ENDGAP; + } + + // Add contribution from correlation of neighboring columns to score + float Scorr=0; + if (nsteps) + { + for (step=1; step<=nsteps-1; step++) Scorr+=S[step]*S[step+1]; + for (step=1; step<=nsteps-2; step++) Scorr+=S[step]*S[step+2]; + for (step=1; step<=nsteps-3; step++) Scorr+=S[step]*S[step+3]; + for (step=1; step<=nsteps-4; step++) Scorr+=S[step]*S[step+4]; + score+=par.corr*Scorr; + } + + // Set score, P-value etc. + score_sort = score_aass = -score; + logPval=0; Pval=1; + if (t.mu) + { + logPvalt=logPvalue(score,t.lamda,t.mu); + Pvalt=Pvalue(score,t.lamda,t.mu); + } + else { logPvalt=0; Pvalt=1;} +// printf("%-10.10s lamda=%-9f score=%-9f logPval=%-9g\n",name,t.lamda,score,logPvalt); + + + //DEBUG: Print out MAC alignment path + if (v>=4) + { + float sum_post=0.0; + printf("NAME=%7.7s score=%7.3f score_ss=%7.3f\n",name,score,score_ss); + printf("step Q T i j state score T Q cf ss-score P_post Sum_post\n"); + for (step=nsteps; step>=1; step--) + { + switch(states[step]) + { + case MM: + sum_post+=P_posterior[step]; + printf("%4i %1c %1c ",step,q.seq[q.nfirst][this->i[step]],seq[nfirst][this->j[step]]); + break; + case IM: + printf("%4i - %1c ",step,seq[nfirst][this->j[step]]); + break; + case MI: + printf("%4i %1c - ",step,q.seq[q.nfirst][this->i[step]]); + break; + } + printf("%4i %4i %2i %7.1f ",this->i[step],this->j[step],(int)states[step],S[step]); + printf("%c %c %1i %7.1f ",i2ss(t.ss_dssp[this->j[step]]),i2ss(q.ss_pred[this->i[step]]),q.ss_conf[this->i[step]]-1,S_ss[step]); + printf("%7.5f %7.2f\n",P_posterior[step],sum_post); + } + } + + return; +} + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Functions that calculate probabilities + */ +void +Hit::InitializeForAlignment(HMM& q, HMM& t) +{ + int i,j; + + // SS scoring during (ssm2>0) or after (ssm1>0) alignment? Query SS known or Template SS known? + switch (par.ssm) + { + case 0: + ssm1=0; + ssm2=0; + break; + case 1: + ssm2=0; // SS scoring after alignment + if (t.nss_dssp>=0 && q.nss_pred>=0) ssm1=1; + else if (q.nss_dssp>=0 && t.nss_pred>=0) ssm1=2; + else if (q.nss_pred>=0 && t.nss_pred>=0) ssm1=3; + else ssm1=0; + break; + case 2: + ssm1=0; // SS scoring during alignment + if (t.nss_dssp>=0 && q.nss_pred>=0) ssm2=1; + else if (q.nss_dssp>=0 && t.nss_pred>=0) ssm2=2; + else if (q.nss_pred>=0 && t.nss_pred>=0) ssm2=3; + else ssm2=0; + break; + case 3: + ssm2=0; // SS scoring after alignment + if (q.nss_pred>=0 && t.nss_pred>=0) ssm1=3; else ssm1=0; + break; + case 4: + ssm1=0; // SS scoring during alignment + if (q.nss_pred>=0 && t.nss_pred>=0) ssm2=3; else ssm2=0; + break; + // case 5: + // ssm2=0; // SS scoring after alignment + // if (q.nss_dssp>=0 && t.nss_dssp>=0) ssm1=4; else ssm1=0; + // break; + // case 6: + // ssm1=0; // SS scoring during alignment + // if (q.nss_dssp>=0 && t.nss_dssp>=0) ssm2=4; else ssm2=0; + // break; + } + + if (self) + { + // Cross out cells in lower diagonal for self-comparison? + for (i=1; i<=q.L; i++) + { + int jmax = imin(i+SELFEXCL,t.L); + for (j=1; j<=jmax; j++) + cell_off[i][j]=1; // cross out cell near diagonal + for (j=jmax+1; j<=t.L+1; j++) + cell_off[i][j]=0; // no other cells crossed out yet + } + } + else + // Compare two different HMMs Q and T + { + // Activate all cells in dynamic programming matrix + for (i=1; i<=q.L; i++) + for (j=1; j<=t.L; j++) + cell_off[i][j]=0; // no other cells crossed out yet + + // Cross out cells that are excluded by the minimum-overlap criterion + if (par.min_overlap==0) + min_overlap = imin(60, (int)(0.333f*imin(q.L,t.L))+1); // automatic minimum overlap + else + min_overlap = imin(par.min_overlap, (int)(0.8f*imin(q.L,t.L))); + + for (i=0; i<min_overlap; i++) + for (j=i-min_overlap+t.L+1; j<=t.L; j++) // Lt-j+i>=Ovlap => j<=i-Ovlap+Lt => jmax=min{Lt,i-Ovlap+Lt} + cell_off[i][j]=1; + for (i=q.L-min_overlap+1; i<=q.L; i++) + for (j=1; j<i+min_overlap-q.L; j++) // Lq-i+j>=Ovlap => j>=i+Ovlap-Lq => jmin=max{1, i+Ovlap-Lq} + cell_off[i][j]=1; + } + + // Cross out rows which are contained in range given by exclstr ("3-57,238-314") + if (par.exclstr) + { + char* ptr=par.exclstr; + int i0, i1; + while (1) + { + i0 = abs(strint(ptr)); + i1 = abs(strint(ptr)); + if (!ptr) break; + for (i=i0; i<=imin(i1,q.L); i++) + for (j=1; j<=t.L; j++) + cell_off[i][j]=1; + } + } +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Allocate memory for data of new alignment (sequence names, alignment, scores,...) + */ +void +Hit::InitializeBacktrace(HMM& q, HMM& t) +{ + if (irep==1) //if this is the first single repeat repeat hit with this template + { + //Copy information about template profile to hit and reset template pointers to avoid destruction + longname=new(char[strlen(t.longname)+1]); + name =new(char[strlen(t.name)+1]); + file =new(char[strlen(t.file)+1]); + if (!file) MemoryError("space for alignments with database HMMs. \nNote that all alignments have to be kept in memory"); + strcpy(longname,t.longname); + strcpy(name,t.name); + strcpy(fam ,t.fam); + strcpy(sfam ,t.sfam); + strcpy(fold ,t.fold); + strcpy(cl ,t.cl); + strcpy(file,t.file); + sname=new(char*[t.n_display]); // Call Compare only once with irep=1 + seq =new(char*[t.n_display]); // Call Compare only once with irep=1 + if (!sname || !seq) + MemoryError("space for alignments with database HMMs.\nNote that all sequences for display have to be kept in memory"); + + for (int k=0; k<t.n_display; k++) { + if (NULL != t.sname){ + sname[k]=t.sname[k]; t.sname[k]=NULL; + } + else { + sname[k]=NULL; + } + seq[k] =t.seq[k]; t.seq[k]=NULL; + } + + n_display=t.n_display; t.n_display=0; + ncons = t.ncons; + nfirst = t.nfirst; + nss_dssp = t.nss_dssp; + nsa_dssp = t.nsa_dssp; + nss_pred = t.nss_pred; + nss_conf = t.nss_conf; + L = t.L; + Neff_HMM = t.Neff_HMM; + Eval = 1.0; + Pval = 1.0; + Pvalt = 1.0; + logPval = 0.0; + logPvalt= 0.0; + Probab = 1.0; + } + + // Allocate new space + this->i = new( int[i2+j2+2]); + this->j = new( int[i2+j2+2]); + states = new( char[i2+j2+2]); + S = S_ss = P_posterior = NULL; // set to NULL to avoid deleting data from irep=1 when hit with irep=2 is removed + Xcons = NULL; +} + +///////////////////////////////////////////////////////////////////////////////////// +// Some score functions +///////////////////////////////////////////////////////////////////////////////////// + + +/** + * @brief Calculate score between columns i and j of two HMMs (query and template) + */ +inline float +Score(float* qi, float* tj) +{ +// if (par.columnscore==9) +// return (tj[0] *qi[0] +tj[1] *qi[1] +tj[2] *qi[2] +tj[3] *qi[3] +tj[4]*qi[4] +// +tj[5] *qi[5] +tj[6] *qi[6] +tj[7] *qi[7] +tj[8] *qi[8] +tj[9]*qi[9] +// +tj[10]*qi[10]+tj[11]*qi[11]+tj[12]*qi[12]+tj[13]*qi[13]+tj[14]*qi[14] +// +tj[15]*qi[15]+tj[16]*qi[16]+tj[17]*qi[17]+tj[18]*qi[18]+tj[19]*qi[19]); +// else + return fast_log2( + tj[0] *qi[0] +tj[1] *qi[1] +tj[2] *qi[2] +tj[3] *qi[3] +tj[4] *qi[4] + +tj[5] *qi[5] +tj[6] *qi[6] +tj[7] *qi[7] +tj[8] *qi[8] +tj[9] *qi[9] + +tj[10]*qi[10]+tj[11]*qi[11]+tj[12]*qi[12]+tj[13]*qi[13]+tj[14]*qi[14] + +tj[15]*qi[15]+tj[16]*qi[16]+tj[17]*qi[17]+tj[18]*qi[18]+tj[19]*qi[19] + ); +} + +/** + * @brief Calculate score between columns i and j of two HMMs (query and template) + */ +inline float +ProbFwd(float* qi, float* tj) +{ + return tj[0] *qi[0] +tj[1] *qi[1] +tj[2] *qi[2] +tj[3] *qi[3] +tj[4] *qi[4] + +tj[5] *qi[5] +tj[6] *qi[6] +tj[7] *qi[7] +tj[8] *qi[8] +tj[9] *qi[9] + +tj[10]*qi[10]+tj[11]*qi[11]+tj[12]*qi[12]+tj[13]*qi[13]+tj[14]*qi[14] + +tj[15]*qi[15]+tj[16]*qi[16]+tj[17]*qi[17]+tj[18]*qi[18]+tj[19]*qi[19]; +} + + +/** + * @brief Calculate secondary structure score between columns i and j of two HMMs (query and template) + */ +inline float +Hit::ScoreSS(HMM& q, HMM& t, int i, int j, int ssm) +{ + switch (ssm) //SS scoring during alignment + { + case 0: // no SS scoring during alignment + return 0.0; + case 1: // t has dssp information, q has psipred information + return par.ssw * S73[ (int)t.ss_dssp[j]][ (int)q.ss_pred[i]][ (int)q.ss_conf[i]]; + case 2: // q has dssp information, t has psipred information + return par.ssw * S73[ (int)q.ss_dssp[i]][ (int)t.ss_pred[j]][ (int)t.ss_conf[j]]; + case 3: // q has dssp information, t has psipred information + return par.ssw * S33[ (int)q.ss_pred[i]][ (int)q.ss_conf[i]][ (int)t.ss_pred[j]][ (int)t.ss_conf[j]]; +// case 4: // q has dssp information, t has dssp information +// return par.ssw*S77[ (int)t.ss_dssp[j]][ (int)t.ss_conf[j]]; + } + return 0.0; +} + +/** + * @brief Calculate secondary structure score between columns i and j of two HMMs (query and template) + */ +inline float +Hit::ScoreSS(HMM& q, HMM& t, int i, int j) +{ + return ScoreSS(q,t,i,j,ssm2); +} + + +/** + * @brief Calculate score between columns i and j of two HMMs (query and template) + */ +inline float +Hit::ScoreTot(HMM& q, HMM& t, int i, int j) +{ + return Score(q.p[i],t.p[j]) + ScoreSS(q,t,i,j) + par.shift; +} + +/* + * Calculate score between columns i and j of two HMMs (query and template) + */ +inline float +Hit::ScoreAA(HMM& q, HMM& t, int i, int j) +{ + return Score(q.p[i],t.p[j]); +} + + +///////////////////////////////////////////////////////////////////////////////////// +/* + * Function for Viterbi() + */ +inline float +max2(const float& xMM, const float& xX, char& b) +{ + if (xMM>xX) { b=MM; return xMM;} else { b=SAME; return xX;} +} + + +///////////////////////////////////////////////////////////////////////////////////// +/* + * Functions for StochasticBacktrace() + */ + +inline int +pickprob2(const double& xMM, const double& xX, const int& state) +{ + if ( (xMM+xX)*frand() < xMM) return MM; else return state; +} + +inline int +pickprob3_GD(const double& xMM, const double& xDG, const double& xGD) +{ + double x = (xMM+xDG+xGD)*frand(); + if ( x<xMM) return MM; + else if ( x<xMM+xDG) return DG; + else return GD; +} + +inline int +pickprob3_IM(const double& xMM, const double& xMI, const double& xIM) +{ + double x = (xMM+xMI+xIM)*frand(); + if ( x<xMM) return MM; + else if ( x<xMM+xMI) return MI; + else return IM; +} + +inline int +pickprob6(const double& x0, const double& xMM, const double& xGD, const double& xIM, const double& xDG, const double& xMI) +{ + double x = (x0+xMM+xGD+xIM+xDG+xMI)*frand(); + x-=xMM; if (x<0) return MM; + x-=x0; if (x<0) return STOP; + x-=xGD; if (x<0) return GD; + x-=xIM; if (x<0) return IM; + if (x < xDG) return DG; else return MI; +} + +inline int +pickmax2(const double& xMM, const double& xX, const int& state) +{ + if (xMM > xX) return MM; else return state; +} + +inline int +pickmax3_GD(const double& xMM, const double& xDG, const double& xGD) +{ + char state; + double x; + if ( xMM>xDG) {state=MM; x=xMM;} + else {state=DG; x=xDG;} + if ( xGD>x) {state=GD; x=xGD;} + return state; +} + +inline int +pickmax3_IM(const double& xMM, const double& xMI, const double& xIM) +{ + char state; + double x; + if ( xMM>xMI) {state=MM; x=xMM;} + else {state=MI; x=xMI;} + if ( xIM>x) {state=IM; x=xIM;} + return state; +} + +inline int +pickmax6(const double& x0, const double& xMM, const double& xGD, const double& xIM, const double& xDG, const double& xMI) +{ + char state; + double x; + if ( x0 >xMM) {state=STOP; x=x0;} + else {state=MM; x=xMM;} + if ( xGD>x) {state=GD; x=xGD;} + if ( xIM>x) {state=IM; x=xIM;} + if ( xDG>x) {state=DG; x=xDG;} + if ( xMI>x) {state=MI; x=xMI;} + return state; +} + + +///////////////////////////////////////////////////////////////////////////////////// +//// Functions that calculate P-values and probabilities +///////////////////////////////////////////////////////////////////////////////////// + + +//// Evaluate the CUMULATIVE extreme value distribution at point x +//// p(s)ds = lamda * exp{ -exp[-lamda*(s-mu)] - lamda*(s-mu) } ds = exp( -exp(-x) - x) dx = p(x) dx +//// => P(s>S) = integral_-inf^inf {p(x) dx} = 1 - exp{ -exp[-lamda*(S-mu)] } +inline double +Pvalue(double x, double a[]) +{ + //a[0]=lamda, a[1]=mu + double h = a[0]*(x-a[1]); + return (h>10)? exp(-h) : double(1.0)-exp( -exp(-h)); +} + +inline double +Pvalue(float x, float lamda, float mu) +{ + double h = lamda*(x-mu); + return (h>10)? exp(-h) : (double(1.0)-exp( -exp(-h))); +} + +inline double +logPvalue(float x, float lamda, float mu) +{ + double h = lamda*(x-mu); + return (h>10)? -h : (h<-2.5)? -exp(-exp(-h)): log( ( double(1.0) - exp(-exp(-h)) ) ); +} + +inline double +logPvalue(float x, double a[]) +{ + double h = a[0]*(x-a[1]); + return (h>10)? -h : (h<-2.5)? -exp(-exp(-h)): log( ( double(1.0) - exp(-exp(-h)) ) ); +} + +// Calculate probability of true positive : p_TP(score)/( p_TP(score)+p_FP(score) ) +// TP: same superfamily OR MAXSUB score >=0.1 +inline double +Probab(Hit& hit) +{ + double s=-hit.score_aass; + double t; + if (s>200) return 100.0; + if (par.loc) + { + if (par.ssm && (hit.ssm1 || hit.ssm2) && par.ssw>0) + { + // local with SS + const double a=sqrt(6000.0); + const double b=2.0*2.5; + const double c=sqrt(0.12); + const double d=2.0*32.0; + t = a*exp(-s/b) + c*exp(-s/d); + } + else + { + // local no SS + const double a=sqrt(4000.0); + const double b=2.0*2.5; + const double c=sqrt(0.15); + const double d=2.0*34.0; + t = a*exp(-s/b) + c*exp(-s/d); + } + } + else + { + if ( (par.ssm>0) && (par.ssw>0) ) /* FIXME: was '&', should be '&&' (or not?) */ + { + // global with SS + const double a=sqrt(4000.0); + const double b=2.0*3.0; + const double c=sqrt(0.13); + const double d=2.0*34.0; + t = a*exp(-s/b) + c*exp(-s/d); + } + else + { + // global no SS + const double a=sqrt(6000.0); + const double b=2.0*2.5; + const double c=sqrt(0.10); + const double d=2.0*37.0; + t = a*exp(-s/b) + c*exp(-s/d); + } + + } + + return 100.0/(1.0+t*t); +} + +// #define Weff(Neff) (1.0+par.neffa*(Neff-1.0)+(par.neffb-4.0*par.neffa)/16.0*(Neff-1.0)*(Neff-1.0)) + +// ///////////////////////////////////////////////////////////////////////////////////// +// // Merge HMM with next aligned HMM +// ///////////////////////////////////////////////////////////////////////////////////// +// void Hit::MergeHMM(HMM& Q, HMM& t, float wk[]) +// { +// int i,j; // position in query and target +// int a; // amino acid +// int step; // alignment position (step=1 is end) +// float Weff_M, Weff_D, Weff_I; +// for (step=nsteps; step>=2; step--) // iterate only to one before last alignment column +// { +// i = this->i[step]; +// j = this->j[step]; +// switch(states[step]) +// { +// case MM: +// Weff_M = Weff(t.Neff_M[j]-1.0); +// Weff_D = Weff(t.Neff_D[j]-1.0); +// Weff_I = Weff(t.Neff_I[j]-1.0); +// for (a=0; a<20; a++) Q.f[i][a] += t.f[j][a]*wk[j]*Weff_M; +// switch(states[step-1]) +// { +// case MM: // MM->MM +// Q.tr_lin[i][M2M]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][M2D]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][M2I]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// Q.tr_lin[i][D2M]+= t.tr_lin[j][D2M]*wk[j]*Weff_D; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// case MI: // MM->MI +// Q.tr_lin[i][M2D]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][M2D]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][M2M]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2M]*wk[j]*Weff_D; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// case DG: // MM->DG +// Q.tr_lin[i][M2D]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][M2D]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][M2M]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2M]*wk[j]*Weff_D; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// case IM: // MM->IM +// Q.tr_lin[i][M2I]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][M2M]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][M2I]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// Q.tr_lin[i][D2M]+= t.tr_lin[j][D2M]*wk[j]*Weff_D; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// case GD: // MM->GD +// Q.tr_lin[i][M2I]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][M2M]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][M2I]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// Q.tr_lin[i][D2M]+= t.tr_lin[j][D2M]*wk[j]*Weff_D; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// } +// break; + +// case MI: // if gap in template +// Weff_I = Weff(t.Neff_I[j]-1.0); +// switch(states[step-1]) +// { +// case MI: // MI->MI +// Q.tr_lin[i][M2M]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// case MM: // MI->MM +// Q.tr_lin[i][M2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// break; +// } +// break; + +// case DG: +// Weff_M = Weff(t.Neff_M[j]-1.0); +// Weff_D = Weff(t.Neff_D[j]-1.0); +// Weff_I = Weff(t.Neff_I[j]-1.0); +// switch(states[step-1]) +// { +// case DG: // DG->DG +// Q.tr_lin[i][D2D]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2M]*wk[j]*Weff_D; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][M2M]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// Q.tr_lin[i][M2D]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// break; +// case MM: // DG->MM +// Q.tr_lin[i][D2M]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][D2M]+= t.tr_lin[j][D2M]*wk[j]*Weff_D; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// Q.tr_lin[i][M2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// break; +// } +// break; + +// case IM: // if gap in query +// Weff_M = Weff(t.Neff_M[j]-1.0); +// switch(states[step-1]) +// { +// case IM: // IM->IM +// Q.tr_lin[i][I2I]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// break; +// case MM: // IM->MM +// Weff_D = Weff(t.Neff_D[j]-1.0); +// Weff_I = Weff(t.Neff_I[j]-1.0); +// Q.tr_lin[i][I2M]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][D2M]*wk[j]*Weff_D; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// } +// break; + +// case GD: +// Weff_M = Weff(t.Neff_M[j]-1.0); +// switch(states[step-1]) +// { +// case GD: // GD->GD +// Weff_I = Weff(t.Neff_I[j]-1.0); +// Q.tr_lin[i][I2I]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// case MM: // GD->MM +// Weff_D = Weff(t.Neff_D[j]-1.0); +// Weff_I = Weff(t.Neff_I[j]-1.0); +// Q.tr_lin[i][I2M]+= t.tr_lin[j][M2M]*wk[j]*Weff_M; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][M2D]*wk[j]*Weff_M; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][M2I]*wk[j]*Weff_M; +// Q.tr_lin[i][D2D]+= t.tr_lin[j][D2D]*wk[j]*Weff_D; +// Q.tr_lin[i][I2M]+= t.tr_lin[j][I2M]*wk[j]*Weff_I; +// Q.tr_lin[i][I2I]+= t.tr_lin[j][I2I]*wk[j]*Weff_I; +// break; +// } +// break; + +// } +// } +// i = this->i[step]; +// j = this->j[step]; +// Weff_M = Weff(t.Neff_M[j]-1.0); +// for (a=0; a<20; a++) Q.f[i][a] += t.f[j][a]*wk[j]*Weff_M; +// } + + +#ifdef CLUSTALO +/* @* Hit::ClobberGlobal (eg, hit) + * + */ +void +Hit::ClobberGlobal(void){ + + if (i){ + //delete[] i; + i = NULL; + } + if (j){ + //delete[] j; + j = NULL; + } + if (states){ + //delete[] states; + states = NULL; + } + if (S){ + //delete[] S; + S = NULL; + } + if (S_ss){ + //delete[] S_ss; + S_ss = NULL; + } + if (P_posterior){ + //delete[] P_posterior; + P_posterior = NULL; + } + if (Xcons){ + //delete[] Xcons; + Xcons = NULL; + } + // delete[] l; l = NULL; + i = j = NULL; + states = NULL; + S = S_ss = P_posterior = NULL; + Xcons = NULL; + if (irep==1) // if irep>1 then longname etc point to the same memory locations as the first repeat. + { // but these have already been deleted. + // printf("Delete name = %s\n",name);////////////////////////// + //delete[] longname; + longname = NULL; + //delete[] name; + name = NULL; + //delete[] file; + file = NULL; + //delete[] dbfile; + dbfile = NULL; + /*for (int k=0; k<n_display; k++) + { + delete[] sname[k]; sname[k] = NULL; + delete[] seq[k]; seq[k] = NULL; + }*/ + //delete[] sname; + sname = NULL; + //delete[] seq; + seq = NULL; + } + + score = score_sort = score_aass = 0.0; + Pval = Pvalt = Eval = Probab = 0; + Pforward = sum_of_probs = 0.00; + L = irep = nrep = n_display = nsteps = 0; + i1 = i2 = j1 = j2 = matched_cols = min_overlap = 0; +} +#endif + + +/* + * EOF hhhit-C.h + */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhhit.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,192 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhhit.h 143 2010-10-14 13:11:14Z andreas $ + */ + +// hhhit.h + +////////////////////////////////////////////////////////////////////////////// +/* Describes an alignment of two profiles. + Used as list element in Hits : List<Hit> */ +////////////////////////////////////////////////////////////////////////////// +class Hit +{ + public: + char* longname; // Name of HMM + char* name; // One-word name of HMM + char* file; // Basename (with path, without extension) of alignment file that was used to construct the HMM + // (path from db-file is prepended to FILE record in HMM file!) + char fam[IDLEN]; // family ID (derived from name) (FAM field) + char sfam[IDLEN]; // superfamily ID (derived from name) + char fold[IDLEN]; // fold ID (derived from name) + char cl[IDLEN]; // class ID (derived from name) + int index; // index of HMM in order of reading in (first=0) + char* dbfile; // full database file name from which HMM was read + long ftellpos; // start position of HMM in database file + + float score; // Score of alignment (i.e. of Viterbi path) + float score_sort; // score to sort hits in output list (negative means first/best!) + float score_aass; // first: just hit.score, then hit.logPval-SSSCORE2NATLOG*hit.score_ss;(negative means best!) + float score_ss; // Part of score due to secondary structure + float Pval; // P-value for whole protein based on score distribution of query + float Pvalt; // P-value for whole protein based on score distribution of template + float logPval; // natural logarithm of Pval + float logPvalt; // natural logarithm of Pvalt + float Eval; // E-value for whole protein + float Probab; // probability in % for a positive (depends only on score) + float weight; // weight of hit for P-value calculation (= 1/#HMMs-in-family/#families-in-superfamily) + double Pforward; // scaled total forward probability : Pforward * Product_{i=1}^{Lq+1}(scale[i]) + +/* float score_comp; // compositional similarity score */ +/* float logPcomp; // natural logarithm of Pvalue for compositional similarity score */ +/* float Prep; // P-value for single-repeat hit */ +/* float Erep; // E-value for single-repeat hit */ +/* float logPrep; // natural logarithm of P-value for single-repeat hit */ + float E1val; // E-value for whole protein from transitive scoring + float logP1val; // natural logarithm of P1val, the transitive P-value + + int L; // Number of match states in template + int irep; // Index of single-repeat hit (1: highest scoring repeat hit) + int nrep; // Number of single-repeat hits with one template + + int n_display; // number of sequences stored for display of alignment + char** sname; // names of stored sequences + char** seq; // residues of stored sequences (first at pos 1) + int nss_dssp; // index of dssp secondary structure sequence in seq[] + int nsa_dssp; // index of of dssp solvent accessibility in seq[] + int nss_pred; // index of dssp secondary structure sequence in seq[] + int nss_conf; // index of dssp secondary structure sequence in seq[] + int nfirst; // index of query sequence in seq[] + int ncons; // index of consensus sequence + + int nsteps; // index for last step in Viterbi path; (first=1) + int* i; // i[step] = query match state at step of Viterbi path + int* j; // j[step] = template match state at step of Viterbi path + char* states; // state at step of Viterbi path 0: Start 1: M(MM) 2: A(-D) 3: B(IM) 4: C(D-) 5 D(MI) + float* S; // S[step] = match-match score contribution at alignment step + float* S_ss; // S_ss[step] = secondary structure score contribution + float* P_posterior; // P_posterior[step] = posterior prob for MM states (otherwise zero) + char* Xcons; // consensus sequence for aligned states in internal representation (A=0 R=1 N=2 D=3 ...) + int i1; // First aligned residue in query + int i2; // Last aligned residue in query + int j1; // First aligned residue in template + int j2; // Last aligned residue in template + int matched_cols; // number of matched columns in alignment against query + int ssm1; // SS scoring AFTER alignment? 0:no 1:yes; t->dssp q->psipred 2:yes; q->dssp t->psipred + int ssm2; // SS scoring DURING alignment? 0:no 1:yes; t->dssp q->psipred 2:yes; q->dssp t->psipred + char self; // 0: align two different HMMs 1: align HMM with itself + int min_overlap; // Minimum overlap between query and template + float sum_of_probs; // sum of probabilities for Maximum ACcuracy alignment (if dssp states defined, only aligned pairs with defined dssp state contribute to sum) + float Neff_HMM; // Diversity of underlying alignment + + // Constructor (only set pointers to NULL) + Hit(); + ~Hit(){}; + + // Free all allocated memory (to delete list of hits) + void Delete(); + + // Allocate/delete memory for dynamic programming matrix + void AllocateBacktraceMatrix(int Nq, int Nt); + void DeleteBacktraceMatrix(int Nq); + void AllocateForwardMatrix(int Nq, int Nt); + void DeleteForwardMatrix(int Nq); + void AllocateBackwardMatrix(int Nq, int Nt); + void DeleteBackwardMatrix(int Nq); + + // Compare an HMM with overlapping subalignments + void Viterbi(HMM& q, HMM& t, float** Sstruc=NULL); + + // Compare two HMMs with each other in lin space + void Forward(HMM& q, HMM& t, float** Pstruc=NULL); + + // Compare two HMMs with each other in lin space + void Backward(HMM& q, HMM& t); + + // Find maximum accuracy alignment (after running Forward and Backward algorithms) + void MACAlignment(HMM& q, HMM& t); + + // Trace back alignment of two profiles based on matrices bXX[][] + void Backtrace(HMM& q, HMM& t); + + // Trace back alignment of two profiles based on matrices bXX[][] + void StochasticBacktrace(HMM& q, HMM& t, char maximize=0); + + // Trace back MAC alignment of two profiles based on matrix bMM[][] + void BacktraceMAC(HMM& q, HMM& t); + + // Calculate secondary structure score between columns i and j of two HMMs (query and template) + inline float ScoreSS(HMM& q, HMM& t, int i, int j, int ssm); + + // Calculate secondary structure score between columns i and j of two HMMs (query and template) + inline float ScoreSS(HMM& q, HMM& t, int i, int j); + + // Calculate total score (including secondary structure score and compositional bias correction + inline float ScoreTot(HMM& q, HMM& t, int i, int j); + + // Calculate score (excluding secondary structure score and compositional bias correction + inline float ScoreAA(HMM& q, HMM& t, int i, int j); + + // Comparison (used to sort list of hits) + int operator<(const Hit& hit2) {return score_sort<hit2.score_sort;} + + // Merge HMM with next aligned HMM + void MergeHMM(HMM& Q, HMM& t, float wk[]); + +#ifdef CLUSTALO + void ClobberGlobal(void); +#endif + + + double** B_MM; // Backward matrices + +private: + char state; // 0: Start/STOP state 1: MM state 2: GD state (-D) 3: IM state 4: DG state (D-) 5 MI state + char** bMM; // (backtracing) bMM[i][j] = STOP:start of alignment MM:prev was MM GD:prev was GD etc + char** bGD; // (backtracing) bMM[i][j] = STOP:start of alignment MM:prev was MM SAME:prev was GD + char** bDG; // (backtracing) + char** bIM; // (backtracing) + char** bMI; // (backtracing) + char** cell_off; // cell_off[i][j]=1 means this cell will get score -infinity + + double** F_MM; // Forward matrices + double** F_GD; // F_XY[i][j] * Prod_1^i(scale[i]) + double** F_DG; // = Sum_x1..xl{ P(HMMs aligned up to Xi||Yj co-emmitted x1..xl ) / (Prod_k=1^l f(x_k)) } + double** F_IM; // end gaps are not penalized! + double** F_MI; // + double* scale; // + + double** B_GD; // B_XY[i][j] * Prod_i+1^(L+1) (scale[i]) + double** B_DG; // = Sum_x2..xl{ P(HMMs aligned from Xi||Yj to end co-emmitted x2..xl ) / (Prod_k=2^l f(x_k)) } + double** B_IM; // end gaps are not penalized! + double** B_MI; // + + void InitializeBacktrace(HMM& q, HMM& t); + void InitializeForAlignment(HMM& q, HMM& t); +}; + + +double Pvalue(double x, double a[]); +double Pvalue(float x, float lamda, float mu); +double logPvalue(float x, float lamda, float mu); +double logPvalue(float x, double a[]); +double Probab(Hit& hit); + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhhitlist-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,3198 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhhitlist-C.h 199 2011-02-21 18:24:49Z fabian $ + */ + +// hhhitlist.C + +#ifndef MAIN +#define MAIN +#include <iostream> // cin, cout, cerr +#include <fstream> // ofstream, ifstream +#include <stdio.h> // printf +#include <stdlib.h> // exit +#include <string> // strcmp, strstr +#include <math.h> // sqrt, pow +#include <limits.h> // INT_MIN +#include <float.h> // FLT_MIN +#include <time.h> // clock +#include <ctype.h> // islower, isdigit etc +using std::ios; +using std::ifstream; +using std::ofstream; +using std::cout; +using std::cerr; +using std::endl; +#include "util-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "list.h" // list data structure +#include "hash.h" // hash data structure +#include "hhdecl-C.h" // constants, class +#include "hhutil-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "hhhmm.h" // class HMM +#include "hhalignment.h" // class Alignment +#include "hhhit.h" +#include "hhhalfalignment.h" +#include "hhfullalignment.h" +#endif + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// Methods of class HitList +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Print summary listing of hits + */ +void +HitList::PrintHitList(HMM& q, char* outfile) +{ + Hit hit; + int nhits=0; + char str[NAMELEN]=""; + + FILE* outf=NULL; + if (strcmp(outfile,"stdout")) + { + outf=fopen(outfile,"w"); + if (!outf) OpenFileError(outfile); + } + else + outf = stdout; + + + fprintf(outf,"Query %s\n",q.longname); +// fprintf(outf,"Family %s\n",q.fam); + fprintf(outf,"Match_columns %i\n",q.L); + fprintf(outf,"No_of_seqs %i out of %i\n",q.N_filtered,q.N_in); + fprintf(outf,"Neff %-4.1f\n",q.Neff_HMM); + fprintf(outf,"Searched_HMMs %i\n",N_searched); + + // Print date stamp + time_t* tp=new(time_t); + *tp=time(NULL); + fprintf(outf,"Date %s",ctime(tp)); + delete (tp); (tp) = NULL; + + // Print command line + fprintf(outf,"Command "); + for (int i=0; i<par.argc; i++) + if (strlen(par.argv[i])<=par.maxdbstrlen) + fprintf(outf,"%s ",par.argv[i]); + else + fprintf(outf,"<%i characters> ",(int)strlen(par.argv[i])); + fprintf(outf,"\n\n"); + +#ifdef WINDOWS + if (par.trans) + fprintf(outf," No Hit Prob E-trans E-value Score SS Cols Query HMM Template HMM\n"); + else + fprintf(outf," No Hit Prob E-value P-value Score SS Cols Query HMM Template HMM\n"); +#else + if (par.trans) + fprintf(outf," No Hit Prob E-trans E-value Score SS Cols Query HMM Template HMM\n"); + else + fprintf(outf," No Hit Prob E-value P-value Score SS Cols Query HMM Template HMM\n"); +#endif + + Reset(); + while (!End()) // print hit list + { + hit = ReadNext(); + if (nhits>=par.Z) break; //max number of lines reached? + if (nhits>=par.z && hit.Probab < par.p) break; + if (nhits>=par.z && hit.Eval > par.E) continue; +// if (hit.matched_cols <=1) continue; // adding this might get to intransparent... analogous statement in PrintAlignments + nhits++; + sprintf(str,"%3i %-30.30s ",nhits,hit.longname); + + +#ifdef WINDOWS + if (par.trans) // Transitive scoring + fprintf(outf,"%-34.34s %5.1f %8.2G %8.2G %6.1f %5.1f %4i ",str,hit.Probab,hit.E1val,hit.Eval,hit.score,hit.score_ss,hit.matched_cols); + else // Normal scoring + fprintf(outf,"%-34.34s %5.1f %8.2G %8.2G %6.1f %5.1f %4i ",str,hit.Probab,hit.Eval,hit.Pval,hit.score,hit.score_ss,hit.matched_cols); +#else + if (par.trans) // Transitive scoring + fprintf(outf,"%-34.34s %5.1f %7.2G %7.2G %6.1f %5.1f %4i ",str,hit.Probab,hit.E1val,hit.Eval,hit.score,hit.score_ss,hit.matched_cols); + else // Normal scoring + fprintf(outf,"%-34.34s %5.1f %7.2G %7.2G %6.1f %5.1f %4i ",str,hit.Probab,hit.Eval,hit.Pval,hit.score,hit.score_ss,hit.matched_cols); +#endif + + sprintf(str,"%4i-%-4i ",hit.i1,hit.i2); + fprintf(outf,"%-10.10s",str); + sprintf(str,"%4i-%-4i",hit.j1,hit.j2); + fprintf(outf,"%-9.9s(%i)\n",str,hit.L); + } //end print hit list + fprintf(outf,"\n"); + if (strcmp(outfile,"stdout")) fclose(outf); +} + + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Print alignments of query sequences against hit sequences + */ +void +HitList::PrintAlignments( + + +#ifdef CLUSTALO + char **ppcFirstProf, char **ppcSecndProf, +#endif + HMM& q, char* outfile, char outformat) +{ + Hit hit; + FullAlignment qt_ali(par.nseqdis+10); // maximum 10 annotation (pseudo) sequences (ss_dssp, sa_dssp, ss_pred, ss_conf, consens,...) + int nhits=0; + +#ifndef CLUSTALO_NOFILE + FILE* outf=NULL; + if (strcmp(outfile,"stdout")) + { + if (outformat==0) + outf=fopen(outfile,"a"); //append to summary hitlist + else + outf=fopen(outfile,"w"); //open for writing + if (!outf) OpenFileError(outfile); + } + else + outf = stdout; +#endif + + Reset(); + while (!End()) // print hit list + { + if (nhits>=par.B) break; //max number of lines reached? + hit = ReadNext(); + if (nhits>=par.b && hit.Probab < par.p) break; + if (nhits>=par.b && hit.Eval > par.E) continue; + // // adding this might get to intransparent... + // // analogous statement in PrintHitlist and hhalign.C + // if (hit.matched_cols <=1) continue; + nhits++; + + // Build double alignment of query against template sequences + qt_ali.Build(q,hit); + +#ifndef CLUSTALO + // Print out alignment + if (outformat==0) // HHR format + { + fprintf(outf,"No %-3i\n",nhits); + qt_ali.PrintHeader(outf,q,hit); + qt_ali.PrintHHR(outf,hit); + } + else if (outformat==1) // FASTA format + { + fprintf(outf,"# No %-3i\n",nhits); + qt_ali.PrintFASTA(outf,hit); + } + else if(outformat==2) // A2M format + { + fprintf(outf,"# No %-3i\n",nhits); + qt_ali.PrintA2M(outf,hit); + } + else // A3m format + { + fprintf(outf,"# No %-3i\n",nhits); + qt_ali.PrintA3M(outf,hit); + } +#else + qt_ali.OverWriteSeqs(ppcFirstProf, ppcSecndProf); +#endif + + qt_ali.FreeMemory(); + } +#ifndef CLUSTALO_NOFILE + if (strcmp(outfile,"stdout")) fclose(outf); +#endif +} + + + + + +//////////////////////////////////////////////////////////////////////////// +/** + * @brief Return the ROC_5 score for optimization + * (changed 28.3.08 by Michael & Johannes) + */ +void +HitList::Optimize(HMM& q, char* buffer) +{ + const int NFAM =5; // calculate ROC_5 score + const int NSFAM=5; // calculate ROC_5 score + int roc=0; // ROC score + int fam=0; // number of hits from same family (at current threshold) + int not_fam=0; // number of hits not from same family + int sfam=0; // number of hits from same suporfamily (at current threshold) + int not_sfam=0; // number of hits not from same superfamily + Hit hit; + + SortList(); + Reset(); + while (!End()) + { + hit = ReadNext(); + if (!strcmp(hit.fam,q.fam)) fam++; // query and template from same superfamily? => positive + else if (not_fam<NFAM) // query and template from different family? => negative + { + not_fam++; + roc += fam; + } + if (!strcmp(hit.sfam,q.sfam)) sfam++; // query and template from same superfamily? => positive + else if (not_sfam<NSFAM) // query and template from different superfamily? => negative + { + not_sfam++; + roc += sfam; + } +// printf("qfam=%s tfam=%s qsfam=%s tsfam=%s fam=%-2i not_fam=%3i sfam=%-3i not_sfam=%-5i roc=%-3i\n",q.fam,hit.fam,q.sfam,hit.sfam,fam,not_fam,sfam,not_sfam,roc); + } + + // Write ROC score to file or stdout + FILE* buf=NULL; + if (strcmp(par.buffer,"stdout")) + { + buf=fopen(buffer,"w"); + if (!buf) OpenFileError(par.buffer); + } + else + buf = stdout; + + fprintf(buf,"%f\n",float(roc)/float(fam*NFAM+sfam*NSFAM)); // must be between 0 and 1 + if (v>=2) printf("ROC=%f\n",float(roc)/float(fam*NFAM+sfam*NSFAM)); + fclose(buf); +} + + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Print score distribution into file score_dist + */ +void +HitList::PrintScoreFile(HMM& q) +{ + int i=0, n; + FILE* scoref=NULL; + Hit hit; + Hash<int> twice(10000); // make sure only one hit per HMM is listed + twice.Null(-1); + + if (strcmp(par.scorefile,"stdout")) + { + scoref=fopen(par.scorefile,"w"); + if (!scoref) + {cerr<<endl<<"WARNING from "<<par.argv[0]<<": could not open \'"<<par.scorefile<<"\'\n"; return;} + } + else + scoref = stdout; + Reset(); + fprintf(scoref,"NAME %s\n",q.longname); + fprintf(scoref,"FAM %s\n",q.fam); + fprintf(scoref,"FILE %s\n",q.file); + fprintf(scoref,"LENG %i\n",q.L); + fprintf(scoref,"\n"); +//fprintf(scoref,"TARGET REL LEN COL LOG-PVA S-TOT MS NALI\n"); + +//For hhformat, the PROBAB field has to start at position 41 !! +// ----+----1----+----2----+----3----+----4----+---- + fprintf(scoref,"TARGET FAMILY REL LEN COL LOG-PVA S-AASS PROBAB SCORE\n"); + // d153l__ 5 185 185 287.82 464.22 100.00 + // d1qsaa2 3 168 124 145.55 239.22 57.36 + while (!End()) + { + i++; + hit = ReadNext(); + if (twice[hit.name]==1) continue; // better hit with same HMM has been listed already + twice.Add(hit.name,1); + //if template and query are from the same superfamily + if (!strcmp(hit.name,q.name)) n=5; + else if (!strcmp(hit.fam,q.fam)) n=4; + else if (!strcmp(hit.sfam,q.sfam)) n=3; + else if (!strcmp(hit.fold,q.fold)) n=2; + else if (!strcmp(hit.cl,q.cl)) n=1; + else n=0; + fprintf(scoref,"%-10s %-10s %1i %3i %3i %s %7.2f %6.2f %7.2f\n",hit.name,hit.fam,n,hit.L,hit.matched_cols,sprintg(-1.443*hit.logPval,7),-hit.score_aass,hit.Probab,hit.score); + } + fclose(scoref); +} + + +inline double +logPvalue_HHblast(double s, double corr) +{ + return -s*(1.0-0.5*corr) + (1.0-corr)*log(1.0+s); +// return -s*(1.0-0.5*corr) + log( 1.0+(1.0-corr)*s ); +// return -s*(1.0-0.5*corr) + log( 1.0+(1.0-corr)*(1.0-0.5*corr)*s ); +} + +inline double +Pvalue_HHblast(double s, double corr) +{ + return exp(-s*(1.0-0.5*corr)) * pow(1.0+s,1.0-corr); +// return exp(-s*(1.0-0.5*corr)) * ( 1.0+(1.0-corr)*s ); +// return exp(-s*(1.0-0.5*corr)) * ( 1.0+(1.0-corr)*(1.0-0.5*corr)*s ); +} + +inline double +logLikelihood_HHblast(double s, double corr) +{ + if (s<0.0) { s=0.0; if (corr<1E-5) corr=1E-5; else if (corr>0.99999) corr=0.99999; } + else { if (corr<0.0) corr=0.0; else if (corr>1.0) corr=1.0; } + return -s*(1.0-0.5*corr) - corr*log(1.0+s) + log(s*(1.0-0.5*corr)+0.5*corr); + // return -s*(1.0-0.5*corr) + log( s*(1.0-corr)*(1.0-0.5*corr)+0.5*corr ); + // return -s*(1.0-0.5*corr) + log((s*(1.0-corr)*(1.0-0.5*corr)+corr)*(1.0-0.5*corr)); +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Evaluate the *negative* log likelihood for the order statistic of the uniform distribution + * for the best 10% of hits (vertex v = (corr,offset) ) + * The k'th order statistic for X~Uniform is p:=X^(k)~Beta(k,n-k+1) = const*p^(k-1)*(1-p)^(n-k) + * Needed to fit the correlation and score offset in HHblast +*/ +double +HitList::RankOrderFitCorr(double* v) +{ + double sum=0.0; +// printf("%8.2G %8.2G %i\n",v[0],v[1],Nprof); + int i1 = imin(Nprof,imax(50,int(0.05*Nprof))); + for (int i=0; i<i1; i++) + { + double p = Pvalue_HHblast(score[i]+v[1],v[0]); +// sum -= (1.0-double(i)/double(i1)) * weight[i] * ( double(i)*log(p) + (Nprof-i-1.0)*log(1.0-p) ); + float diff = p-(float(i)+1.0)/(Nprof+1.0); + sum += (1.0-double(i)/double(i1)) * weight[i]*diff*diff*(Nprof+1.0)*(Nprof+1.0)*(Nprof+2.0)/(i+10.0)/(Nprof-i); +// printf("%-3i Pval=%7.5f Preal=%7.5f diff=%7.5f sum=%7.5f\n",i,p,float(i+1)/(1.0+Nprof),diff,sum); + } + return sum; +} + +/** + * @brief Static wrapper-function for calling the nonstatic member function RankOrderFitCorr() + * ( see http://www.newty.de/fpt/callback.html#member ) + */ +double +HitList::RankOrderFitCorr_static(void* pt2hitlist, double* v) +{ + HitList* mySelf = (HitList*) pt2hitlist; // explicitly cast to a pointer to Hitlist + return mySelf->RankOrderFitCorr(v); // call member function +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Evaluate the *negative* log likelihood of the data at the vertex v = (corr,offset) + * Needed to fit the correlation and score offset in HHblast + */ +double +HitList::LogLikelihoodCorr(double* v) +{ + double sum=0.0; +// printf("%8.2G %8.2G %i\n",v[0],v[1],Nprof); + for (int i=0; i<Nprof; i++) + { + sum -= weight[i]*logLikelihood_HHblast(score[i]+v[1],v[0]); +// printf("%-3i Pval=%7.5f Preal=%7.5f diff=%7.5f rmsd=%7.5f sum=%7.5f\n",i,Pvalue_HHblast(score[i],v[0]),float(i)/(1.0+Nprof),x,sqrt(sum/sumw),sum); + } + return sum; +} + +/** + * @brief Static wrapper-function for calling the nonstatic member function LogLikelihoodCorr() + * ( see http://www.newty.de/fpt/callback.html#member ) + */ +double +HitList::LogLikelihoodCorr_static(void* pt2hitlist, double* v) +{ + HitList* mySelf = (HitList*) pt2hitlist; // explicitly cast to a pointer to Hitlist + return mySelf->LogLikelihoodCorr(v); // call member function +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Evaluate the *negative* log likelihood of the data at the vertex v = (lamda,mu) + * p(s) = lamda * exp{ -exp[-lamda*(s-mu)] - lamda*(s-mu) } = lamda * exp( -exp(-x) - x) + */ +double +HitList::LogLikelihoodEVD(double* v) +{ + double sum=0.0, sumw=0.0; + for (int i=0; i<Nprof; i++) + { + double x = v[0]*(score[i]-v[1]); + sum += weight[i]*(exp(-x)+x); + sumw += weight[i]; + } + return sum - sumw*log(v[0]); +} + +/** + * @brief Static wrapper-function for calling the nonstatic member function LogLikelihoodEVD() + * ( see http://www.newty.de/fpt/callback.html#member ) + */ +double +HitList::LogLikelihoodEVD_static(void* pt2hitlist, double* v) +{ + HitList* mySelf = (HitList*) pt2hitlist; // explicitly cast to a pointer to Hitlist + return mySelf->LogLikelihoodEVD(v); // call member function +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Subroutine to FindMin: try new point given by highest point ihigh and fac and replace ihigh if it is lower + */ +double +HitList::TryPoint(const int ndim, double* p, double* y, double* psum, int ihigh, double fac, double (*Func)(void* pt2hitlist, double* v)) +{ + // New point p_try = p_c + fac*(p_high-p_c), + // where p_c = ( sum_i (p_i) - p_high)/ndim is the center of ndim other points + // => p_try = fac1*sum_i(p_i) + fac2*p_high + double fac1=(1.-fac)/ndim; + double fac2=fac-fac1; + double ptry[ndim]; //new point to try out + double ytry; //function value of new point + int j; //index for the ndim parameters + + for (j=0; j<ndim; j++) + ptry[j]=psum[j]*fac1+p[ihigh*ndim+j]*fac2; + ytry = (*Func)(this,ptry); + if (ytry<=y[ihigh]) + { +// if (v>=4) printf("Trying: %-7.3f %-7.3f %-7.3f -> accept\n",ptry[0],ptry[1],ytry); + y[ihigh]=ytry; + for (j=0; j<ndim; j++) + { + psum[j] += ptry[j]-p[ihigh*ndim+j]; //update psum[j] + p[ihigh*ndim+j]=ptry[j]; //replace p[ihigh] with ptry + } //Note: ihigh is now not highest point anymore! + } +// else if (v>=4) printf("Trying: %-7.3f %-7.3f %-7.3f -> reject\n",ptry[0],ptry[1],ytry); + + return ytry; +} + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Find minimum with simplex method of Nelder and Mead (1965) + */ +float +HitList::FindMin(const int ndim, double* p, double* y, double tol, int& nfunc, double (*Func)(void* pt2hitlist, double* v)) +{ + const int MAXNFUNC=99; //maximum allowed number of function evaluations + int ihigh; //index of highest point on simplex + int inext; //index of second highest point on simplex + int ilow; //index of lowest point on simplex + int i; //index for the ndim+1 points + int j; //index for the ndim parameters + double rtol; //tolerance: difference of function value between highest and lowest point of simplex + double temp; //dummy + double ytry; //function value of trial point + double psum[ndim]; //psum[j] = j'th coordinate of sum vector (sum over all vertex vectors) + + nfunc=0; //number of function evaluations =0 + //Calculate sum vector psum[j] + for (j=0; j<ndim; j++) + { + psum[j]=p[j]; + for (i=1; i<ndim+1; i++) + psum[j]+=p[i*ndim+j]; + } + + // Repeat finding better points in simplex until rtol<tol + while(1) + { + // Find indices for highest, next highest and lowest point + ilow=0; + if (y[0]>y[1]) {inext=1; ihigh=0;} else {inext=0; ihigh=1;} + for (i=0; i<ndim+1; i++) + { + if (y[i]<=y[ilow]) ilow=i; + if (y[i]>y[ihigh]) {inext=ihigh; ihigh=i;} + else if (y[i]>y[inext] && i!= ihigh) inext=i; + } + + // If tolerance in y is smaller than tol swap lowest point to index 0 and break -> return + rtol = 2.*fabs(y[ihigh]-y[ilow]) / (fabs(y[ihigh])+fabs(y[ilow])+1E-10); + if (rtol<tol) + { + temp=y[ilow]; y[ilow]=y[0]; y[0]=temp; + for (j=0; j<ndim; j++) + { + temp=p[ilow*ndim+j]; p[ilow*ndim+j]=p[j]; p[j]=temp; + } + break; + } + + // Max number of function evaluations exceeded? + if (nfunc>=MAXNFUNC ) + { + if (v) fprintf(stderr,"\nWARNING: maximum likelihood fit of score distribution did not converge.\n"); + return 1; + } + + nfunc+=2; + // Point-reflect highest point on the center of gravity p_c of the other ndim points of the simplex + if (v>=3) printf("%3i %-7.3f %-7.3f %-12.8f %-9.3E\n",nfunc,p[ilow*ndim],p[ilow*ndim+1],y[ilow],rtol); +// if (v>=2) printf(" %3i %-9.3E %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f\n",nfunc,rtol,p[ilow*ndim],p[ilow*ndim+1],y[ilow],p[inext*ndim],p[inext*ndim+1],y[inext],p[ihigh*ndim],p[ihigh*ndim+1],y[ihigh]); + ytry = TryPoint(ndim,p,y,psum,ihigh,-1.0,Func); //reflect highest point on p_c + + if (ytry<=y[ilow]) + { + ytry = TryPoint(ndim,p,y,psum,ihigh,2.0,Func); //expand: try new point 2x further away from p_c +// if (v>=2) printf("Expanded: %3i %-9.3E %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f\n",nfunc,rtol,p[ilow*ndim],p[ilow*ndim+1],y[ilow],p[inext*ndim],p[inext*ndim+1],y[inext],p[ihigh*ndim],p[ihigh*ndim+1],y[ihigh]); + } + else if (ytry>=y[inext]) + { + // The new point is worse than the second worst point + temp=y[ihigh]; + ytry=TryPoint(ndim,p,y,psum,ihigh,0.5,Func); //contract simplex by 0.5 along (p_high-p_c +// if (v>=2) printf("Compressed:%3i %-9.3E %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f\n",nfunc,rtol,p[ilow*ndim],p[ilow*ndim+1],y[ilow],p[inext*ndim],p[inext*ndim+1],y[inext],p[ihigh*ndim],p[ihigh*ndim+1],y[ihigh]); + if (ytry>=temp) + { + // Trial point is larger than worst point => contract simplex by 0.5 towards lowest point + for (i=0; i<ndim+1; i++) + { + if (i!=ilow) + { + for (j=0; j<ndim; j++) + p[i*ndim+j]=0.5*(p[i*ndim+j]+p[ilow+j]); + y[i] = (*Func)(this,p+i*ndim); +// y[i] = (*Func)(p+i*ndim); + } + } + nfunc+=ndim; +// if (v>=2) printf("Contracted:%3i %-9.3E %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f %-7.3f\n",nfunc,rtol,p[ilow*ndim],p[ilow*ndim+1],y[ilow],p[inext*ndim],p[inext*ndim+1],y[inext],p[ihigh*ndim],p[ihigh*ndim+1],y[ihigh]); + + //Calculate psum[j] + for (j=0; j<ndim; j++) + { + psum[j]=p[j]; + for (i=1; i<ndim+1; i++) + psum[j]+=p[i*ndim+j]; + } + } + } + else nfunc--; + } + return (float)rtol; +} + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Do a maximum likelihod fit of the scores with an EV distribution with parameters lamda and mu + */ +void +HitList::MaxLikelihoodEVD(HMM& q, int nbest) +{ + double tol=1E-6; // Maximum relative tolerance when minimizing -log(P)/N (~likelihood) + static char first_call=1; + static Hash<int> size_fam(MAXPROF/10); // Hash counts number of HMMs in family + static Hash<int> size_sfam(MAXPROF/10); // Hash counts number of families in superfamily + Hash<int> excluded(50); // Hash containing names of superfamilies to be excluded from fit + size_fam.Null(0); // Set int value to return when no data can be retrieved + size_sfam.Null(0); // Set int value to return when no data can be retrieved + excluded.Null(0); // Set int value to return when no data can be retrieved + Hit hit; + + double mu; // EVD[mu,lam](x) = exp(-exp(-(x-mu)/lam)) = P(score<=x) + double vertex[2*3]; // three vertices of the simplex in lamda-mu plane + double yvertex[3]; // log likelihood values at the three vertices of the simplex + int nfunc=0; // number of function calls + double sum_weights=0.0; + float sum_scores=0.0; + float rtol; + + if (first_call==1) + { + first_call=0; + // Count how many HMMs are in each family; set number of multiple hits per template nrep + if (v>=4) printf(" count number of profiles in each family and families in each superfamily ...\n"); + Reset(); + while (!End()) + { + hit = ReadNext(); + if (!size_fam.Contains(hit.fam)) (*size_sfam(hit.sfam))++; //Add one to hash element for superfamily + (*size_fam(hit.fam))++; //Add one to hash element for family + // printf("size(%s)=%i name=%s\n",hit.fam,*size_fam(hit.fam),hit.name) + } + fams=size_fam.Size(); + sfams=size_sfam.Size(); + if (v>=3) + printf("%-3i HMMs from %i families and %i superfamilies searched. Found %i hits\n",N_searched,fams,sfams,Size()); + } + + // Query has SCOP family identifier? + if (q.fam && q.fam[0]>='a' && q.fam[0]<='k' && q.fam[1]=='.') + { + char sfamid[NAMELEN]; + char* ptr_in_fam=q.fam; + while ((ptr_in_fam=strwrd(sfamid,ptr_in_fam,'-'))) + { + char* ptr=strrchr(sfamid,'.'); + if (ptr) *ptr='\0'; + excluded.Add(sfamid); +// fprintf(stderr,"Exclude SCOP superfamily %s ptr_in_fam='%s'\n",sfamid,ptr_in_fam); + } + } + // Exclude best superfamilies from fit + else if (nbest>0) + { + if (sfams<97+nbest) return; + + // Find the nbest best-scoring superfamilies for exclusion from first ML fit + if (v>=4) printf(" find %i best-scoring superfamilies to exclude from first fit ...\n",nbest); + hit = Smallest(); + excluded.Add(hit.sfam); +// printf("Exclude in first round: %s %8.2f %s\n",hit.name,hit.score_aass,hit.sfam); + while (excluded.Size()<nbest) + { + Reset(); + while (!End() && excluded.Contains(ReadNext().sfam)) ; + hit=ReadCurrent(); + while (!End()) + { + if (ReadNext()<hit && !excluded.Contains(ReadCurrent().sfam)) + hit=ReadCurrent(); + } + excluded.Add(hit.sfam); +// printf("Exclude in first round: %s %8.2f %s %i %i\n",hit.name,hit.score_aass,hit.sfam,excluded.Size(),excluded.Contains(hit.sfam)); + } + tol = 0.01/size_sfam.Size(); // tol=1/N would lead to delta(log-likelihood)~1 (where N ~ number of superfamilies) since (1+1/N)^N = e + } + else + { + // Find the best-scoring superfamilies from first fit for exclusion from second ML fit + if (v>=4) printf(" find best-scoring superfamilies to exclude from second fit ...\n"); + Reset(); + while (!End()) + { + hit = ReadNext(); + if (hit.Eval < 0.05) excluded.Add(hit.sfam); // changed from 0.5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + } + tol = 0.001/size_sfam.Size(); // tol=1/N would lead to delta(log-likelihood)~1 (where N ~ number of superfamilies) since (1+1/N)^N = e + } + + // Put scores into score[] and weights into weight[] + if (v>=3) printf(" generate scores and weights array for ML fitting ...\n"); + Nprof=0; + Reset(); + while (!End()) + { + hit = ReadNext(); + if (hit.irep > 1) continue; //Use only best hit per template + if (Nprof>=MAXPROF) break; + + char sfamid[NAMELEN]; + char* ptr_in_fam=hit.fam; + while ((ptr_in_fam=strwrd(sfamid,ptr_in_fam,'-'))) + { + char* ptr=strrchr(sfamid,'.'); + if (ptr) *ptr='\0'; + if (excluded.Contains(sfamid)) break; //HMM is among superfamilies to be excluded + } + if (excluded.Contains(sfamid)) { + if (v>=3) fprintf(stderr,"Exclude hit %s (family %s contains %s)\n",hit.name,hit.fam,sfamid); + continue; + } +// ScopID(hit.cl,hit.fold,hit.sfam,hit.fam); //Get scop superfamily code for template +// if (*hit.sfam=='\0' || excluded.Contains(hit.sfam)) continue; // skip HMM + + score[Nprof] = hit.score; + weight[Nprof]=1./size_fam[hit.fam]/size_sfam[hit.sfam]; + sum_scores +=hit.score*weight[Nprof]; + sum_weights+=weight[Nprof]; + + //DEBUG +// if (v>=4) printf("%-10.10s %-12.12s %-3i %-12.12s %-3i %6.4f %6.4f %7.1f\n",hit.name,hit.fam,size_fam[hit.fam],hit.sfam,size_sfam[hit.sfam],1./size_fam[hit.fam]/size_sfam[hit.sfam],sum,hit.score); + Nprof++; + } + //DEBUG + if (v>=3) + printf("%i hits used for score distribution\n",Nprof); + // for (int i=0; i<Nprof; i++) printf("%3i score=%8.3f weight=%7.5f\n",i,score[i],weight[i]); + + // Set simplex vertices and function values + mu = sum_scores/sum_weights - 0.584/LAMDA; + if (par.loc) // fit only in local mode; in global mode use fixed value LAMDA and mu mean score + { + double (*Func)(void*, double*); + Func = HitList::LogLikelihoodEVD_static; + + if (nbest>0) {vertex[0]=LAMDA; vertex[1]=mu;} /////////////////////////////////////////// DEBUG + else {vertex[0]=q.lamda; vertex[1]=mu;} + vertex[2]=vertex[0]+0.1; vertex[3]=vertex[1]; + vertex[4]=vertex[0]; vertex[5]=vertex[1]+0.2; + yvertex[0]=Func(this,vertex ); + yvertex[1]=Func(this,vertex+2); + yvertex[2]=Func(this,vertex+4); + + // Find lam and mu that minimize negative log likelihood of data + if (v>=3) printf("Fitting to EVD by maximum likelihood...\niter lamda mu -log(P)/N tol\n"); + rtol = FindMin(2,vertex,yvertex,tol,nfunc,Func); + if (v>=3) printf("%3i %-7.3f %-7.2f %-7.3f %-7.1E\n\n",nfunc,vertex[0],vertex[1],yvertex[0]-(1.5772-log(vertex[0])),rtol); +// printf("HHsearch lamda=%-6.3f mu=%-6.3f\n",vertex[0],vertex[1]); + } + else + { + vertex[0]=LAMDA_GLOB; vertex[1]=mu; + } + + // Set lamda and mu of profile + q.lamda = vertex[0]; + q.mu = vertex[1]; + + // Set P-values and E-values + // CHECK UPDATE FROM score=-logpval to score=-logpval+SSSCORE2NATLOG*score_ss !!!! + Reset(); + while (!End()) + { + hit = ReadNext(); + + // Calculate total score in raw score units: P-value = 1- exp(-exp(-lamda*(Saa-mu))) + hit.weight=1./size_fam[hit.fam]/size_sfam[hit.sfam]; // needed for transitive scoring + hit.logPval = logPvalue(hit.score,vertex); + hit.Pval=Pvalue(hit.score,vertex); + hit.Eval=exp(hit.logPval+log(N_searched)); +// hit.score_aass = hit.logPval/0.45-3.0 - hit.score_ss; // median(lamda)~0.45, median(mu)~4.0 in EVDs for scop20.1.63 HMMs + hit.score_aass = -q.lamda*(hit.score-q.mu)/0.45-3.0 - fmin(hit.score_ss,fmax(0.0,0.5*hit.score-5.0)); // median(lamda)~0.45, median(mu)~3.0 in EVDs for scop20.1.63 HMMs + hit.Probab = Probab(hit); + if (nbest>0 && par.loc) // correct length correction (not needed for second round of fitting, since lamda very similar) + if (par.idummy==0) //////////////////////////////////////////// + hit.score += log(q.L*hit.L)*(1/LAMDA-1/vertex[0]); + hit.score_sort = hit.score_aass; + Overwrite(hit); // copy hit object into current position of hitlist + + if (nbest==0 && par.trans==1) // if in transitive scoring mode (weights file given) + TransitiveScoring(); + else if (nbest==0 && par.trans==2) // if in transitive scoring mode (weights file given) + TransitiveScoring2(); + else if (nbest==0 && par.trans==3) // if in transitive scoring mode (weights file given) + TransitiveScoring3(); + else if (nbest==0 && par.trans==4) // if in transitive scoring mode (weights file given) + TransitiveScoring4(); + } +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate correlation and score offset for HHblast composite E-values + */ +void +HitList::CalculateHHblastCorrelation(HMM& q) +{ + int nfunc=0; // number of function calls + double tol; // Maximum relative tolerance when minimizing -log(P)/N (~likelihood) + double vertex[2*3]; // three vertices of the simplex in lamda-mu plane + double yvertex[3]; // log likelihood values at the three vertices of the simplex + Hit hit; + Hash<int> excluded(50); // Hash containing names of superfamilies to be excluded from fit + excluded.Null(0); // Set int value to return when no data can be retrieved + + // Set sum of HHsearch and PSI-BLAST score for calculating correlation + Reset(); + while (!End()) + { + hit = ReadNext(); + hit.score_sort = hit.logPval + blast_logPvals->Show(hit.name); // if template not in hash, return log Pval = 0, i.e. Pvalue = 1! + Overwrite(hit); // copy hit object into current position of hitlist + } + + // Query has SCOP family identifier? + if (q.fam && q.fam[0]>='a' && q.fam[0]<='k' && q.fam[1]=='.') + { + char sfamid[NAMELEN]; + char* ptr_in_fam=q.fam; + while ((ptr_in_fam=strwrd(sfamid,ptr_in_fam,'-'))) + { + char* ptr=strrchr(sfamid,'.'); + if (ptr) *ptr='\0'; + excluded.Add(sfamid); + fprintf(stderr,"Exclude SCOP superfamily %s ptr_in_fam='%s'\n",sfamid,ptr_in_fam); + } + } + + // Resort list by sum of log P-values + ResortList(); // use InsertSort to resort list according to sum of minus-log-Pvalues + Nprof=0; + Reset(); + ReadNext(); // skip best hit + while (!End()) + { + hit = ReadNext(); + if (hit.irep>=2) continue; // use only best alignments +// if (hit.Eval<0.005) {if (v>=3) printf("Fitting HHblast correlation coefficient: skipping %s with Evalue=%9.1g\n",hit.name,hit.Eval); continue;} + if (Nprof>=MAXPROF) break; + + char sfamid[NAMELEN]; + char* ptr_in_fam=hit.fam; + while ((ptr_in_fam=strwrd(sfamid,ptr_in_fam,'-'))) + { + char* ptr=strrchr(sfamid,'.'); + if (ptr) *ptr='\0'; + if (excluded.Contains(sfamid)) break; //HMM is among superfamilies to be excluded + } + if (excluded.Contains(sfamid)) { + if (v>=1) fprintf(stderr,"Exclude hit %s (family %s contains %s)\n",hit.name,hit.fam,sfamid); + continue; + } + score[Nprof] = -hit.score_sort; + weight[Nprof] = 1.0; // = hit.weight; +// printf("%3i %-12.12s %7.3f + %7.3f = %7.3f \n",Nprof,hit.name,hit.logPval,blast_logPvals->Show(hit.name),-hit.score_sort); ////////////////////// + printf("%3i %7.3f %7.3f\n",Nprof,hit.Pval,exp(blast_logPvals->Show(hit.name))); ////////////////////// + Nprof++; + } + + // Fit correlation + vertex[0]=0.5; vertex[1]=0.2; + vertex[2]=vertex[0]+0.2; vertex[3]=vertex[1]; + vertex[4]=vertex[0]; vertex[5]=vertex[1]+0.2; + + yvertex[0]=RankOrderFitCorr(vertex ); + yvertex[1]=RankOrderFitCorr(vertex+2); + yvertex[2]=RankOrderFitCorr(vertex+4); +// yvertex[0]=LogLikelihoodCorr(vertex ); +// yvertex[1]=LogLikelihoodCorr(vertex+2); +// yvertex[2]=LogLikelihoodCorr(vertex+4); + tol = 1e-6; + v=3;////////////////////////////////// + // Find correlation and offset that minimize mean square deviation of reported composite Pvalues from actual + if (v>=2) printf("Fitting correlation coefficient for HHblast...\niter corr offset logLikelihood tol\n"); + float rtol = FindMin(2,vertex,yvertex,tol,nfunc, HitList::RankOrderFitCorr_static); + if (v>=2) printf("%3i %-7.3f %-7.2f %-7.3f %-7.1E\n\n",nfunc,vertex[0],vertex[1],yvertex[0],rtol); + if (vertex[0]<0) vertex[0]=0.0; + + // Print correlation and offset for profile + printf("HHblast correlation=%-6.3f score offset=%-6.3f\n",vertex[0],vertex[1]); + v=2;////////////////////////////////// +} + + +/** + * @brief Calculate HHblast composite E-values + */ +inline double +corr_HHblast(float Nq, float Nt) +{ + return 0.5; +} + +/** + * @brief Calculate HHblast composite E-values + */ +inline double +offset_HHblast(float Nq, float Nt) +{ + return 0.0; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate HHblast composite E-values + */ +void +HitList::CalculateHHblastEvalues(HMM& q) +{ + Hit hit; + float corr, offset; // correlation coefficient and offset for calculating composite HHblast P-values + + Reset(); + while (!End()) + { + hit = ReadNext(); + corr = corr_HHblast(q.Neff_HMM,hit.Neff_HMM); + offset = offset_HHblast(q.Neff_HMM,hit.Neff_HMM); + hit.score_sort = hit.logPval + blast_logPvals->Show(hit.name); + hit.logPval = logPvalue_HHblast(-hit.score_sort+offset,corr); // overwrite logPval from HHsearch with composite logPval from HHblast + hit.Pval = Pvalue_HHblast(-hit.score_sort+offset,corr); // overwrite P-value from HHsearch with composite P-value from HHblast + hit.Eval = exp(hit.logPval+log(N_searched)); // overwrite E-value from HHsearch with composite E-value from HHblast + hit.Probab = Probab(hit); + Overwrite(hit); // copy hit object into current position of hitlist + } + ResortList(); // use InsertSort to resort list according to sum of minus-log-Pvalues +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Read file generated by blastpgp (default output) and store P-values in hash + */ +void +HitList::ReadBlastFile(HMM& q) +{ + char line[LINELEN]=""; // input line + int Ndb; // number of sequences in database + int Ldb=0; // size of database in number of amino acids + char* templ; + int i; + if (!blast_logPvals) { blast_logPvals = new(Hash<float>); blast_logPvals->New(16381,0); } + + FILE* blaf = NULL; + if (!strcmp(par.blafile,"stdin")) blaf=stdin; + else + { + blaf = fopen(par.blafile,"rb"); + if (!blaf) OpenFileError(par.blafile); + } + + // Read number of sequences and size of database + while (fgetline(line,LINELEN-1,blaf) && !strstr(line,"sequences;")); + if (!strstr(line,"sequences;")) FormatError(par.blafile,"No 'Database:' string found."); + char* ptr=line; + Ndb = strint(ptr); + if (Ndb==INT_MIN) FormatError(par.blafile,"No integer for number of sequences in database found."); + while ((i=strint(ptr))>INT_MIN) Ldb = 1000*Ldb + i; + if (Ldb==0) FormatError(par.blafile,"No integer for size of database found."); + printf("\nNumber of sequences in database = %i Size of database = %i\n",Ndb,Ldb); + + // Read all E-values and sequence lengths + while (fgetline(line,LINELEN-1,blaf)) + { + if (line[0]=='>') + { + // Read template name + templ = new(char[255]); + ptr = line+1; + strwrd(templ,ptr); + if (!blast_logPvals->Contains(templ)) // store logPval only for best HSP with template + { + // Read length + while (fgetline(line,LINELEN-1,blaf) && !strstr(line,"Length =")); + ptr = line+18; + int length = strint(ptr); + // Read E-value + fgetline(line,LINELEN-1,blaf); + fgetline(line,LINELEN-1,blaf); + float EvalDB; // E-value[seq-db] = Evalue for comparison Query vs. database, from PSI-BLAST + float EvalQT; // E-value[seq-seq] = Evalue for comparison Query vs. template (seq-seq) + double logPval; + ptr = strstr(line+20,"Expect ="); + if (!ptr) FormatError(par.blafile,"No 'Expect =' string found."); + if (sscanf(ptr+8,"%g",&EvalDB)<1) + { + ptr[7]='1'; + if (sscanf(ptr+7,"%g",&EvalDB)<1) + FormatError(par.blafile,"No Evalue found after 'Expect ='."); + } + // Calculate P-value[seq-seq] = 1 - exp(-E-value[seq-seq]) = 1 - exp(-Lt/Ldb*E-value[seq-db]) + EvalQT = length/double(Ldb)*double(EvalDB); + if (EvalQT>1E-3) logPval = log(1.0-exp(-EvalQT)); else logPval=log(double(EvalQT)+1.0E-99); + blast_logPvals->Add(templ,logPval); + printf("template=%-10.10s length=%-3i EvalDB=%8.2g EvalQT=%8.2g P-value=%8.2g log Pval=%8.2g\n",templ,length,EvalDB,EvalQT,exp(logPval),logPval); + } + else { + delete[] templ; templ = NULL; + } + } + } + fclose(blaf); +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate output of hidden neural network units + */ +inline float +calc_hidden_output(const float* weights, const float* bias, float Lqnorm, float Ltnorm, float Nqnorm, float Ntnorm) +{ + float res; + // Calculate activation of hidden unit = sum of all inputs * weights + bias + res = Lqnorm*weights[0] + Ltnorm*weights[1] + Nqnorm*weights[2] + Ntnorm*weights[3] + *bias; + res = 1.0 / (1.0 + exp(-(res ))); // logistic function + return res; +} + +//////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Neural network regressions of lamda for EVD + */ +inline float +lamda_NN(float Lqnorm, float Ltnorm, float Nqnorm, float Ntnorm) +{ + const int inputs = 4; + const int hidden = 4; + const float biases[] = {-0.73195, -1.43792, -1.18839, -3.01141}; // bias for all hidden units + const float weights[] = { // Weights for the neural networks (column = start unit, row = end unit) + -0.52356, -3.37650, 1.12984, -0.46796, + -4.71361, 0.14166, 1.66807, 0.16383, + -0.94895, -1.24358, -1.20293, 0.95434, + -0.00318, 0.53022, -0.04914, -0.77046, + 2.45630, 3.02905, 2.53803, 2.64379 + }; + float lamda=0.0; + for (int h = 0; h<hidden; h++) { + lamda += calc_hidden_output( weights+inputs*h, biases+h, Lqnorm,Ltnorm,Nqnorm,Ntnorm ) * weights[hidden*inputs+h]; + } + return lamda; +} + +//////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Neural network regressions of mu for EVD + */ +inline float +mu_NN(float Lqnorm, float Ltnorm, float Nqnorm, float Ntnorm) +{ + const int inputs = 4; + const int hidden = 6; + const float biases[] = {-4.25264, -3.63484, -5.86653, -4.78472, -2.76356, -2.21580}; // bias for all hidden units + const float weights[] = { // Weights for the neural networks (column = start unit, row = end unit) + 1.96172, 1.07181, -7.41256, 0.26471, + 0.84643, 1.46777, -1.04800, -0.51425, + 1.42697, 1.99927, 0.64647, 0.27834, + 1.34216, 1.64064, 0.35538, -8.08311, + 2.30046, 1.31700, -0.46435, -0.46803, + 0.90090, -3.53067, 0.59212, 1.47503, + -1.26036, 1.52812, 1.58413, -1.90409, 0.92803, -0.66871 + }; + float mu=0.0; + for (int h = 0; h<hidden; h++) { + mu += calc_hidden_output( weights+inputs*h, biases+h, Lqnorm,Ltnorm,Nqnorm,Ntnorm ) * weights[hidden*inputs+h]; + } + return 20.0*mu; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate Pvalues as a function of query and template lengths and diversities + */ +void +HitList::CalculatePvalues(HMM& q) +{ + Hit hit; + float lamda=0.4, mu=3.0; + const float log1000=log(1000.0); + + if (par.idummy!=2) + { + printf("WARNING: idummy should have been ==2 (no length correction)\n"); + exit(4); + } + + if(N_searched==0) N_searched=1; + if (v>=2) + printf("Calculate Pvalues as a function of query and template lengths and diversities...\n"); + Reset(); + while (!End()) + { + hit = ReadNext(); + + if (par.loc) + { + lamda = lamda_NN( log(q.L)/log1000, log(hit.L)/log1000, q.Neff_HMM/10.0, hit.Neff_HMM/10.0 ); + mu = mu_NN( log(q.L)/log1000, log(hit.L)/log1000, q.Neff_HMM/10.0, hit.Neff_HMM/10.0 ); +// if (v>=3 && nhits++<20) +// printf("hit=%-10.10s Lq=%-4i Lt=%-4i Nq=%5.2f Nt=%5.2f => lamda=%-6.3f mu=%-6.3f\n",hit.name,q.L,hit.L,q.Neff_HMM,hit.Neff_HMM,lamda,mu); + } + else + { + printf("WARNING: global calibration not yet implemented!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + } + hit.logPval = logPvalue(hit.score,lamda,mu); + hit.Pval = Pvalue(hit.score,lamda,mu); + hit.Eval=exp(hit.logPval+log(N_searched)); +// hit.score_aass = hit.logPval/LAMDA-3.0 - hit.score_ss; // median(lamda)~0.45, median(mu)~3.0 in EVDs for scop20.1.63 HMMs + // P-value = 1- exp(-exp(-lamda*(Saa-mu))) => -lamda*(Saa-mu) = log(-log(1-Pvalue)) + hit.score_aass = (hit.logPval<-10.0? hit.logPval : log(-log(1-hit.Pval)) )/0.45 - fmin(lamda*hit.score_ss,fmax(0.0,0.2*(hit.score-8.0)))/0.45 - 3.0; + hit.score_sort = hit.score_aass; + hit.Probab = Probab(hit); + Overwrite(hit); + } + SortList(); + Reset(); + return; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate Pvalues from calibration of 0: query HMM, 1:template HMMs, 2: both + */ +void +HitList::GetPvalsFromCalibration(HMM& q) +{ + Hit hit; + char warn=0; + if(N_searched==0) N_searched=1; + if (v>=2) + { + switch (par.calm) + { + case 0: + printf("Using lamda=%-5.3f and mu=%-5.2f from calibrated query HMM %s. \n",q.lamda,q.mu,q.name); + printf("Note that HMMs need to be recalibrated when changing HMM-HMM alignment options.\n"); + break; + case 1: + printf("Using score distribution parameters lamda and mu from database HMMs \n"); + break; + case 2: + printf("Combining score distribution parameters lamda and mu from query and database HMMs\n"); + printf("Note that HMMs need to be recalibrated when changing HMM-HMM alignment options.\n"); + break; + } + } + Reset(); + while (!End()) + { + hit = ReadNext(); + if (par.calm==0 || (hit.logPvalt==0) ) + { + hit.logPval = logPvalue(hit.score,q.lamda,q.mu); + hit.Pval = Pvalue(hit.score,q.lamda,q.mu); + if (par.calm>0 && warn++<1 && v>=1) + printf("Warning: some template HMM (e.g. %s) are not calibrated. Using query calibration.\n",hit.name); + } + else if (par.calm==1) + { + hit.logPval = hit.logPvalt; + hit.Pval = hit.Pvalt; + } + else if (par.calm==2) + { + hit.logPval = 0.5*( logPvalue(hit.score,q.lamda,q.mu) + hit.logPvalt); + hit.Pval = sqrt( Pvalue(hit.score,q.lamda,q.mu) * hit.Pvalt); + if (v>=5) printf("Score: %7.1f lamda: %7.1f mu: %7.1f P-values: query-calibrated: %8.2G template-calibrated: %8.2G geometric mean: %8.2G\n",hit.score,q.lamda,q.mu,Pvalue(hit.score,q.lamda,q.mu),hit.Pvalt,hit.Pval); + } + + hit.Eval=exp(hit.logPval+log(N_searched)); +// hit.score_aass = hit.logPval/LAMDA-3.0 - hit.score_ss; // median(lamda)~0.45, median(mu)~3.0 in EVDs for scop20.1.63 HMMs + // P-value = 1- exp(-exp(-lamda*(Saa-mu))) => -lamda*(Saa-mu) = log(-log(1-Pvalue)) + hit.score_aass = (hit.logPval<-10.0? hit.logPval : log(-log(1-hit.Pval)) ) / 0.45-3.0 - fmin(hit.score_ss,fmax(0.0,0.5*hit.score-5.0)); + hit.score_sort = hit.score_aass; + hit.Probab = Probab(hit); + Overwrite(hit); + } + SortList(); + Reset(); + return; +} + + + + + + + + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +// Transitive scoring +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + + + + + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate P-values and Probabilities from transitive scoring over whole database + */ +void +HitList::TransitiveScoring() +{ + void PrintMatrix(float** V, int N); + void PrintMatrix(double** V, int N); + + float** Z; // matrix of intra-db Z-scores Z_kl + float** C; // covariance matrix for Z_k: C_kl = sum_m=1^N (Z_km * Z_lm) + char** fold; // fold name of HMM k + char** fam; // family of HMM k + float* Prob; // probability of HMM k + float* Zq; // Zq[k] = Z-score between query and database HMM k + float* Ztq; // Ztq[k] = transitive Z-score from query to database HMM k: Ztq[k] = sum_l[ w_ql * Z_lk] / normalization_q + float* Zrq; // Zrq[k] = transitive Z-score from database HMM k to query: Zrq[k] = sum_l[ w_kl * Z_lq] / normalization_k + float* w; // unnormalized weight matrix; w[l] is w_ql or w_kl, respectively + int* ll; // ll[m] is the m'th index l for which Z_lq, Z_lk > Zmin_trans + int N; // dimension of weight matrix is NxN + int M; // number of HMMs l with Z_ql>Ztrans_min (or Z_lk>Ztrans_min, respectively) + int k,l,m,n; // indices for database HMMs + char name[NAMELEN]; + Hash<int> index(MAXPROF+7); // index{name} = index of HMM name in {1,...,N} + index.Null(-1); // Set int value to return when no data can be retrieved + Hash<int> excluded(13); // Hash containing names of superfamilies to be excluded from fit + excluded.Null(0); // Set int value to return when no data can be retrieved + Hit hit; + size_t unused; /* disable fread gcc warning */ + + // Read weights matrix W with index hash and names array + fprintf(stderr,"Reading in weights file\n"); + FILE* wfile = fopen(par.wfile,"rb"); + if (v>=1 && wfile==NULL) + { + fprintf(stderr,"Error: %s could not be opened: (N_searched=%i) ",par.wfile,N_searched); + perror("fopen"); + fprintf(stderr,"Skipping caclulation of transitive P-values\n"); + par.trans=0; + return; + } + unused = fread(&N,sizeof(int),1,wfile); // read matrix dimension (i.e. number of HMMs in database) + if (v>=1 && N!=N_searched) + { + fprintf(stderr,"Error: Number %i of HMMs in weight file is different from number %i of HMMs in searched databases. \n",N,N_searched); + fprintf(stderr,"Skipping caclulation of transitive P-values\n"); + par.trans=0; + return; + } + if (v>=2) fprintf(stderr,"Calculating transitive P-values for %i HMMs\n",N); + // Read names of HMMs (to specify mapping of HMM to matrix indices) + for (k=0; k<N; k++) + { + unused = fread(name,sizeof(char),IDLEN,wfile); + index.Add(name,k); + } + // Read symmetric Z-scores matrix + Z = new(float*[N]); + for (k=0; k<N; k++) + { + Z[k] = new(float[N]); + for (l=0; l<k; l++) Z[k][l] = Z[l][k]; + unused = fread(Z[k]+k,sizeof(float),N-k,wfile); + } + // Read symmetric covariance matrix + C = new(float*[N]); + for (k=0; k<N; k++) + { + C[k] = new(float[N]); + for (l=0; l<k; l++) C[k][l] = C[l][k]; + unused = fread(C[k]+k,sizeof(float),N-k,wfile); + } + fclose(wfile); + + // Allocate memory + Zq = new(float[N]); + Ztq = new(float[N]); + Zrq = new(float[N]); + fold = new(char*[N]); + fam = new(char*[N]); + Prob = new(float[N]); + ll = new(int[N]); + w = new(float[N]); + + // Transform P-values to normally distributed Z-scores and store in Zq vector + fprintf(stderr,"Transform P-values to Z-scores\n"); + float Zmax_neg = Score2Z( -log(MINEVALEXCL) + log(N_searched) ); // calculate Z-score corresponding to E-value MINEVALEXCL + float Zmin_trans = Score2Z( -log(par.Emax_trans) + log(N_searched) ); // calculate Z-score corresponding to E-value par.Emax_trans + printf("Zmax = %6.2f Zmin = %6.2f \n",Zmax_neg,Zmin_trans); + + Reset(); + while (!End()) + { + hit = ReadNext(); + if (hit.irep>1) continue; + k = index.Show(hit.name); + if (k<0) {fprintf(stderr,"Error: no index found in weights file for domain %s\n",hit.name); exit(1);} + if (hit.logPvalt<0) + Zq[k] = 0.5*Score2Z(fabs(hit.logPval)) + 0.5*Score2Z(fabs(hit.logPvalt)); // Zq[k] = 0.5*(Zkq + Zqk) + else + Zq[k] = Score2Z(fabs(hit.logPval)); // Zq[k] = Zqk +// printf("%4i %-10.10s logPvalt=%9g Zq=%9f\n",k,hit.name,hit.logPvalt,Zq[k]); +// if (isnan(Zq[k])) { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s logPval=%9g logPvalt=%9g Zq=%9f\n",k,hit.name,hit.logPval,hit.logPvalt,Zq[k]); +// par.trans=0; +// return; +// } + if (Zq[k]>Zmax_neg) excluded.Add(hit.fold); + fold[k] = new(char[IDLEN]); + fam[k] = new(char[IDLEN]); + strcpy(fold[k],hit.fold); + strcpy(fam[k],hit.fam); + weight[k] = hit.weight; + Prob[k] = hit.Probab; + } + + if (v>=3) + { + excluded.Reset(); + while (!excluded.End()) + { + excluded.ReadNext(name); + printf("Excluded fold %s from fitting to Ztq\n",name); + } + } + + + //////////////////////////////////////////////////////////////// + // Calculate transitive score (query->l) Zt[l] + + // Construct vector ll of indices l for which Z_lq > Zmin_trans + m = 0; + for (l=0; l<N; l++) + if (Zq[l]>=Zmin_trans) ll[m++]=l; + M = m; // number of indices l for which Z_lq,Z_lk > Zmin_trans + +// for (m=0; m<M; m++) +// fprintf(stderr,"m=%-4i l=%-4i %-10.10s Zq[l]=%7f\n",m,ll[m],fam[ll[m]],Zq[ll[m]]); + + if (M<=1) + for (k=0; k<N; k++) Ztq[k]=0.0; + else + { + // Generate submatrix of C for indices l for which Z_lq,Z_lk > Zmin_trans + double** Csub = new(double*[M]); + double** Cinv = new(double*[M]); + for (m=0; m<M; m++) + { + Csub[m] = new(double[M]); + Cinv[m] = new(double[M]); + for (n=0; n<M; n++) + Csub[m][n] = double(C[ll[m]][ll[n]]); + } + + if (v>=3) + { + fprintf(stderr,"Covariance matrix\n"); + PrintMatrix(Csub,M); + } + + // Invert Csub + fprintf(stderr,"Calculate inverse of covariance submatrix\n"); + InvertMatrix(Cinv,Csub,M); + + if (v>=3) + { + fprintf(stderr,"Inverse covariance matrix\n"); + PrintMatrix(Cinv,M); + } + + // Calculate weights w[l] + for (m=0; m<M; m++) + { + double sum = 0.0; + for (n=0; n<M; n++) + sum += 1.0 * Cinv[m][n]; + w[m] = fmax(sum,0.0); + } + for (l=0; l<M; l++){ + delete[](Cinv[l]); (Cinv[l]) = NULL; + } + delete[](Cinv); (Cinv) = NULL; + + // Calculate Ztq[k] for all HMMs k + fprintf(stderr,"Calculate Ztq vector of transitive Z-scores\n"); + float norm = NormalizationFactor(Csub,w,M); + for (k=0; k<N; k++) + { + double sumZ = 0.0; + for (m=0; m<M; m++) + sumZ += w[m] * Z[ll[m]][k]; + Ztq[k] = sumZ/norm; + } + + for (l=0; l<M; l++){ + delete[](Csub[l]); (Csub[l]) = NULL; + } + delete[](Csub); (Csub) = NULL; + } + + //////////////////////////////////////////////////////////////// + // Calculate reverse transitive score (l->query-) Zrq[l] + + fprintf(stderr,"Calculate Zrq vector of transitive Z-scores\n"); + for (k=0; k<N; k++) + { + // Construct vector ll of indices l for which Z_lk > Zmin_tran + m = 0; + for (l=0; l<N; l++) + if (Z[l][k]+Z[k][l]>=2*Zmin_trans) ll[m++]=l; + int M = m; // number of indices l for which Z_lq,Z_lk > Zmin_tran + + +// fprintf(stderr,"\nfam[k]: %s\n",fam[k]); +// for (m=0; m<M; m++) +// printf(stderr,"m=%-4i k=%-4i l=%-4i %-10.10s Zq[l]=%7f Z_lk=%7f \n",m,k,ll[m],fold[ll[m]],Zq[ll[m]],Z[k][ll[m]]); + + if (M<=1) + { + Zrq[k] = Zq[k]; + } + else + { + // Generate submatrix of C for indices l for which Z_lq,Z_lk > Zmin_trans + double** Csub = new(double*[M]); + for (m=0; m<M; m++) + { + Csub[m] = new(double[M]); + for (n=0; n<M; n++) + Csub[m][n] = double(C[ll[m]][ll[n]]); + } +// fprintf(stderr,"Covariance matrix\n"); +// PrintMatrix(Csub,M); + + if (M==2) + { + for (m=0; m<M; m++) w[m] = 1.0/M; + } + else + { + + double** Cinv = new(double*[M]); + for (m=0; m<M; m++) Cinv[m] = new(double[M]); + + // Invert Csub + InvertMatrix(Cinv,Csub,M); + + // fprintf(stderr,"Inverse covariance matrix\n"); + // PrintMatrix(Cinv,M); + + // Calculate weights w[l] + for (m=0; m<M; m++) + { + double sum = 0.0; + for (n=0; n<M; n++) + sum += 1.0 * Cinv[m][n]; + w[m] = fmax(sum,0.0); + } + +// for (m=0; m<M; m++) fprintf(stderr,"w[%i]=%8.2g\n",m,w[m]); + + for (l=0; l<M; l++){ + delete[](Cinv[l]); (Cinv[l]) = NULL; + } + delete[](Cinv); (Cinv) = NULL; + } + + // Calculate Zrq[k] and normalize + float norm = NormalizationFactor(Csub,w,M); + double sumZ = 0.0; + for (m=0; m<M; m++) + sumZ += w[m] * Zq[ll[m]]; + Zrq[k] = sumZ/norm; + + for (l=0; l<M; l++){ + delete[](Csub[l]); (Csub[l]) = NULL; + } + delete[](Csub); (Csub) = NULL; + } + +// fprintf(stderr,"\nZq[k]=%8.2g Zq1[k]=%8.2g\n",Zq[k],Zrq[k]); + } + + // Total Z-score = weighted sum over original Z-score, forward transitive and reverse transitive Z-score + for (k=0; k<N; k++) + { + float Zqtot = Zq[k] + par.wtrans*(Ztq[k]+Zrq[k]); +// if (isnan(Zqtot)) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s Zq=%6.2f Ztq=%6.2f Zrq=%6.2f Zqtot=%6.2f\n",k,fam[k],Zq[k],Ztq[k],Zrq[k],Zqtot); +// par.trans=0; +// return; +// } + if (v>=2 && Zq[k] + Zqtot > 2*Zmin_trans) { + printf("%4i %-10.10s Zq=%6.2f Ztq=%6.2f Zrq=%6.2f -> Zqtot=%6.2f\n",k,fam[k],Zq[k],Ztq[k],Zrq[k],Zqtot); + } + Ztq[k] = Zqtot; + } + + // Calculate mean and standard deviation of Z1q + fprintf(stderr,"Calculate mean and standard deviation of Ztq\n"); + double sumw=0.0; + double sumZ=0.0; + double sumZ2=0.0; + for (k=0; k<N; k++) + { + if (excluded.Contains(fold[k])) continue; + sumw += weight[k]; + sumZ += weight[k]*Ztq[k]; + sumZ2 += weight[k]*Ztq[k]*Ztq[k]; +// if (isnan(sumZ)) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s Zq=%9f Zrq=%9f Ztq=%9f\n",k,fam[k],Zq[k],Zrq[k],Ztq[k]); +// par.trans=0; +// return; +// } + } + float mu = sumZ/sumw; + float sigma = sqrt(sumZ2/sumw-mu*mu); + if (v>=2) printf("mu(Ztq)=%6.3f sigma(Ztq)=%6.2f\n",mu,sigma); + sigma *= 1.01;// correct different fitting of EVD and normal variables + + // Normalize Ztq and calculate P1-values + fprintf(stderr,"Normalize Ztq and calculate P1-values\n"); + Reset(); + while (!End()) + { + hit = ReadNext(); + hit.logPval = -Z2Score((Ztq[index.Show(hit.name)]-mu)/sigma); + hit.E1val = N_searched*(hit.logPval<-100.0? 0.0 : exp(hit.logPval)); + // P-value = 1- exp(-exp(-lamda*(Saa-mu))) => -lamda*(Saa-mu) = log(-log(1-Pvalue)) + hit.score_aass = (hit.logPval<-10.0? hit.logPval : log(-log(1-exp(hit.logPval))) ) / 0.45-3.0 - hit.score_ss; + hit.Probab = Probab(hit); + hit.score_sort = hit.logPval; + Overwrite(hit); // copy hit object into current position of hitlist + } + + for (k=0; k<N; k++){ + delete[](Z[k]); (Z[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](C[k]); (C[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](fold[k]); (fold[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](fam[k]); (fam[k]) = NULL; + } + delete[](C); (C) = NULL; + delete[](Z); (Z) = NULL; + delete[](fold); (fold) = NULL; + delete[](fam); (fam) = NULL; + delete[](Prob); (Prob) = NULL; + delete[](ll); (ll) = NULL; + delete[](Zq); (Zq) = NULL; + delete[](Ztq); (Ztq) = NULL; +} + + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate P-values and Probabilities from transitive scoring over whole database + */ +void +HitList::TransitiveScoring2() +{ + void PrintMatrix(float** V, int N); + void PrintMatrix(double** V, int N); + + float** Z; // matrix of intra-db Z-scores Z_kl + float** C; // covariance matrix for Z_k: C_kl = sum_m=1^N (Z_km * Z_lm) + char** fold; // fold name of HMM k + char** fam; // family of HMM k + float* Prob; // probability of HMM k + float* Zq; // Zq[k] = Z-score between query and database HMM k + float* Ztq; // Ztq[k] = transitive Z-score from query to database HMM k: Ztq[k] = sum_l[ w_ql * Z_lk] / normalization_q + float* Zrq; // Zrq[k] = transitive Z-score from database HMM k to query: Zrq[k] = sum_l[ w_kl * Z_lq] / normalization_k + float* w; // unnormalized weight matrix; w[l] is w_ql or w_kl, respectively + int* ll; // ll[m] is the m'th index l for which Z_lq, Z_lk > Zmin_trans + int N; // dimension of weight matrix is NxN + int M; // number of HMMs l with Z_ql>Ztrans_min (or Z_lk>Ztrans_min, respectively) + int k,l,m,n; // indices for database HMMs + char name[NAMELEN]; + Hash<int> index(MAXPROF+7); // index{name} = index of HMM name in {1,...,N} + index.Null(-1); // Set int value to return when no data can be retrieved + Hash<int> excluded(13); // Hash containing names of superfamilies to be excluded from fit + excluded.Null(0); // Set int value to return when no data can be retrieved + Hit hit; + size_t unused; /* disable fread gcc warning */ + + // Read weights matrix W with index hash and names array + fprintf(stderr,"Reading in weights file\n"); + FILE* wfile = fopen(par.wfile,"rb"); + if (v>=1 && wfile==NULL) + { + fprintf(stderr,"Error: %s could not be opened: (N_searched=%i) ",par.wfile,N_searched); + perror("fopen"); + fprintf(stderr,"Skipping caclulation of transitive P-values\n"); + par.trans=0; + return; + } + unused = fread(&N,sizeof(int),1,wfile); // read matrix dimension (i.e. number of HMMs in database) + if (v>=1 && N!=N_searched) + { + fprintf(stderr,"Error: Number %i of HMMs in weight file is different from number %i of HMMs in searched databases. \n",N,N_searched); + fprintf(stderr,"Skipping caclulation of transitive P-values\n"); + par.trans=0; + return; + } + if (v>=2) fprintf(stderr,"Calculating transitive P-values for %i HMMs\n",N); + // Read names of HMMs (to specify mapping of HMM to matrix indices) + for (k=0; k<N; k++) + { + unused = fread(name,sizeof(char),IDLEN,wfile); + index.Add(name,k); + } + // Read symmetric Z-scores matrix + Z = new(float*[N]); + for (k=0; k<N; k++) + { + Z[k] = new(float[N]); + for (l=0; l<k; l++) Z[k][l] = Z[l][k]; + unused = fread(Z[k]+k,sizeof(float),N-k,wfile); + } + // Read symmetric covariance matrix + C = new(float*[N]); + for (k=0; k<N; k++) + { + C[k] = new(float[N]); + for (l=0; l<k; l++) C[k][l] = C[l][k]; + unused = fread(C[k]+k,sizeof(float),N-k,wfile); + } + fclose(wfile); + + // Allocate memory + Zq = new(float[N]); + Ztq = new(float[N]); + Zrq = new(float[N]); + fold = new(char*[N]); + fam = new(char*[N]); + Prob = new(float[N]); + ll = new(int[N]); + w = new(float[N]); + + // Transform P-values to normally distributed Z-scores and store in Zq vector + fprintf(stderr,"Transform P-values to Z-scores\n"); + float Zmax_neg = Score2Z( -log(MINEVALEXCL) + log(N_searched) ); // calculate Z-score corresponding to E-value MINEVALEXCL + float Zmin_trans = Score2Z( -log(par.Emax_trans) + log(N_searched) ); // calculate Z-score corresponding to E-value par.Emax_trans + printf("Zmax = %6.2f Zmin = %6.2f \n",Zmax_neg,Zmin_trans); + + Reset(); + while (!End()) + { + hit = ReadNext(); + if (hit.irep>1) continue; + k = index.Show(hit.name); + if (k<0) {fprintf(stderr,"Error: no index found in weights file for domain %s\n",hit.name); exit(1);} + if (hit.logPvalt<0) + Zq[k] = 0.5*Score2Z(fabs(hit.logPval)) + 0.5*Score2Z(fabs(hit.logPvalt)); // Zq[k] = 0.5*(Zkq + Zqk) + else + Zq[k] = Score2Z(fabs(hit.logPval)); // Zq[k] = Zqk +// printf("%4i %-10.10s logPvalt=%9g Zq=%9f\n",k,hit.name,hit.logPvalt,Zq[k]); +// if (isnan(Zq[k])) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s logPval=%9g logPvalt=%9g Zq=%9f\n",k,hit.name,hit.logPval,hit.logPvalt,Zq[k]); +// par.trans=0; +// return; +// } + if (Zq[k]>Zmax_neg) excluded.Add(hit.fold); + fold[k] = new(char[IDLEN]); + fam[k] = new(char[IDLEN]); + strcpy(fold[k],hit.fold); + strcpy(fam[k],hit.fam); + weight[k] = hit.weight; + Prob[k] = hit.Probab; + } + + if (v>=3) + { + excluded.Reset(); + while (!excluded.End()) + { + excluded.ReadNext(name); + printf("Excluded fold %s from fitting to Ztq\n",name); + } + } + + + //////////////////////////////////////////////////////////////// + // Calculate transitive score (query->l) Zt[l] + + // Construct vector ll of indices l for which Z_lq > Zmin_trans + m = 0; + for (l=0; l<N; l++) + if (Zq[l]>=Zmin_trans) ll[m++]=l; + M = m; // number of indices l for which Z_lq,Z_lk > Zmin_trans + +// for (m=0; m<M; m++) +// fprintf(stderr,"m=%-4i l=%-4i %-10.10s Zq[l]=%7f\n",m,ll[m],fam[ll[m]],Zq[ll[m]]); + + if (M<=1) + for (k=0; k<N; k++) Ztq[k]=0.0; + else + { + // Generate submatrix of C for indices l for which Z_lq,Z_lk > Zmin_trans + double** Csub = new(double*[M]); + double** Cinv = new(double*[M]); + for (m=0; m<M; m++) + { + Csub[m] = new(double[M]); + Cinv[m] = new(double[M]); + for (n=0; n<M; n++) + Csub[m][n] = double(C[ll[m]][ll[n]]); + } + + if (v>=3) + { + fprintf(stderr,"Covariance matrix\n"); + PrintMatrix(Csub,M); + } + +// // Invert Csub +// fprintf(stderr,"Calculate inverse of covariance submatrix\n"); +// InvertMatrix(Cinv,Csub,M); + +// if (v>=3) +// { +// fprintf(stderr,"Inverse covariance matrix\n"); +// PrintMatrix(Cinv,M); +// } + + + // Calculate weights w[l] + for (m=0; m<M; m++) + { + double sum = 0.0; + for (n=0; n<M; n++) + sum += 1.0 * Csub[m][n]; + printf("w[%4i] = %-8.5f\n",ll[m],1.0/sum); + w[m] = (sum>0? Zq[ll[m]] / sum : 0.0); + } + for (l=0; l<M; l++){ + delete[](Cinv[l]); (Cinv[l]) = NULL; + } + delete[](Cinv); (Cinv) = NULL; + + // Calculate Ztq[k] for all HMMs k + fprintf(stderr,"Calculate Ztq vector of transitive Z-scores\n"); + float norm = NormalizationFactor(Csub,w,M); + for (k=0; k<N; k++) + { + double sumZ = 0.0; + for (m=0; m<M; m++) + sumZ += w[m] * Z[ll[m]][k]; + Ztq[k] = sumZ/norm; + } + + for (l=0; l<M; l++){ + delete[](Csub[l]); (Csub[l]) = NULL; + } + delete[](Csub); (Csub) = NULL; + } + + //////////////////////////////////////////////////////////////// + // Calculate reverse transitive score (l->query-) Zrq[l] + + fprintf(stderr,"Calculate Zrq vector of transitive Z-scores\n"); + for (k=0; k<N; k++) + { + // Construct vector ll of indices l for which Z_lk > Zmin_tran + m = 0; + for (l=0; l<N; l++) + if (Z[l][k]+Z[k][l]>=2*Zmin_trans) ll[m++]=l; + int M = m; // number of indices l for which Z_lq,Z_lk > Zmin_tran + + +// fprintf(stderr,"\nfam[k]: %s\n",fam[k]); +// for (m=0; m<M; m++) +// printf(stderr,"m=%-4i k=%-4i l=%-4i %-10.10s Zq[l]=%7f Z_lk=%7f \n",m,k,ll[m],fold[ll[m]],Zq[ll[m]],Z[k][ll[m]]); + + if (M<=1) + { + Zrq[k] = Zq[k]; + } + else + { + // Generate submatrix of C for indices l for which Z_lq,Z_lk > Zmin_trans + double** Csub = new(double*[M]); + for (m=0; m<M; m++) + { + Csub[m] = new(double[M]); + for (n=0; n<M; n++) + Csub[m][n] = double(C[ll[m]][ll[n]]); + } +// fprintf(stderr,"Covariance matrix\n"); +// PrintMatrix(Csub,M); + + if (M<=2) + { + for (m=0; m<M; m++) w[m] = 1.0/M; + } + else + { + + double** Cinv = new(double*[M]); + for (m=0; m<M; m++) Cinv[m] = new(double[M]); + +// // Invert Csub +// InvertMatrix(Cinv,Csub,M); + +// // fprintf(stderr,"Inverse covariance matrix\n"); +// // PrintMatrix(Cinv,M); + + // Calculate weights w[l] + for (m=0; m<M; m++) + { + double sum = 0.0; + for (n=0; n<M; n++) + sum += 1.0 * Csub[m][n]; + w[m] = (sum>0? Z[ll[m]][k] / sum : 0.0); + } + +// for (m=0; m<M; m++) fprintf(stderr,"w[%i]=%8.2g\n",m,w[m]); + + for (l=0; l<M; l++){ + delete[](Cinv[l]); (Cinv[l]) = NULL; + } + delete[](Cinv); (Cinv) = NULL; + } + + // Calculate Zrq[k] and normalize + float norm = NormalizationFactor(Csub,w,M); + double sumZ = 0.0; + for (m=0; m<M; m++) + sumZ += w[m] * Zq[ll[m]]; + Zrq[k] = sumZ/norm; + + for (l=0; l<M; l++){ + delete[](Csub[l]); (Csub[l]) = NULL; + } + delete[](Csub); (Csub) = NULL; + } + +// fprintf(stderr,"\nZq[k]=%8.2g Zq1[k]=%8.2g\n",Zq[k],Zrq[k]); + } + + // Total Z-score = weighted sum over original Z-score, forward transitive and reverse transitive Z-score + for (k=0; k<N; k++) + { + float Zqtot = Zq[k] + par.wtrans*(Ztq[k]+Zrq[k]); +// if (isnan(Zqtot)) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s Zq=%6.2f Ztq=%6.2f Zrq=%6.2f Zqtot=%6.2f\n",k,fam[k],Zq[k],Ztq[k],Zrq[k],Zqtot); +// par.trans=0; +// return; +// } + if (v>=2 && Zq[k] + Zqtot > 2*Zmin_trans) { + printf("%4i %-10.10s Zq=%6.2f Ztq=%6.2f Zrq=%6.2f -> Zqtot=%6.2f\n",k,fam[k],Zq[k],Ztq[k],Zrq[k],Zqtot); + } + Ztq[k] = Zqtot; + } + + // Calculate mean and standard deviation of Z1q + fprintf(stderr,"Calculate mean and standard deviation of Ztq\n"); + double sumw=0.0; + double sumZ=0.0; + double sumZ2=0.0; + for (k=0; k<N; k++) + { + if (excluded.Contains(fold[k])) continue; + sumw += weight[k]; + sumZ += weight[k]*Ztq[k]; + sumZ2 += weight[k]*Ztq[k]*Ztq[k]; +// if (isnan(sumZ)) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s Zq=%9f Zrq=%9f Ztq=%9f\n",k,fam[k],Zq[k],Zrq[k],Ztq[k]); +// par.trans=0; +// return; +// } + } + float mu = sumZ/sumw; + float sigma = sqrt(sumZ2/sumw-mu*mu); + if (v>=2) printf("mu(Ztq)=%6.3f sigma(Ztq)=%6.2f\n",mu,sigma); + sigma *= 1.01;// correct different fitting of EVD and normal variables + + // Normalize Ztq and calculate P1-values + fprintf(stderr,"Normalize Ztq and calculate P1-values\n"); + Reset(); + while (!End()) + { + hit = ReadNext(); + hit.logPval = -Z2Score((Ztq[index.Show(hit.name)]-mu)/sigma); + hit.E1val = N_searched*(hit.logPval<-100? 0.0 : exp(hit.logPval)); + // P-value = 1- exp(-exp(-lamda*(Saa-mu))) => -lamda*(Saa-mu) = log(-log(1-Pvalue)) + hit.score_aass = (hit.logPval<-10.0? hit.logPval : log(-log(1-exp(hit.logPval))) ) / 0.45-3.0 - hit.score_ss; + hit.Probab = Probab(hit); + hit.score_sort = hit.logPval; + Overwrite(hit); // copy hit object into current position of hitlist + } + + for (k=0; k<N; k++){ + delete[](Z[k]); (Z[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](C[k]); (C[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](fold[k]); (fold[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](fam[k]); (fam[k]) = NULL; + } + delete[](C); (C) = NULL; + delete[](Z); (Z) = NULL; + delete[](fold); (fold) = NULL; + delete[](fam); (fam) = NULL; + delete[](Prob); (Prob) = NULL; + delete[](ll); (ll) = NULL; + delete[](Zq); (Zq) = NULL; + delete[](Ztq); (Ztq) = NULL; +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate P-values and Probabilities from transitive scoring over whole database + * Like TransitiveScoring(), + * but in transitive scoring, Z1_qk = sum_l w_l*Z_lk, use all l:E_ql<=E_qk + * and in reverse scoring, Z1_kr = sum_l w_l*Z_lq, use all l:E_kl<=E_kq + */ +void +HitList::TransitiveScoring3() +{ + void PrintMatrix(float** V, int N); + void PrintMatrix(double** V, int N); + + float** Z; // matrix of intra-db Z-scores Z_kl + float** C; // covariance matrix for Z_k: C_kl = sum_m=1^N (Z_km * Z_lm) + char** fold; // fold name of HMM k + char** fam; // family of HMM k + float* Prob; // probability of HMM k + float* Zq; // Zq[k] = Z-score between query and database HMM k + float* Ztq; // Ztq[k] = transitive Z-score from query to database HMM k: Ztq[k] = sum_l[ w_ql * Z_lk] / normalization_q + float* Zrq; // Zrq[k] = transitive Z-score from database HMM k to query: Zrq[k] = sum_l[ w_kl * Z_lq] / normalization_k + float* w; // unnormalized weight matrix; w[l] is w_ql or w_kl, respectively + int* ll; // ll[m] is the m'th index l for which Z_lq, Z_lk > Zmin_trans + int N; // dimension of weight matrix is NxN + int M; // number of HMMs l with Z_ql>Ztrans_min (or Z_lk>Ztrans_min, respectively) + int k,l,m,n; // indices for database HMMs + char name[NAMELEN]; + Hash<int> index(MAXPROF+7); // index{name} = index of HMM name in {1,...,N} + index.Null(-1); // Set int value to return when no data can be retrieved + Hash<int> excluded(13); // Hash containing names of superfamilies to be excluded from fit + excluded.Null(0); // Set int value to return when no data can be retrieved + Hit hit; + size_t unused; /* disable fread gcc warning */ + + // Read weights matrix W with index hash and names array + fprintf(stderr,"Reading in weights file\n"); + FILE* wfile = fopen(par.wfile,"rb"); + if (v>=1 && wfile==NULL) + { + fprintf(stderr,"Error: %s could not be opened: (N_searched=%i) ",par.wfile,N_searched); + perror("fopen"); + fprintf(stderr,"Skipping caclulation of transitive P-values\n"); + par.trans=0; + return; + } + unused = fread(&N,sizeof(int),1,wfile); // read matrix dimension (i.e. number of HMMs in database) + if (v>=1 && N!=N_searched) + { + fprintf(stderr,"Error: Number %i of HMMs in weight file is different from number %i of HMMs in searched databases. \n",N,N_searched); + fprintf(stderr,"Skipping caclulation of transitive P-values\n"); + par.trans=0; + return; + } + if (v>=2) fprintf(stderr,"Calculating transitive P-values for %i HMMs\n",N); + // Read names of HMMs (to specify mapping of HMM to matrix indices) + for (k=0; k<N; k++) + { + unused = fread(name,sizeof(char),IDLEN,wfile); + index.Add(name,k); + } + // Read symmetric Z-scores matrix + Z = new(float*[N]); + for (k=0; k<N; k++) + { + Z[k] = new(float[N]); + for (l=0; l<k; l++) Z[k][l] = Z[l][k]; + unused = fread(Z[k]+k,sizeof(float),N-k,wfile); + } + // Read symmetric covariance matrix + C = new(float*[N]); + for (k=0; k<N; k++) + { + C[k] = new(float[N]); + for (l=0; l<k; l++) C[k][l] = C[l][k]; + unused = fread(C[k]+k,sizeof(float),N-k,wfile); + } + fclose(wfile); + + // Allocate memory + Zq = new(float[N]); + Ztq = new(float[N]); + Zrq = new(float[N]); + fold = new(char*[N]); + fam = new(char*[N]); + Prob = new(float[N]); + ll = new(int[N]); + w = new(float[N]); + + // Transform P-values to normally distributed Z-scores and store in Zq vector + fprintf(stderr,"Transform P-values to Z-scores\n"); + float Zmax_neg = Score2Z( -log(MINEVALEXCL) + log(N_searched) ); // calculate Z-score corresponding to E-value MINEVALEXCL + float Zmin_trans = Score2Z( -log(par.Emax_trans) + log(N_searched) ); // calculate Z-score corresponding to E-value par.Emax_trans + printf("Zmax = %6.2f Zmin = %6.2f \n",Zmax_neg,Zmin_trans); + + Reset(); + while (!End()) + { + hit = ReadNext(); + if (hit.irep>1) continue; + k = index.Show(hit.name); + if (k<0) {fprintf(stderr,"Error: no index found in weights file for domain %s\n",hit.name); exit(1);} + if (hit.logPvalt<0) + Zq[k] = 0.5*Score2Z(fabs(hit.logPval)) + 0.5*Score2Z(fabs(hit.logPvalt)); // Zq[k] = 0.5*(Zkq + Zqk) + else + Zq[k] = Score2Z(fabs(hit.logPval)); // Zq[k] = Zqk +// printf("%4i %-10.10s logPvalt=%9g Zq=%9f\n",k,hit.name,hit.logPvalt,Zq[k]); +// if (isnan(Zq[k])) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s logPval=%9g logPvalt=%9g Zq=%9f\n",k,hit.name,hit.logPval,hit.logPvalt,Zq[k]); +// par.trans=0; +// return; +// } + if (Zq[k]>Zmax_neg) excluded.Add(hit.fold); + fold[k] = new(char[IDLEN]); + fam[k] = new(char[IDLEN]); + strcpy(fold[k],hit.fold); + strcpy(fam[k],hit.fam); + weight[k] = hit.weight; + Prob[k] = hit.Probab; + } + + if (v>=3) + { + excluded.Reset(); + while (!excluded.End()) + { + excluded.ReadNext(name); + printf("Excluded fold %s from fitting to Ztq\n",name); + } + } + + + //////////////////////////////////////////////////////////////// + // Calculate transitive score (query->l) Ztq[l] + + fprintf(stderr,"Calculate Ztq vector of transitive Z-scores\n"); + for (k=0; k<N; k++) + { + // Construct vector ll of indices l for which Z_lq OR Z_lk >= max(Z_kq,Zmin_trans) + float Zmink = fmax(Zq[k],Zmin_trans); + for (m=l=0; l<N; l++) + if (Zq[l]>=Zmink) ll[m++]=l; + M = m; // number of indices l for which Z_lq OR Z_lk >= max(Z_kq,Zmin_trans) + +// for (m=0; m<M; m++) +// fprintf(stderr,"m=%-4i l=%-4i %-10.10s Zq[l]=%7f\n",m,ll[m],fam[ll[m]],Zq[ll[m]]); + + if (M<=1) + { + Ztq[k]=Zq[k]; + } + else + { + // Generate submatrix of C for indices l for which Z_lq,Z_lk > Zmin_trans + double** Csub = new(double*[M]); + double** Cinv = new(double*[M]); + for (m=0; m<M; m++) + { + Csub[m] = new(double[M]); + Cinv[m] = new(double[M]); + for (n=0; n<M; n++) + Csub[m][n] = double(C[ll[m]][ll[n]]); + } + +// fprintf(stderr,"Covariance matrix\n"); +// PrintMatrix(Csub,M); + + // Invert Csub +// fprintf(stderr,"Calculate inverse of covariance submatrix\n"); + InvertMatrix(Cinv,Csub,M); + +// fprintf(stderr,"Inverse covariance matrix\n"); +// PrintMatrix(Cinv,M); + + // Calculate weights w[l] + for (m=0; m<M; m++) + { + double sum = 0.0; + for (n=0; n<M; n++) + sum += 1.0 * Cinv[m][n]; // signal ~ sum_l w_l*Z_lq ! + w[m] = fmax(sum,0.0); + } + for (l=0; l<M; l++){ + delete[](Cinv[l]); (Cinv[l]) = NULL; + } + delete[](Cinv); (Cinv) = NULL; + + // Calculate Ztq[k] + float norm = NormalizationFactor(Csub,w,M); + double sumZ = 0.0; + for (m=0; m<M; m++) + sumZ += w[m] * fmin(Zq[ll[m]],Z[ll[m]][k]); +// sumZ += w[m] * Z[ll[m]][k]; + Ztq[k] = sumZ/norm; + + for (l=0; l<M; l++){ + delete[](Csub[l]); (Csub[l]) = NULL; + } + delete[](Csub); (Csub) = NULL; + } + } + + //////////////////////////////////////////////////////////////// + // Calculate reverse transitive score (l->query-) Zrq[l] + + fprintf(stderr,"Calculate Zrq vector of transitive Z-scores\n"); + for (k=0; k<N; k++) + { + // Construct vector ll of indices l for which Z_lk > Zmin_tran + float Zmink = fmax(Zq[k],Zmin_trans); + for (m=l=0; l<N; l++) + if (Z[l][k]>=Zmink) ll[m++]=l; + int M = m; // number of indices l for which Z_lq,Z_lk > Zmin_tran + + +// fprintf(stderr,"\nfam[k]: %s\n",fam[k]); +// for (m=0; m<M; m++) +// printf(stderr,"m=%-4i k=%-4i l=%-4i %-10.10s Zq[l]=%7f Z_lk=%7f \n",m,k,ll[m],fold[ll[m]],Zq[ll[m]],Z[k][ll[m]]); + + if (M<=1) + { + Zrq[k] = Zq[k]; + } + else + { + // Generate submatrix of C for indices l for which Z_lq,Z_lk > Zmin_trans + double** Csub = new(double*[M]); + for (m=0; m<M; m++) + { + Csub[m] = new(double[M]); + for (n=0; n<M; n++) + Csub[m][n] = double(C[ll[m]][ll[n]]); + } +// fprintf(stderr,"Covariance matrix\n"); +// PrintMatrix(Csub,M); + + if (M==2) + { + for (m=0; m<M; m++) w[m] = 1.0/M; + } + else + { + + double** Cinv = new(double*[M]); + for (m=0; m<M; m++) Cinv[m] = new(double[M]); + + // Invert Csub + InvertMatrix(Cinv,Csub,M); + + // fprintf(stderr,"Inverse covariance matrix\n"); + // PrintMatrix(Cinv,M); + + // Calculate weights w[l] + for (m=0; m<M; m++) + { + double sum = 0.0; + for (n=0; n<M; n++) + sum += 1.0 * Cinv[m][n]; // signal ~ sum_l w_l*Z_lq ! + w[m] = fmax(sum,0.0); + } +// for (m=0; m<M; m++) fprintf(stderr,"w[%i]=%8.2g\n",m,w[m]); + for (l=0; l<M; l++){ + delete[](Cinv[l]); (Cinv[l]) = NULL; + } + delete[](Cinv); (Cinv) = NULL; + } + + // Calculate Zrq[k] and normalize + float norm = NormalizationFactor(Csub,w,M); + double sumZ = 0.0; + for (m=0; m<M; m++) + sumZ += w[m] * fmin(Zq[ll[m]],Z[ll[m]][k]); +// sumZ += w[m] * Zq[ll[m]]; + Zrq[k] = sumZ/norm; + + for (l=0; l<M; l++){ + delete[](Csub[l]); (Csub[l]) = NULL; + } + delete[](Csub); (Csub) = NULL; + } + +// fprintf(stderr,"\nZq[k]=%8.2g Zq1[k]=%8.2g\n",Zq[k],Zrq[k]); + } + + // Total Z-score = weighted sum over original Z-score, forward transitive and reverse transitive Z-score + for (k=0; k<N; k++) + { + + float Zqtot = Zq[k] + par.wtrans*(Ztq[k]+Zrq[k]); +// if (isnan(Zqtot)) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s Zq=%6.2f Ztq=%6.2f Zrq=%6.2f -> Zqtot=%6.2f\n",k,fam[k],Zq[k],Ztq[k],Zrq[k],Zqtot); +// par.trans=0; +// return; +// } + if (v>=3 && Zqtot > 2*Zmin_trans) { + printf("%4i %-10.10s Zq=%6.2f Ztq=%6.2f Zrq=%6.2f -> Zqtot=%6.2f\n",k,fam[k],Zq[k],Ztq[k],Zrq[k],Zqtot); + } + Ztq[k] = Zqtot; + } + + // Calculate mean and standard deviation of Z1q + fprintf(stderr,"Calculate mean and standard deviation of Ztq\n"); + double sumw=0.0; + double sumZ=0.0; + double sumZ2=0.0; + for (k=0; k<N; k++) + { + if (excluded.Contains(fold[k])) continue; + sumw += weight[k]; + sumZ += weight[k]*Ztq[k]; + sumZ2 += weight[k]*Ztq[k]*Ztq[k]; +// if (isnan(sumZ)) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s Zq=%9f Zrq=%9f Ztq=%9f\n",k,fam[k],Zq[k],Zrq[k],Ztq[k]); +// par.trans=0; +// return; +// } + } + float mu = sumZ/sumw; + float sigma = sqrt(sumZ2/sumw-mu*mu); + if (v>=2) printf("mu(Ztq)=%6.3f sigma(Ztq)=%6.2f\n",mu,sigma); + sigma *= 1.01;// correct different fitting of EVD and normal variables + + // Normalize Ztq and calculate P1-values + fprintf(stderr,"Normalize Ztq and calculate P1-values\n"); + Reset(); + while (!End()) + { + hit = ReadNext(); + hit.logPval = -Z2Score((Ztq[index.Show(hit.name)]-mu)/sigma); + hit.E1val = N_searched*(hit.logPval<-100? 0.0 : exp(hit.logPval)); + // P-value = 1- exp(-exp(-lamda*(Saa-mu))) => -lamda*(Saa-mu) = log(-log(1-Pvalue)) + hit.score_aass = (hit.logPval<-10.0? hit.logPval : log(-log(1-exp(hit.logPval))) ) / 0.45-3.0 - hit.score_ss; + hit.Probab = Probab(hit); + hit.score_sort = hit.logPval; + Overwrite(hit); // copy hit object into current position of hitlist + } + + for (k=0; k<N; k++){ + delete[](Z[k]); (Z[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](C[k]); (C[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](fold[k]); (fold[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](fam[k]); (fam[k]) = NULL; + } + delete[](C); (C) = NULL; + delete[](Z); (Z) = NULL; + delete[](fold); (fold) = NULL; + delete[](fam); (fam) = NULL; + delete[](Prob); (Prob) = NULL; + delete[](ll); (ll) = NULL; + delete[](Zq); (Zq) = NULL; + delete[](Ztq); (Ztq) = NULL; + +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate P-values and Probabilities from transitive scoring over whole database + * Best tested scheme. Use fmin(Zq[ll[m]],Z[ll[m]][k]) + * and fast approximation for weights (not inverse covariance matrix) + */ +void +HitList::TransitiveScoring4() +{ + void PrintMatrix(float** V, int N); + void PrintMatrix(double** V, int N); + + float** Z; // matrix of intra-db Z-scores Z_kl + float** C; // covariance matrix for Z_k: C_kl = sum_m=1^N (Z_km * Z_lm) + char** fold; // fold name of HMM k + char** fam; // family of HMM k + float* Prob; // probability of HMM k + float* Zq; // Zq[k] = Z-score between query and database HMM k + float* Ztq; // Ztq[k] = transitive Z-score from query to database HMM k: Ztq[k] = sum_l[ w_ql * Z_lk] / normalization_q + float* Zrq; // Zrq[k] = transitive Z-score from database HMM k to query: Zrq[k] = sum_l[ w_kl * Z_lq] / normalization_k + float* w; // unnormalized weight matrix; w[l] is w_ql or w_kl, respectively + int* ll; // ll[m] is the m'th index l for which Z_lq, Z_lk > Zmin_trans + int N; // dimension of weight matrix is NxN + int M; // number of HMMs l with Z_ql>Ztrans_min (or Z_lk>Ztrans_min, respectively) + int k,l,m,n; // indices for database HMMs + char name[NAMELEN]; + Hash<int> index(MAXPROF+7); // index{name} = index of HMM name in {1,...,N} + index.Null(-1); // Set int value to return when no data can be retrieved + Hash<int> excluded(13); // Hash containing names of superfamilies to be excluded from fit + excluded.Null(0); // Set int value to return when no data can be retrieved + Hit hit; + size_t unused; /* disable fread gcc warning */ + + // Read weights matrix W with index hash and names array + fprintf(stderr,"Reading in weights file\n"); + FILE* wfile = fopen(par.wfile,"rb"); + if (v>=1 && wfile==NULL) + { + fprintf(stderr,"Error: %s could not be opened: (N_searched=%i) ",par.wfile,N_searched); + perror("fopen"); + fprintf(stderr,"Skipping caclulation of transitive P-values\n"); + par.trans=0; + return; + } + unused = fread(&N,sizeof(int),1,wfile); // read matrix dimension (i.e. number of HMMs in database) + if (v>=1 && N!=N_searched) + { + fprintf(stderr,"Error: Number %i of HMMs in weight file is different from number %i of HMMs in searched databases. \n",N,N_searched); + fprintf(stderr,"Skipping caclulation of transitive P-values\n"); + par.trans=0; + return; + } + if (v>=2) fprintf(stderr,"Calculating transitive P-values for %i HMMs\n",N); + // Read names of HMMs (to specify mapping of HMM to matrix indices) + for (k=0; k<N; k++) + { + unused = fread(name,sizeof(char),IDLEN,wfile); + index.Add(name,k); + } + // Read symmetric Z-scores matrix + Z = new(float*[N]); + for (k=0; k<N; k++) + { + Z[k] = new(float[N]); + for (l=0; l<k; l++) Z[k][l] = Z[l][k]; + unused = fread(Z[k]+k,sizeof(float),N-k,wfile); + } + // Read symmetric covariance matrix + C = new(float*[N]); + for (k=0; k<N; k++) + { + C[k] = new(float[N]); + for (l=0; l<k; l++) C[k][l] = C[l][k]; + unused = fread(C[k]+k,sizeof(float),N-k,wfile); + } + fclose(wfile); + + // Allocate memory + Zq = new(float[N]); + Ztq = new(float[N]); + Zrq = new(float[N]); + fold = new(char*[N]); + fam = new(char*[N]); + Prob = new(float[N]); + ll = new(int[N]); + w = new(float[N]); + + // Transform P-values to normally distributed Z-scores and store in Zq vector + fprintf(stderr,"Transform P-values to Z-scores\n"); + float Zmax_neg = Score2Z( -log(MINEVALEXCL) + log(N_searched) ); // calculate Z-score corresponding to E-value MINEVALEXCL + float Zmin_trans = Score2Z( -log(par.Emax_trans) + log(N_searched) ); // calculate Z-score corresponding to E-value par.Emax_trans + printf("Zmax = %6.2f Zmin = %6.2f \n",Zmax_neg,Zmin_trans); + + Reset(); + while (!End()) + { + hit = ReadNext(); + if (hit.irep>1) continue; + k = index.Show(hit.name); + if (k<0) {fprintf(stderr,"Error: no index found in weights file for domain %s\n",hit.name); exit(1);} + if (hit.logPvalt<0) + Zq[k] = 0.5*Score2Z(fabs(hit.logPval)) + 0.5*Score2Z(fabs(hit.logPvalt)); // Zq[k] = 0.5*(Zkq + Zqk) + else + Zq[k] = Score2Z(fabs(hit.logPval)); // Zq[k] = Zqk +// printf("%4i %-10.10s logPvalt=%9g Zq=%9f\n",k,hit.name,hit.logPvalt,Zq[k]); +// if (isnan(Zq[k])) { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s logPval=%9g logPvalt=%9g Zq=%9f\n",k,hit.name,hit.logPval,hit.logPvalt,Zq[k]); +// par.trans=0; +// return; +// } + if (Zq[k]>Zmax_neg) excluded.Add(hit.fold); + fold[k] = new(char[IDLEN]); + fam[k] = new(char[IDLEN]); + strcpy(fold[k],hit.fold); + strcpy(fam[k],hit.fam); + weight[k] = hit.weight; + Prob[k] = hit.Probab; + } + + if (v>=3) + { + excluded.Reset(); + while (!excluded.End()) + { + excluded.ReadNext(name); + printf("Excluded fold %s from fitting to Ztq\n",name); + } + } + + //////////////////////////////////////////////////////////////// + // Calculate transitive score (query->l) Zt[l] + + // Construct vector ll of indices l for which Z_lq > Zmin_trans + m = 0; + for (l=0; l<N; l++) + if (Zq[l]>=Zmin_trans) ll[m++]=l; + M = m; // number of indices l for which Z_lq,Z_lk > Zmin_trans + +// for (m=0; m<M; m++) +// fprintf(stderr,"m=%-4i l=%-4i %-10.10s Zq[l]=%7f\n",m,ll[m],fam[ll[m]],Zq[ll[m]]); + + if (M<=1) + for (k=0; k<N; k++) Ztq[k]=0.0; + else + { + // Generate submatrix of C for indices l for which Z_lq,Z_lk > Zmin_trans + double** Csub = new(double*[M]); + for (m=0; m<M; m++) + { + Csub[m] = new(double[M]); + for (n=0; n<M; n++) + Csub[m][n] = double(C[ll[m]][ll[n]]); + } + + if (v>=3) + { + fprintf(stderr,"Covariance matrix\n"); + PrintMatrix(Csub,M); + } + + + // Calculate weights w[l] + for (m=0; m<M; m++) + { + double sum = 0.0; + for (n=0; n<M; n++) + sum += fmax(0.0,Csub[m][n]); + printf("w[%4i] = %-8.5f\n",ll[m],1.0/sum); + w[m] = 1.0/sum; + } + + // Calculate Ztq[k] for all HMMs k + fprintf(stderr,"Calculate Ztq vector of transitive Z-scores\n"); + float norm = NormalizationFactor(Csub,w,M); + for (k=0; k<N; k++) + { + double sumZ = 0.0; + for (m=0; m<M; m++) + sumZ += w[m] * fmin(Zq[ll[m]],Z[ll[m]][k]); + Ztq[k] = sumZ/norm; + } + + for (l=0; l<M; l++){ + delete[](Csub[l]); (Csub[l]) = NULL; + } + delete[](Csub); (Csub) = NULL; + } + + //////////////////////////////////////////////////////////////// + // Calculate reverse transitive score (l->query-) Zrq[l] + + fprintf(stderr,"Calculate Zrq vector of transitive Z-scores\n"); + for (k=0; k<N; k++) + { + // Construct vector ll of indices l for which Z_lk > Zmin_tran + m = 0; + for (l=0; l<N; l++) + if (Z[k][l]>=Zmin_trans) ll[m++]=l; + int M = m; // number of indices l for which Z_lq,Z_lk > Zmin_tran + + +// fprintf(stderr,"\nfam[k]: %s\n",fam[k]); +// for (m=0; m<M; m++) +// printf(stderr,"m=%-4i k=%-4i l=%-4i %-10.10s Zq[l]=%7f Z_lk=%7f \n",m,k,ll[m],fold[ll[m]],Zq[ll[m]],Z[k][ll[m]]); + + if (M<=1) + { + Zrq[k] = Zq[k]; + } + else + { + // Generate submatrix of C for indices l for which Z_lq,Z_lk > Zmin_trans + double** Csub = new(double*[M]); + for (m=0; m<M; m++) + { + Csub[m] = new(double[M]); + for (n=0; n<M; n++) + Csub[m][n] = double(C[ll[m]][ll[n]]); + } +// fprintf(stderr,"Covariance matrix\n"); +// PrintMatrix(Csub,M); + + // Calculate weights w[l] + for (m=0; m<M; m++) + { + double sum = 0.0; + for (n=0; n<M; n++) + sum += fmax(0.0,Csub[m][n]); + w[m] = 1.0/sum; + } + +// for (m=0; m<M; m++) fprintf(stderr,"w[%i]=%8.2g\n",m,w[m]); + + + // Calculate Zrq[k] and normalize + float norm = NormalizationFactor(Csub,w,M); + double sumZ = 0.0; + for (m=0; m<M; m++) + sumZ += w[m] * fmin(Zq[ll[m]],Z[ll[m]][k]); + Zrq[k] = sumZ/norm; + + for (l=0; l<M; l++){ + delete[](Csub[l]); (Csub[l]) = NULL; + } + delete[](Csub); (Csub) = NULL; + } + +// fprintf(stderr,"\nZq[k]=%8.2g Zq1[k]=%8.2g\n",Zq[k],Zrq[k]); + } + + // Total Z-score = weighted sum over original Z-score, forward transitive and reverse transitive Z-score + for (k=0; k<N; k++) + { + float Zqtot = Zq[k] + par.wtrans*(Ztq[k]+Zrq[k]); +// if (isnan(Zqtot)) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s Zq=%6.2f Ztq=%6.2f Zrq=%6.2f Zqtot=%6.2f\n",k,fam[k],Zq[k],Ztq[k],Zrq[k],Zqtot); +// par.trans=0; +// return; +// } + if (v>=3 && Zq[k] + Zqtot > 2*Zmin_trans) { + printf("%4i %-10.10s Zq=%6.2f Ztq=%6.2f Zrq=%6.2f -> Zqtot=%6.2f\n",k,fam[k],Zq[k],Ztq[k],Zrq[k],Zqtot); + } + Ztq[k] = Zqtot; + } + + // Calculate mean and standard deviation of Z1q + fprintf(stderr,"Calculate mean and standard deviation of Ztq\n"); + double sumw=0.0; + double sumZ=0.0; + double sumZ2=0.0; + for (k=0; k<N; k++) + { + if (excluded.Contains(fold[k])) continue; + sumw += weight[k]; + sumZ += weight[k]*Ztq[k]; + sumZ2 += weight[k]*Ztq[k]*Ztq[k]; +// if (isnan(sumZ)) +// { +// fprintf(stderr,"Error: a floating point exception occurred. Skipping transitive scoring\n"); +// printf("%4i %-10.10s Zq=%9f Zrq=%9f Ztq=%9f\n",k,fam[k],Zq[k],Zrq[k],Ztq[k]); +// par.trans=0; +// return; +// } + } + float mu = sumZ/sumw; + float sigma = sqrt(sumZ2/sumw-mu*mu); + if (v>=2) printf("mu(Ztq)=%6.3f sigma(Ztq)=%6.2f\n",mu,sigma); + sigma *= 1.01;// correct different fitting of EVD and normal variables + + // Normalize Ztq and calculate P1-values + fprintf(stderr,"Normalize Ztq and calculate P1-values\n"); + Reset(); + while (!End()) + { + hit = ReadNext(); + hit.logPval = -Z2Score((Ztq[index.Show(hit.name)]-mu)/sigma); + hit.E1val = N_searched*(hit.logPval<-100? 0.0 : exp(hit.logPval)); + // P-value = 1- exp(-exp(-lamda*(Saa-mu))) => -lamda*(Saa-mu) = log(-log(1-Pvalue)) + hit.score_aass = (hit.logPval<-10.0? hit.logPval : log(-log(1-exp(hit.logPval))) ) / 0.45-3.0 - hit.score_ss; + hit.Probab = Probab(hit); + hit.score_sort = hit.logPval; + Overwrite(hit); // copy hit object into current position of hitlist + } + + for (k=0; k<N; k++){ + delete[](Z[k]); (Z[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](C[k]); (C[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](fold[k]); (fold[k]) = NULL; + } + for (k=0; k<N; k++){ + delete[](fam[k]); (fam[k]) = NULL; + } + delete[](C); (C) = NULL; + delete[](Z); (Z) = NULL; + delete[](fold); (fold) = NULL; + delete[](fam); (fam) = NULL; + delete[](Prob); (Prob) = NULL; + delete[](ll); (ll) = NULL; + delete[](Zq); (Zq) = NULL; + delete[](Ztq); (Ztq) = NULL; +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Score2Z transforms the -log(P-value) score into a Z-score for 0 < S + * Score2Z(S) = sqrt(2)*dierfc(2*e^(-S)), where dierfc is the inverse of the complementary error function + */ +double +HitList::Score2Z(double S) +{ + double s, t, u, w, x, y, z; + if (S<=0) return double(-100000); + y = ( S>200 ? 0.0 : 2.0*exp(-S) ); + if (y > 1) + { + z = (S<1e-6? 2*S : 2-y); + w = 0.916461398268964 - log(z); + } + else + { + z = y; + w = 0.916461398268964 - (0.69314718056-S); + } + + u = sqrt(w); + s = (log(u) + 0.488826640273108) / w; + t = 1 / (u + 0.231729200323405); + + x = u * (1 - s * (s * 0.124610454613712 + 0.5)) - + ((((-0.0728846765585675 * t + 0.269999308670029) * t + + 0.150689047360223) * t + 0.116065025341614) * t + + 0.499999303439796) * t; + t = 3.97886080735226 / (x + 3.97886080735226); + u = t - 0.5; + s = (((((((((0.00112648096188977922 * u + + 1.05739299623423047e-4) * u - 0.00351287146129100025) * u - + 7.71708358954120939e-4) * u + 0.00685649426074558612) * u + + 0.00339721910367775861) * u - 0.011274916933250487) * u - + 0.0118598117047771104) * u + 0.0142961988697898018) * u + + 0.0346494207789099922) * u + 0.00220995927012179067; + s = ((((((((((((s * u - 0.0743424357241784861) * u - + 0.105872177941595488) * u + 0.0147297938331485121) * u + + 0.316847638520135944) * u + 0.713657635868730364) * u + + 1.05375024970847138) * u + 1.21448730779995237) * u + + 1.16374581931560831) * u + 0.956464974744799006) * u + + 0.686265948274097816) * u + 0.434397492331430115) * u + + 0.244044510593190935) * t - + (z==0? 0: z * exp(x * x - 0.120782237635245222)); + x += s * (x * s + 1); + if (y > 1) { + x = -x; + } + return double (1.41421356237*x); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Z2Score transforms the Z-score into a -log(P-value) value + * Z2Score(Z) = log(2) - log( erfc(Z/sqrt(2)) ) , where derfc is the complementary error function + */ +double +HitList::Z2Score(double Z) +{ + double t, u, x, y; + x = 0.707106781188*Z; + if (x>10) return 0.69314718056 - (-x*x - log( (1-0.5/x/x)/x/1.772453851) ); + t = 3.97886080735226 / (fabs(x) + 3.97886080735226); + u = t - 0.5; + y = (((((((((0.00127109764952614092 * u + 1.19314022838340944e-4) * u - + 0.003963850973605135) * u - 8.70779635317295828e-4) * u + + 0.00773672528313526668) * u + 0.00383335126264887303) * u - + 0.0127223813782122755) * u - 0.0133823644533460069) * u + + 0.0161315329733252248) * u + 0.0390976845588484035) * u + + 0.00249367200053503304; + y = ((((((((((((y * u - 0.0838864557023001992) * u - + 0.119463959964325415) * u + 0.0166207924969367356) * u + + 0.357524274449531043) * u + 0.805276408752910567) * u + + 1.18902982909273333) * u + 1.37040217682338167) * u + + 1.31314653831023098) * u + 1.07925515155856677) * u + + 0.774368199119538609) * u + 0.490165080585318424) * u + + 0.275374741597376782) * t * (x>10? 0.0 : exp(-x * x)); + return 0.69314718056 - log( x < 0 ? 2 - y : y ); +} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief + */ +void +PrintMatrix(float** V, int N) +{ + int k,l; + for (k=0; k<N; k++) + { + fprintf(stderr,"k=%4i \n",k); + for (l=0; l<N; l++) + { + fprintf(stderr,"%4i:%6.3f ",l,V[k][l]); + if ((l+1)%10==0) fprintf(stderr,"\n"); + } + fprintf(stderr,"\n"); + } + fprintf(stderr,"\n"); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief + */ +void +PrintMatrix(double** V, int N) +{ + int k,l; + for (k=0; k<N; k++) + { + fprintf(stderr,"k=%4i \n",k); + for (l=0; l<N; l++) + { + fprintf(stderr,"%4i:%6.3f ",l,V[k][l]); + if ((l+1)%10==0) fprintf(stderr,"\n"); + } + fprintf(stderr,"\n"); + } + fprintf(stderr,"\n"); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief + */ +void +HitList::Normalize(float* Ztq, char** fold, Hash<int>& excluded) +{ + double sumw=0.0; + double sumZ=0.0; + double sumZ2=0.0; + for (int k=0; k<N_searched; k++) + { + if (excluded.Contains(fold[k])) continue; + sumw += weight[k]; + sumZ += weight[k]*Ztq[k]; + sumZ2 += weight[k]*Ztq[k]*Ztq[k]; + } + float mu = sumZ/sumw; + float sigma = sqrt(sumZ2/sumw-mu*mu); + printf("Transitive score Ztq: mu=%8.3g sigma=%8.3g\n",mu,sigma); + for (int k=0; k<N_searched; k++) Ztq[k] = (Ztq[k]-mu)/sigma; + return; +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate standard deviation of Z1 = sum_m [ w_m * Z_m ], where Csub_mn = cov(Z_m,Z_n) + */ +float +HitList::NormalizationFactor(double** Csub, float* w, int M) + { + double sum=0.0; + for (int m=0; m<M; m++) + { + double summ=0.0; + for (int n=0; n<M; n++) summ += Csub[m][n]*w[n]; + sum += w[m]*summ; + } + return sqrt(sum); + } + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate inverse of matrix A and store result in B + */ +void +HitList::InvertMatrix(double** B, double** A, int N) +{ + if (N==0) + { + printf("Error: InvertMatrix called with matrix of dimension 0\n"); + exit(6); + } + if (N==1) + { + B[0][0] = (A[0][0]==0.0? 0 :1.0/A[0][0]); + return; + } + + int k,l,m; + double** V = new(double*[N]); + double* s = new(double[N]); + for (k=0; k<N; k++) V[k] = new(double[N]); + + // Copy original matrix A into B since B will be overwritten by SVD() + for (k=0; k<N; k++) + for (l=0; l<N; l++) + B[k][l] = A[k][l]; + + SVD(B, N, s, V); // U replaces B on output; s[] contains singluar values + + // Calculate inverse of A: A^-1 = V * diag(1/s) * U^t + double** U = B; + // Calculate V[k][m] -> V[k][m] *diag(1/s) + for (k=0; k<N; k++) + for (m=0; m<N; m++) + if (s[m]!=0.0) V[k][m] /= s[m]; else V[k][m] = 0.0; + // Calculate V[k][l] -> (V * U^t)_kl + for (k=0; k<N; k++) + { + if (v>=4 && k%100==0) printf("%i\n",k); + for (l=0; l<N; l++) + { + s[l] = 0.0; // use s[] as temporary memory to avoid overwriting B[k][] as long as it is needed + for (m=0; m<N; m++) + s[l] += V[k][m]*U[l][m]; + } + for (l=0; l<N; l++) V[k][l]=s[l]; + } + for (k=0; k<N; k++) + for (l=0; l<N; l++) + B[k][l] = V[k][l]; + + for (k=0; k<N; k++){ + delete[](V[k]); (V[k]) = NULL; + } + delete[](V); (V) = NULL; + return; +} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @brief + */ +void +HitList::TransposeMatrix(double** V, int N) +{ + int k,l; + for (k=0; k<N; k++) // transpose Z for efficiency of ensuing matrix multiplication + for (l=0; l<k; l++) + { + double buf = V[k][l]; + V[k][l] = V[l][k]; + V[l][k] = buf; + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +static double sqrarg; +#define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg) +static double maxarg1,maxarg2; +#define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ? (maxarg1) : (maxarg2)) +static int iminarg1,iminarg2; +#define IMIN(a,b) (iminarg1=(a),iminarg2=(b),(iminarg1) < (iminarg2) ? (iminarg1) : (iminarg2)) +#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) + +/** + * @brief This is a version of the Golub and Reinsch algorithm for singular value decomposition for a quadratic + * (n x n) matrix A. It is sped up by transposing A amd V matrices at various places in the algorithm. + * On a 400x400 matrix it runs in 1.6 s or 2.3 times faster than the original (n x m) version. + * On a 4993x4993 matrix it runs in 2h03 or 4.5 times faster than the original (n x m) version. + * + * Given a matrix a[0..n-1][0..n-1], this routine computes its singular value decomposition, A = U · W · V^t . + * The matrix U replaces a on output. The diagonal matrix of singular values W is out-put as a vector w[0..n-1]. + * The matrix V (not the transpose V^t) is output as V[0..n-1][0..n-1] ./ + */ +void +HitList::SVD(double **A, int n, double w[], double **V) +{ + int m=n; // in general algorithm A is an (m x n) matrix instead of (n x n) + + double pythag(double a, double b); + int flag,i,its,j,jj,k,l=1,nm=1; + double anorm,c,f,g,h,s,scale,x,y,z,*rv1; + rv1=new(double[n]); + g=scale=anorm=0.0; + + // Householder reduction to bidiagonal form. + if (v>=5) printf("\nHouseholder reduction to bidiagonal form\n"); + for (i=0;i<n;i++) { + if (v>=4 && i%100==0) printf("i=%i\n",i); + if (v>=4) fprintf(stderr,"."); + l=i+1; + rv1[i]=scale*g; + g=s=scale=0.0; + if (i < m) { + for (k=i;k<m;k++) scale += fabs(A[k][i]); + if (scale) { + for (k=i;k<m;k++) { + A[k][i] /= scale; + s += A[k][i]*A[k][i]; + } + f=A[i][i]; + g = -SIGN(sqrt(s),f); + h=f*g-s; + A[i][i]=f-g; + for (j=l;j<n;j++) { + for (s=0.0,k=i;k<m;k++) s += A[k][i]*A[k][j]; + f=s/h; + for (k=i;k<m;k++) A[k][j] += f*A[k][i]; + } + for (k=i;k<m;k++) A[k][i] *= scale; + } + } + w[i]=scale *g; + g=s=scale=0.0; + if (i < m && i != n-1) { + for (k=l;k<n;k++) scale += fabs(A[i][k]); + if (scale) { + for (k=l;k<n;k++) { + A[i][k] /= scale; + s += A[i][k]*A[i][k]; + } + f=A[i][l]; + g = -SIGN(sqrt(s),f); + h=f*g-s; + A[i][l]=f-g; + for (k=l;k<n;k++) rv1[k]=A[i][k]/h; + for (j=l;j<m;j++) { + for (s=0.0,k=l;k<n;k++) s += A[j][k]*A[i][k]; + for (k=l;k<n;k++) A[j][k] += s*rv1[k]; + } + for (k=l;k<n;k++) A[i][k] *= scale; + } + } + anorm=FMAX(anorm,(fabs(w[i])+fabs(rv1[i]))); + } + // Accumulation of right-hand transformations. + if (v>=5) printf("\nAccumulation of right-hand transformations\n"); + TransposeMatrix(V,n); + for (i=n-1;i>=0;i--) { + if (v>=4 && i%100==0) printf("i=%i\n",i); + if (v>=4) fprintf(stderr,"."); + if (i < n-1) { + if (g) { + // Double division to avoid possible underflow. + for (j=l;j<n;j++) + V[i][j]=(A[i][j]/A[i][l])/g; + for (j=l;j<n;j++) { + for (s=0.0,k=l;k<n;k++) s += A[i][k]*V[j][k]; + for (k=l;k<n;k++) V[j][k] += s*V[i][k]; + } + } + for (j=l;j<n;j++) V[j][i]=V[i][j]=0.0; + } + V[i][i]=1.0; + g=rv1[i]; + l=i; + } + // Accumulation of left-hand transformations. + if (v>=5) printf("\nAccumulation of left-hand transformations\n"); + TransposeMatrix(A,n); + for (i=IMIN(m,n)-1;i>=0;i--) { + if (v>=4 && i%100==0) printf("i=%i\n",i); + if (v>=4) fprintf(stderr,"."); + l=i+1; + g=w[i]; + for (j=l;j<n;j++) A[j][i]=0.0; + if (g) { + g=1.0/g; + for (j=l;j<n;j++) { + for (s=0.0,k=l;k<m;k++) s += A[i][k]*A[j][k]; + f=(s/A[i][i])*g; + for (k=i;k<m;k++) A[j][k] += f*A[i][k]; + } + for (j=i;j<m;j++) A[i][j] *= g; + } else for (j=i;j<m;j++) A[i][j]=0.0; + ++A[i][i]; + } + + // Diagonalization of the bidiagonal form: Loop over singular values, and over allowed iterations. + if (v>=5) printf("\nDiagonalization of the bidiagonal form\n"); + for (k=n-1;k>=0;k--) { + if (v>=4 && k%100==0) printf("k=%i\n",k); + if (v>=4) fprintf(stderr,"."); + for (its=1;its<=30;its++) { + flag=1; + // Test for splitting. Note that rv1[1] is always zero. + for (l=k;l>=0;l--) { + nm=l-1; + if ((double)(fabs(rv1[l])+anorm) == anorm) { + flag=0; + break; + } + if ((double)(fabs(w[nm])+anorm) == anorm) break; + } + if (flag) { + // Cancellation of rv1[l], if l > 1. + c=0.0; + s=1.0; + for (i=l;i<=k;i++) { + f=s*rv1[i]; + rv1[i]=c*rv1[i]; + if ((double)(fabs(f)+anorm) == anorm) break; + g=w[i]; + h=pythag(f,g); + w[i]=h; + h=1.0/h; + c=g*h; + s = -f*h; + for (j=0;j<m;j++) { + y=A[nm][j]; + z=A[i][j]; + A[nm][j]=y*c+z*s; + A[i][j]=z*c-y*s; + } + } + } + z=w[k]; + // Convergence. + if (l == k) { + // Singular value is made nonnegative. + if (z < 0.0) { + w[k] = -z; + for (j=0;j<n;j++) V[k][j] = -V[k][j]; + } + break; + } + if (its == 30) {printf("Error in SVD: no convergence in 30 iterations\n"); exit(7);} + // Shift from bottom 2-by-2 minor. + x=w[l]; + nm=k-1; + y=w[nm]; + g=rv1[nm]; + h=rv1[k]; + f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y); + g=pythag(f,1.0); + f=((x-z)*(x+z)+h*((y/(f+SIGN(g,f)))-h))/x; + // Next QR transformation: + c=s=1.0; + for (j=l;j<=nm;j++) { + i=j+1; + g=rv1[i]; + y=w[i]; + h=s*g; + g=c*g; + z=pythag(f,h); + rv1[j]=z; + c=f/z; + s=h/z; + f=x*c+g*s; + g = g*c-x*s; + h=y*s; + y *= c; + for (jj=0;jj<n;jj++) { + x=V[j][jj]; + z=V[i][jj]; + V[j][jj]=x*c+z*s; + V[i][jj]=z*c-x*s; + } + z=pythag(f,h); + // Rotation can be arbitrary if z = 0. + w[j]=z; + if (z) { + z=1.0/z; + c=f*z; + s=h*z; + } + f=c*g+s*y; + x=c*y-s*g; + + for (jj=0;jj<m;jj++) { + y=A[j][jj]; + z=A[i][jj]; + A[j][jj]=y*c+z*s; + A[i][jj]=z*c-y*s; + } + } + rv1[l]=0.0; + rv1[k]=f; + w[k]=x; + } + } + TransposeMatrix(V,n); + TransposeMatrix(A,n); + delete[](rv1); (rv1) = NULL; +} + +/** + * @brief Computes (a2 + b2 )^1/2 without destructive underflow or overflow. + */ +double +pythag(double a, double b) +{ + double absa,absb; + absa=fabs(a); + absb=fabs(b); + if (absa > absb) + return absa*sqrt(1.0+SQR(absb/absa)); + else + return (absb == 0.0 ? 0.0 : absb*sqrt(1.0+SQR(absa/absb))); +} + + +/* @* HitList::ClobberGlobal(void) + */ +void +HitList::ClobberGlobal(void){ + + + /* @<variables local to HitList::ClobberGlobal@> */ + class List<Hit>::ListEl<Hit> *pvIter = head; + + /* NOTE: no free/delete-ing of data to be done here + hitlist only holds a shallow copy of hit; + hit is being cleared off properly. + just reset everything to 0/0.0/NULL. + The only important thing to do at this stage + is to attach head and tail and set size = 0 + (FS, 2010-02-18) + + NOTE: I only ever saw 1 (one) in-between element, + but there may ctually be a real linked list + of more than 1 element (FS, 2010-02-18) + */ + + // printf("POINTER:\t%p\t=HEAD\n", head); + while (pvIter->next != tail){ + + // printf("POINTER:\t%p->\t%p\n", pvIter, pvIter->next); + pvIter = pvIter->next; + +#if 1 + pvIter->data.longname = pvIter->data.name = + pvIter->data.file = pvIter->data.dbfile = NULL; + pvIter->data.sname = NULL; + pvIter->data.seq = NULL; + pvIter->data.self = 0; + pvIter->data.i = pvIter->data.j = NULL; + pvIter->data.states = NULL; + pvIter->data.S = pvIter->data.S_ss = pvIter->data.P_posterior = NULL; + pvIter->data.Xcons = NULL; + pvIter->data.sum_of_probs = 0.0; + pvIter->data.Neff_HMM = 0.0; + pvIter->data.score_ss = pvIter->data.Pval = pvIter->data.logPval = + pvIter->data.Eval = pvIter->data.Probab = pvIter->data.Pforward = 0.0; + pvIter->data.nss_conf = pvIter->data.nfirst = + pvIter->data.i1 = pvIter->data.i2 = pvIter->data.j1 = pvIter->data.j2 = + pvIter->data.matched_cols = pvIter->data.ssm1 = pvIter->data.ssm2 = 0; +#endif + } + // printf("POINTER:\t\t\t%p=TAIL\n", tail); + + + head->next = tail; + tail->prev = head; + size = 0; + + /* @= */ + return; + +} /* this is the end of HitList::ClobberGlobal() */ + + +/* + * EOF hhhitlist-C.h + */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhhitlist.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,140 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhhitlist.h 143 2010-10-14 13:11:14Z andreas $ + */ + +// hhhitlist.h + +////////////////////////////////////////////////////////////////////////////// +// HitList is a list of hits of type Hit +// which can be operated upon by several anaylsis methods +////////////////////////////////////////////////////////////////////////////// +class HitList : public List<Hit> +{ +private: + double score[MAXPROF]; // HHsearch score of each HMM for ML fit + double weight[MAXPROF]; // weight of each HMM = 1/(size_fam[tfam]*size_sfam[hit.sfam]) for ML fit + int Nprof; // Number of HMMs for ML fit + +public: + int fams; // number of families found found in hitlist + int sfams; // number of superfamilies found in hitlist + int N_searched; // number of sequences searched from HMM database + Hash<float>* blast_logPvals;/* Hash containing names and log(P-values) + read from BLAST file (needed for HHblast) */ + + HitList() {blast_logPvals=NULL;} + ~HitList() {if (blast_logPvals) delete blast_logPvals;} + + // Print summary listing of hits + void PrintHitList(HMM& q, char* outfile); + +#ifdef CLUSTALO + void ClobberGlobal(void); +#endif + + // Print alignments of query sequences against hit sequences + void PrintAlignments( +#ifdef CLUSTALO + char **ppcFirstProf, char **ppcSecndProf, +#endif + HMM& q, char* outfile, char outformat=0); + + // Return a figure of merit for distinction of the score with positive from the scores with negatives + void Optimize(HMM& q, char* buffer); + + // Print score distribution into file score_dist + void PrintScoreFile(HMM& q); + + // Log likelihood for fitting the EVD to the score distribution + double RankOrderFitCorr(double* v); + // Static wrapper-function for calling the nonstatic member function RankOrderFitCorr() + static double RankOrderFitCorr_static(void* pt2hitlist, double* v); + + // Log likelihood for fitting the EVD to the score distribution + double LogLikelihoodCorr(double* v); + // Static wrapper-function for calling the nonstatic member function LogLikelihoodCorr() + static double LogLikelihoodCorr_static(void* pt2hitlist, double* v); + + // Log likelihood for fitting the EVD to the score distribution + double LogLikelihoodEVD(double* v); + // Static wrapper-function for calling the nonstatic member function LogLikelihoodEVD() + static double LogLikelihoodEVD_static(void* pt2hitlist, double* v); + + + // Subroutine to FindMin: new point given by highest point ihigh, fac and replaces ihigh if it is lower + double TryPoint(int ndim, double* p, double* y, double* psum, int ihigh, double fac, double (*Func)(void* pt2hitlist, double* v)); + + // Find minimum with simplex method of Nelder and Mead (1965) + float FindMin(int ndim, double* p, double* y, double tol, int& nfunc, double (*Func)(void* pt2hitlist, double* v)); + + // Do a maximum likelihood fit of the scores with an EV distribution with parameters lamda and mu + void MaxLikelihoodEVD(HMM& q, int nbest); + + // Calculate correlation and score offset for HHblast composite E-values + void CalculateHHblastCorrelation(HMM& q); + + // Calculate HHblast composite E-values + void CalculateHHblastEvalues(HMM& q); + + // Calculate Pvalues as a function of query and template lengths and diversities + void CalculatePvalues(HMM& q); + + // Set P-values, E-values and scores according to q.lamda and q.mu (if calibration from database scan is impossible) + void GetPvalsFromCalibration(HMM& q); + + // HHblast: read PSI-BLAST E-values to determine correlation + void ReadBlastFile(HMM& q); + + // Print first 20 hits of hitlist + void Debug() + { + Hit hit; + int i=0; + Reset(); + printf("TARGET FAMILY LEN COL LOG-PVA S-AASS PROBAB SCORE_SORT\n"); + while (++i<=20 && !End()) + { + hit = ReadNext(); + printf("%-10.10s %-10.10s %3i %3i %s %7.2f %6.2f %6.2f\n",hit.name,hit.fam,hit.L,hit.matched_cols,sprintg(-1.443*hit.logPval,7),-hit.score_aass,hit.Probab,hit.score_sort); + } + } + + // Calculate P-values and Probabilities from transitive scoring over whole database + void TransitiveScoring(); + void TransitiveScoring2(); + void TransitiveScoring3(); + void TransitiveScoring4(); + + // Score2Z transforms the -log(P-value) score into a Z-score for 0 < S + double Score2Z(double S); + + // Z2Score transforms the Z-score into a -log(P-value) value + double Z2Score(double Z); + + // Matrix manipulation + void PrintMatrix(float** V, int N); + void PrintMatrix(double** V, int N); + float NormalizationFactor(double** Csub,float* w, int M); + void Normalize(float* Ztq, char** fold, Hash<int>& excluded); + void InvertMatrix(double** B, double** A, int N); + void TransposeMatrix(double** V, int N); + void SVD(double **A, int n, double w[], double **V); + +}; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhhmm-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,2637 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhhmm-C.h 224 2011-03-23 12:13:33Z fabian $ + */ + + +// hhhmm.C + +#ifndef MAIN +#define MAIN +#include <iostream> // cin, cout, cerr +#include <fstream> // ofstream, ifstream +#include <stdio.h> // printf +using std::cout; +using std::cerr; +using std::endl; +using std::ios; +using std::ifstream; +using std::ofstream; +#include <stdlib.h> // exit +#include <string> // strcmp, strstr +#include <math.h> // sqrt, pow +#include <limits.h> // INT_MIN +#include <float.h> // FLT_MIN +#include <time.h> // clock +#include <ctype.h> // islower, isdigit etc +#include "util-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#include "list.h" // list data structure +#include "hash.h" // hash data structure +#include "hhdecl-C.h" +#include "hhutil-C.h" // imax, fmax, iround, iceil, ifloor, strint, strscn, strcut, substr, uprstr, uprchr, Basename etc. +#endif + +// #ifndef WNLIB +// #define WNLIB +// #include "wnconj.h" // Will Naylor's wnlib for optimization in C +// #endif + +////////////////////////////////////////////////////////////////////////////// +//// Class HMM +////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////// +// Object constructor +////////////////////////////////////////////////////////////////////////////// +HMM::HMM(int maxseqdis, int maxres) +{ + sname = new char*[maxseqdis]; // names of stored sequences + for (int i = 0; i < maxseqdis; i++){ sname[i] = NULL;} + seq = new char*[maxseqdis]; // residues of stored sequences (first at pos 1!) + for (int i = 0; i < maxseqdis; i++){ seq[i] = NULL;} + Neff_M = new float[maxres]; // Neff_M[i] = diversity of subalignment of seqs that have residue in col i + Neff_I = new float[maxres]; // Neff_I[i] = diversity of subalignment of seqs that have insert in col i + Neff_D = new float[maxres]; // Neff_D[i] = diversity of subalignment of seqs that have delete in col i + longname = new char[DESCLEN]; // Full name of first sequence of original alignment (NAME field) + ss_dssp = new char[maxres]; // secondary structure determined by dssp 0:- 1:H 2:E 3:C 4:S 5:T 6:G 7:B + sa_dssp = new char[maxres]; // solvent accessibility state determined by dssp 0:- 1:A (absolutely buried) 2:B 3:C 4:D 5:E (exposed) + ss_pred = new char[maxres]; // predicted secondary structure 0:- 1:H 2:E 3:C + ss_conf = new char[maxres]; // confidence value of prediction 0:- 1:0 ... 10:9 + Xcons = NULL; // create only when needed: consensus sequence in internal representation (A=0 R=1 N=2 D=3 ...) + l = new int[maxres]; // l[i] = pos. of j'th match state in aligment + /* FS introduced sentinel, NULL terminates loop in destructor, FS, r221->222 */ + f = new float*[maxres+1]; f[maxres] = NULL; // f[i][a] = prob of finding amino acid a in column i WITHOUT pseudocounts + g = new float*[maxres+1]; g[maxres] = NULL; // f[i][a] = prob of finding amino acid a in column i WITH pseudocounts + p = new float*[maxres+1]; p[maxres] = NULL; // p[i][a] = prob of finding amino acid a in column i WITH OPTIMUM pseudocounts + tr = new float*[maxres+1]; tr[maxres] = NULL; // log2 of transition probabilities M2M M2I M2D I2M I2I D2M D2D M2M_GAPOPEN GAPOPEN GAPEXTD +// tr_lin = new float*[maxres]; // linear transition probabilities M2M M2I M2D I2M I2I D2M D2D M2M_GAPOPEN GAPOPEN GAPEXTD + for (int i=0; i<maxres; i++) {f[i]=new(float[NAA+3]);} + for (int i=0; i<maxres; i++) {g[i]=new(float[NAA]);} + for (int i=0; i<maxres; i++) {p[i]=new(float[NAA]);} + for (int i=0; i<maxres; i++) {tr[i]=new(float[NTRANS]);} +// for (int i=0; i<maxres; i++) tr_lin[i]=new(float[NTRANS]); + L=0; + Neff_HMM=0; + n_display=N_in=N_filtered=0; + nss_dssp=nsa_dssp=nss_pred=nss_conf=nfirst=ncons=-1; +// lamda_hash.New(37,0.0); // Set size and NULL element for hash +// mu_hash.New(37,0.0); // Set size and NULL element for hash + lamda=0.0; mu=0.0; + name[0]=longname[0]=fam[0]='\0'; + trans_lin=0; // transition probs in log space +} + + +////////////////////////////////////////////////////////////////////////////// +// Object destructor +////////////////////////////////////////////////////////////////////////////// +HMM::~HMM() +{ + //Delete name and seq matrices + if (NULL != sname){ + for (int k=0; (k < n_display) && (NULL != sname[k]); k++){ + delete[] sname[k]; sname[k] = NULL; + } + delete[] sname; sname = NULL; + } + if (NULL != seq){ + for (int k=0; (k < n_display) && (NULL != seq[k]); k++){ + delete[] seq[k]; seq[k] = NULL; + } + delete[] seq; seq = NULL; + } + delete[] Neff_M; Neff_M = NULL; + delete[] Neff_D; Neff_D = NULL; + delete[] Neff_I; Neff_I = NULL; + delete[] longname; longname = NULL; + delete[] ss_dssp; ss_dssp = NULL; + delete[] sa_dssp; sa_dssp = NULL; + delete[] ss_pred; ss_pred = NULL; + delete[] ss_conf; ss_conf = NULL; + delete[] Xcons; Xcons = NULL; + delete[] l; l = NULL; + for (int i=0; i</*MAXRES*/par.maxResLen; i++){ + if (f[i]){ + delete[] f[i]; f[i] = NULL; + } + else break; + } + for (int i=0; i</*MAXRES*/par.maxResLen; i++){ + if (g[i]){ + delete[] g[i]; g[i] = NULL; + } + else break; + } + for (int i=0; i</*MAXRES*/par.maxResLen; i++){ + if (p[i]){ + delete[] p[i]; p[i] = NULL; + } + else break; + } + for (int i=0; i</*MAXRES*/par.maxResLen; i++){ + if (tr[i]){ + delete[] tr[i]; tr[i] = NULL; + } + else break; + } + // for (int i=0; i</*MAXRES*/par.maxResLen; i++) if (tr_lin[i]) delete[] tr_lin[i]; else break; + delete[] f; f = NULL; + delete[] g; g = NULL; + delete[] p; p = NULL; + delete[] tr; tr = NULL; +// delete[] tr_lin; +} + +////////////////////////////////////////////////////////////////////////////// +// Deep-copy constructor +////////////////////////////////////////////////////////////////////////////// +HMM& HMM::operator=(HMM& q) +{ + L=q.L; + for (int i=0; i<=L+1; ++i) + { + for (int a=0; a<NAA; ++a) + { + f[i][a]=q.f[i][a]; + g[i][a]=q.g[i][a]; + p[i][a]=q.p[i][a]; + } + for (int a=0; a<NTRANS; ++a) + tr[i][a]=q.tr[i][a]; + ss_dssp[i]=q.ss_dssp[i]; + sa_dssp[i]=q.sa_dssp[i]; + ss_pred[i]=q.ss_pred[i]; + ss_conf[i]=q.ss_conf[i]; + l[i]=q.l[i]; + } + if (q.Xcons) + for (int i=0; i<=L+1; ++i) + Xcons[i] =q.Xcons[i]; + + n_display=q.n_display; + for (int k=0; k<n_display; k++) { + sname[k]=new(char[strlen(q.sname[k])+1]); + if (!sname[k]) MemoryError("array of names for sequences to display"); + strcpy(sname[k],q.sname[k]); + } + for (int k=0; k<n_display; k++) { + seq[k]=new(char[strlen(q.seq[k])+1]); + if (!seq[k]) MemoryError("array of names for sequences to display"); + strcpy(seq[k],q.seq[k]); + } + ncons=q.ncons; + nfirst=q.nfirst; + nss_dssp=q.nss_dssp; + nsa_dssp=q.nsa_dssp; + nss_pred=q.nss_pred; + nss_conf=q.nss_conf; + + for (int i=0; i<=L+1; ++i) Neff_M[i]=q.Neff_M[i]; + for (int i=0; i<=L+1; ++i) Neff_I[i]=q.Neff_I[i]; + for (int i=0; i<=L+1; ++i) Neff_D[i]=q.Neff_D[i]; + Neff_HMM=q.Neff_HMM; + + strcpy(longname,q.longname); + strcpy(name,q.name); + strcpy(fam,q.fam); + strcpy(sfam,q.sfam); + strcpy(fold,q.fold); + strcpy(cl,q.cl); + strcpy(file,q.file); + + lamda=q.lamda; + mu=q.mu; + + for (int a=0; a<NAA; ++a) pav[a]=q.pav[a]; + N_in=q.N_in; + N_filtered=q.N_filtered; + trans_lin=q.trans_lin; + return (HMM&) (*this); +} + + +/////////////////////////////////////////////////////////////////////////////// +/** + * @brief Read an HMM from an HHsearch .hhm file; return 0 at end of file + */ +int +HMM::Read(FILE* dbf, char* path) +{ + char line[LINELEN]=""; // input line + char str3[8]="",str4[8]=""; // first 3 and 4 letters of input line + char* ptr; // pointer for string manipulation + int i=0; // index for match state (first=1) + int a; // amino acid index + static int warn=0; + + trans_lin=0; + L=0; + Neff_HMM=0; + n_display=N_in=N_filtered=0; + nss_dssp=nsa_dssp=nss_pred=nss_conf=nfirst=ncons=-1; + lamda=mu=0.0; + trans_lin=0; // transition probs in log space + name[0]=longname[0]=fam[0]='\0'; + //If at the end of while-loop L is still 0 then we have reached end of db file + + //Do not delete name and seq vectors because their adresses are transferred to hitlist as part of a hit!! + + while (fgetline(line,LINELEN-1,dbf) && !(line[0]=='/' && line[1]=='/')) + { + + if (strscn(line)==NULL) continue; // skip lines that contain only white space + substr(str3,line,0,2); // copy the first three characters into str3 + substr(str4,line,0,3); // copy the first four characters into str4 + + if (!strncmp("HH",line,2)) continue; + + if (!strcmp("NAME",str4)) + { + ptr=strscn(line+4); //advance to first non-white-space character + if (ptr) + { + strncpy(longname,ptr,DESCLEN-1); //copy full name to longname + longname[DESCLEN-1]='\0'; + strncpy(name,ptr,NAMELEN-1); //copy longname to name... + strcut(name); //...cut after first word... + } + else + { + strcpy(longname,"undefined"); + strcpy(name,"undefined"); + } + if (v>=4) cout<<"Reading in HMM "<<name<<":\n"; + } + + else if (!strcmp("FAM",str3)) + { + ptr=strscn(line+3); //advance to first non-white-space character + if (ptr) strncpy(fam,ptr,IDLEN-1); else strcpy(fam,""); //copy family name to basename + ScopID(cl,fold,sfam,fam); //get scop classification from basename (e.g. a.1.2.3.4) + } + + else if (!strcmp("FILE",str4)) + { + if (path) strncpy(file,path,NAMELEN-1); else *file='\0'; // copy path to file variable + ptr=strscn(line+4); //advance to first non-white-space character + if (ptr) + strncat(file,ptr,NAMELEN-1-strlen(file)); // append file name read from file to path + else strcat(file,"*"); + } + + else if (!strcmp("LENG",str4)) + { + ptr=line+4; + L=strint(ptr); //read next integer (number of match states) + } + else if (!strcmp("FILT",str4) || !strcmp("NSEQ",str4)) + { + ptr=line+4; + N_filtered=strint(ptr); //read next integer: number of sequences after filtering + N_in=strint(ptr); //read next integer: number of sequences in alignment + } + + else if (!strcmp("NEFF",str4) || !strcmp("NAA",str3)) sscanf(line+6,"%f",&Neff_HMM); + + else if (!strcmp("EVD",str3)) + { +// char key[IDLEN]; + sscanf(line+6,"%f %f",&lamda,&mu); +// sscanf(line+22,"%s",key); +// lamda_hash.Add(key,lamda); +// mu_hash.Add(key,mu); + } + + else if (!strcmp("DESC",str4)) continue; + else if (!strcmp("COM",str3)) continue; + else if (!strcmp("DATE",str4)) continue; + + ///////////////////////////////////////////////////////////////////////////////////// + // Read template sequences that should get displayed in output alignments + else if (!strcmp("SEQ",str3)) + { + //char cur_seq[MAXCOL]=""; //Sequence currently read in + char *cur_seq = new(char[par.maxColCnt]); //Sequence currently read in + int k; // sequence index; start with -1; after reading name of n'th sequence-> k=n + int h; // index for character in input line + int l=1; // index of character in sequence seq[k] + int i=1; // index of match states in ss_dssp[i] and ss_pred[i] sequence + int n_seq=0; // number of sequences to be displayed EXCLUDING ss sequences + cur_seq[0]='-'; // overwrite '\0' character at beginning to be able to do strcpy(*,cur_seq) + k=-1; + while (fgetline(line,LINELEN-1,dbf) && line[0]!='#') + { + if (v>=4) cout<<"Read from file:"<<line<<"\n"; //DEBUG + if (line[0]=='>') //line contains sequence name + { + if (k>=MAXSEQDIS-1) //maximum number of allowable sequences exceeded + {while (fgetline(line,LINELEN-1,dbf) && line[0]!='#'); break;} + k++; + if (!strncmp(line,">ss_dssp",8)) nss_dssp=k; + else if (!strncmp(line,">sa_dssp",8)) nsa_dssp=k; + else if (!strncmp(line,">ss_pred",8)) nss_pred=k; + else if (!strncmp(line,">ss_conf",8)) nss_conf=k; + else if (!strncmp(line,">Cons-",6) || !strncmp(line,">Consensus",10)) ncons=k; + else + { + if (nfirst==-1) nfirst=k; + if (n_seq>=par.nseqdis) + {while (fgetline(line,LINELEN-1,dbf) && line[0]!='#'); k--; break;} + n_seq++; + } + + //If this is not the first sequence then store residues of previous sequence + if (k>0) { + seq[k-1]=new(char[strlen(cur_seq)+1]); + if (!seq[k-1]) MemoryError("array of sequences to display"); + strcpy(seq[k-1],cur_seq); + } + + // store sequence name + strcut(line+1); //find next white-space character and overwrite it with end-of-string character + sname[k] = new (char[strlen(line+1)+1]); //+1 for terminating '\0' + if (!sname[k]) MemoryError("array of names for sequences to display"); + strcpy(sname[k],line+1); //store sequence name in **name + l=1; i=1; + } + else //line contains sequence residues + { + if (k==-1) + { + cerr<<endl<<"WARNING: Ignoring following line while reading HMM"<<name<<":\n\'"<<line<<"\'\n"; + continue; + } + + h=0; //counts characters in current line + + // Check whether all characters are correct; store into cur_seq + if (k==nss_dssp) // lines with dssp secondary structure states (. - H E C S T G B) + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (ss2i(line[h])>=0 && line[h]!='.') + { + char c=ss2ss(line[h]); + cur_seq[l]=c; + if (c!='.' && !(c>='a' && c<='z')) ss_dssp[i++]=ss2i(c); + l++; + } + else if (v && ss2i(line[h])==-2) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line '"<<line<<"' of HMM "<<name<<"\n"; + h++; + } + } + if (k==nsa_dssp) // lines with dssp secondary solvent accessibility (- A B C D E) + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (sa2i(line[h])>=0) + { + char c=line[h]; + cur_seq[l]=c; + if (c!='.' && !(c>='a' && c<='z')) sa_dssp[i++]=sa2i(c); + l++; + } + else if (v && sa2i(line[h])==-2) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line '"<<line<<"' of HMM "<<name<<"\n"; + h++; + } + } + else if (k==nss_pred) // lines with predicted secondary structure (. - H E C) + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (ss2i(line[h])>=0 && ss2i(line[h])<=3 && line[h]!='.') + { + char c=ss2ss(line[h]); + cur_seq[l]=c; + if (c!='.' && !(c>='a' && c<='z')) ss_pred[i++]=ss2i(c); + l++; + } + else if (v && ss2i(line[h])==-2) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line '"<<line<<"' of HMM "<<name<<"\n"; + h++; + } + } + else if (k==nss_conf) // lines with confidence values should contain only 0-9, '-', or '.' + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (line[h]=='-' || (line[h]>='0' && line[h]<='9')) + { + cur_seq[l]=line[h]; + ss_conf[l]=cf2i(line[h]); + l++; + } + else if (v && cf2i(line[h])==-2) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line '"<<line<<"' of HMM "<<name<<"\n"; + h++; + } + } + else // normal line containing residues + { + while (h<LINELEN && line[h]>'\0' && l</*MAXCOL*/par.maxColCnt-1) + { + if (aa2i(line[h])>=0 && line[h]!='.') // ignore '.' and white-space characters ' ', \t and \n (aa2i()==-1) + {cur_seq[l]=line[h]; l++;} + else if (aa2i(line[h])==-2 && v) + cerr<<endl<<"WARNING: invalid symbol \'"<<line[h]<<"\' at pos. "<<h<<" in line '"<<line<<"' of HMM "<<name<<"\n"; + h++; + } + } + cur_seq[l]='\0'; //Ensure that cur_seq ends with a '\0' character + + } //end else + } //while(getline) + //If this is not the first sequence some residues have already been read in + if (k>=0) { + seq[k]=new(char[strlen(cur_seq)+1]); + if (!seq[k]) MemoryError("array of sequences to display"); + strcpy(seq[k],cur_seq); + } + n_display=k+1; + + // DEBUG + if (v>=4) + { + printf("nss_dssp=%i nsa_dssp=%i nss_pred=%i nss_conf=%i nfirst=%i\n",nss_dssp,nsa_dssp,nss_pred,nss_conf,nfirst); + for (k=0; k<n_display; k++) + { + int j; + cout<<">"<<sname[k]<<"(k="<<k<<")\n"; + if (k==nss_dssp) {for (j=1; j<=L; j++) cout<<char(i2ss(ss_dssp[j]));} + else if (k==nsa_dssp) {for (j=1; j<=L; j++) cout<<char(i2sa(sa_dssp[j]));} + else if (k==nss_pred) {for (j=1; j<=L; j++) cout<<char(i2ss(ss_pred[j]));} + else if (k==nss_conf) {for (j=1; j<=L; j++) cout<<int(ss_conf[j]-1);} + else {for (j=1; j<=L; j++) cout<<seq[k][j];} + cout<<"\n"; + } + } + + } //end if("SEQ") + + ///////////////////////////////////////////////////////////////////////////////////// + // Read average amino acid frequencies for HMM + else if (!strcmp("FREQ",str4)) + { + fprintf(stderr,"Error: hhm file has obsolete format.\n"); + fprintf(stderr,"Please use hhmake version > 1.1 to generate hhm files.\n"); + exit(1); + } + + else if (!strcmp("AVER",str4)) {} // AVER line scrapped + else if (!strcmp("NULL",str4)) + { + ptr=line+4; + for (a=0; a<20 && ptr; ++a) + //s2[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids + pb[s2a[a]] = (float) fpow2(float(-strinta(ptr))/HMMSCALE); + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf("\nNULL "); + for (a=0; a<20; ++a) printf("%5.1f ",100.*pb[s2a[a]]); + printf("\n"); + } + } + + ///////////////////////////////////////////////////////////////////////////////////// + // Read transition probabilities from start state + else if (!strcmp("HMM",str3)) + { + fgetline(line,LINELEN-1,dbf); // Skip line with amino acid labels + fgetline(line,LINELEN-1,dbf); // Skip line with transition labels + ptr=line; + for (a=0; a<=D2D && ptr; ++a) + tr[0][a] = float(-strinta(ptr))/HMMSCALE; //store transition probabilites as log2 values + // strinta returns next integer in string and puts ptr to first char + // after the integer. Returns -99999 if '*' is found. + // ptr is set to 0 if no integer is found after ptr. + Neff_M[0] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with M->? transition + Neff_I[0] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with I->? transition + Neff_D[0] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with D->? transition + if (!ptr) return Warning(dbf,line,name); + + ///////////////////////////////////////////////////////////////////////////////////// + // Read columns of HMM + int next_i=0; // index of next column + while (fgetline(line,LINELEN-2,dbf) && !(line[0]=='/' && line[1]=='/') && line[0]!='#') + { + if (strscn(line)==NULL) continue; // skip lines that contain only white space + + // Read in AA probabilities + ptr=line+1; + int prev_i = next_i; + next_i = strint(ptr); ++i; + if (v && next_i!=prev_i+1) + if (++warn<=5) + { + cerr<<endl<<"WARNING: in HMM "<<name<<" state "<<prev_i<<" is followed by state "<<next_i<<"\n"; + if (warn==5) cerr<<endl<<"WARNING: further warnings while reading HMMs will be suppressed.\n"; + } + if (i>L) + { + cerr<<endl<<"WARNING: in HMM "<<name<<" there are more columns than the stated length "<<L<<". Skipping HMM\n"; + return 2; + } + if (i>=/*MAXRES*/par.maxResLen-2) + { + fgetline(line,LINELEN-1,dbf); // Skip line + continue; + } + + for (a=0; a<20 && ptr; ++a) +// f[i][s2a[a]] = (float)pow(2.,float(-strinta(ptr))/HMMSCALE); + f[i][s2a[a]] = fpow2(float(-strinta(ptr))/HMMSCALE); // speed-up ~5 s for 10000 SCOP domains + + //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids + l[i]=strint(ptr); + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf("%s",line); + printf("%6i ",i); + for (a=0; a<20; ++a) printf("%5.1f ",100*f[i][s2a[a]]); + printf("%5i",l[i]); + printf("\n"); + } + + // Read transition probabilities + fgetline(line,LINELEN-1,dbf); // Skip line with amino acid labels + if (line[0]!=' ' && line[0]!='\t') return Warning(dbf,line,name); + ptr=line; + for (a=0; a<=D2D && ptr; ++a) + tr[i][a] = float(-strinta(ptr))/HMMSCALE; //store transition prob's as log2-values + Neff_M[i] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with M->? transition + Neff_I[i] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with I->? transition + Neff_D[i] = float(strinta(ptr))/HMMSCALE; // Read eff. number of sequences with D->? transition + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf(" "); + for (a=0; a<=D2D; ++a) printf("%5.1f ",100*fpow2(tr[i][a])); + printf("%5.1f %5.1f %5.1f \n",Neff_M[i],Neff_I[i],Neff_D[i]); + } + } + if (line[0]=='/' && line[1]=='/') break; + } + else if (v) cerr<<endl<<"WARNING: Ignoring line\n\'"<<line<<"\'\nin HMM "<<name<<"\n"; + + } //while(getline) + + if (L==0) return 0; //End of db file -> stop reading in + + // Set coefficients of EVD (= 0.0 if not calibrated for these parameters) +// lamda = lamda_hash.Show(par.Key()); +// mu = mu_hash.Show(par.Key()); + if (lamda && v>=3) printf("HMM %s is already calibrated: lamda=%-5.3f, mu=%-5.2f\n",name,lamda,mu); + + if (v && i!=L) cerr<<endl<<"Warning: in HMM "<<name<<" there are only "<<i<<" columns while the stated length is "<<L<<"\n"; + if (v && i>/*MAXRES*/par.maxResLen-2) {i=/*MAXRES*/par.maxResLen-2; cerr<<endl<<"WARNING: maximum number "<</*MAXRES*/par.maxResLen-2<<" of residues exceeded while reading HMM "<<name<<"\n";} + if (v && !i) cerr<<endl<<"WARNING: HMM "<<name<<" contains no match states. Check the alignment that gave rise to this HMM.\n"; + if (v>=2) cout<<"Read in HMM "<<name<<" with "<<L<<" match states and effective number of sequences = "<<Neff_HMM<<"\n"; + L = i; + + // Set emission probabilities of zero'th (begin) state and L+1st (end) state to background probabilities + for (a=0; a<20; ++a) f[0][a]=f[L+1][a]=pb[a]; + Neff_M[L+1]=1.0f; + Neff_I[L+1]=Neff_D[L+1]=0.0f; + + return 1; //return status: ok + +} /* this is the end of HMM::Read() */ + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Read an HMM from a HMMer .hmm file; return 0 at end of file + */ +int +HMM::ReadHMMer(FILE* dbf, char* filestr) +{ + char line[LINELEN]=""; // input line + char desc[DESCLEN]=""; // description of family + char str4[5]=""; // first 4 letters of input line + char* ptr; // pointer for string manipulation + int i=0; // index for match state (first=1) + int a; // amino acid index + char dssp=0; // 1 if a consensus SS has been found in the transition prob lines + char annot=0; // 1 if at least one annotation character in insert lines is ne '-' or ' ' + int k=0; // index for seq[k] + static char ignore_hmmer_cal = 0; + char* annotchr; // consensus amino acids in ASCII format, or, in HMMER format, the reference annotation character in insert line + //annotchr = new char[MAXRES]; // consensus amino acids in ASCII format, or, in HMMER format, the reference annotation character in insert line + annotchr = new char[par.maxResLen]; // consensus amino acids in ASCII format, or, in HMMER format, the reference annotation character in insert line + static int warn=0; + int iAlpha = 20; /* size of alphabet, default is protein = 20 */ + double dAlphaInv = 1.00 / (double)(iAlpha); /* weight of AA */ + + trans_lin=0; + L=0; + Neff_HMM=0; + n_display=N_in=N_filtered=0; + nss_dssp=nsa_dssp=nss_pred=nss_conf=nfirst=ncons=-1; + lamda=mu=0.0; + trans_lin=0; // transition probs in log space + name[0]=longname[0]=desc[0]=fam[0]='\0'; + //If at the end of while-loop L is still 0 then we have reached end of db file + + // Do not delete name and seq vectors because their adresses are transferred to hitlist as part of a hit!! + + while (fgetline(line,LINELEN-1,dbf) && !(line[0]=='/' && line[1]=='/')) + { + + if (strscn(line)==NULL) continue; // skip lines that contain only white space + if (!strncmp("HMMER",line,5)) continue; + + substr(str4,line,0,3); // copy the first four characters into str4 + + if (!strcmp("NAME",str4) && name[0]=='\0') + { + ptr=strscn(line+4); // advance to first non-white-space character + strncpy(name,ptr,NAMELEN-1); // copy full name to name + strcut(name); // ...cut after first word... + if (v>=4) cout<<"Reading in HMM "<<name<<":\n"; + } + + else if (!strcmp("ACC ",str4)) + { + ptr=strscn(line+4); // advance to first non-white-space character + strncpy(longname,ptr,DESCLEN-1); // copy Accession id to longname... + } + + else if (!strcmp("DESC",str4)) + { + ptr=strscn(line+4); // advance to first non-white-space character + if (ptr) + { + strncpy(desc,ptr,DESCLEN-1); // copy description to name... + desc[DESCLEN-1]='\0'; + strcut(ptr); // ...cut after first word... + } + if (!ptr || ptr[1]!='.' || strchr(ptr+3,'.')==NULL) strcpy(fam,""); else strcpy(fam,ptr); // could not find two '.' in name? + } + + else if (!strcmp("LENG",str4)) + { + ptr=line+4; + L=strint(ptr); //read next integer (number of match states) + } + + else if (!strcmp("ALPH",str4)) { + + ptr=strscn(line+4); + + if (0 == strcmp(ptr, "Amino")){ + iAlpha = 20; + } + else if (0 == strcmp(ptr, "Nucleic")){ + iAlpha = 4; + printf("%s:%s:%d: WARNING: HMM reading does not work for DNA/RNA\n", + __FUNCTION__, __FILE__, __LINE__); + } + else { + return Warning(dbf,line,name); + } + dAlphaInv = 1.00 / (double)(iAlpha); + //continue; + } + else if (!strcmp("RF ",str4)) continue; + else if (!strcmp("CS ",str4)) continue; + else if (!strcmp("MAP ",str4)) continue; + else if (!strcmp("COM ",str4)) continue; + else if (!strcmp("NSEQ",str4)) + { + ptr=line+4; + N_in=N_filtered=strint(ptr); //read next integer: number of sequences after filtering + } + + else if (!strcmp("DATE",str4)) continue; + else if (!strncmp("CKSUM ",line,5)) continue; + else if (!strcmp("GA ",str4)) continue; + else if (!strcmp("TC ",str4)) continue; + else if (!strcmp("NC ",str4)) continue; + + else if (!strncmp("SADSS",line,5)) + { + if (nsa_dssp<0) + { + nsa_dssp=k++; + seq[nsa_dssp] = new(char[/*MAXRES*/par.maxResLen+2]); + sname[nsa_dssp] = new(char[15]); + strcpy(seq[nsa_dssp]," "); + strcpy(sname[nsa_dssp],"sa_dssp"); + + } + ptr=strscn(line+5); + if (ptr) + { + strcut(ptr); + if (strlen(seq[nsa_dssp])+strlen(ptr)>=(unsigned)(/*MAXRES*/par.maxResLen)) + printf("\nWARNING: HMM %s has SADSS records with more than %i residues.\n",name,/*MAXRES*/par.maxResLen); + else strcat(seq[nsa_dssp],ptr); + } + } + + else if (!strncmp("SSPRD",line,5)) + { + if (nss_pred<0) + { + nss_pred=k++; + seq[nss_pred] = new(char[/*MAXRES*/par.maxResLen+2]); + sname[nss_pred] = new(char[15]); + strcpy(seq[nss_pred]," "); + strcpy(sname[nss_pred],"ss_pred"); + + } + ptr=strscn(line+5); + if (ptr) + { + strcut(ptr); + if (strlen(seq[nss_pred])+strlen(ptr)>=(unsigned)(/*MAXRES*/par.maxResLen)) + printf("\nWARNING: HMM %s has SSPRD records with more than %i residues.\n",name,/*MAXRES*/par.maxResLen); + else strcat(seq[nss_pred],ptr); + } + } + + else if (!strncmp("SSCON",line,5)) + { + if (nss_conf<0) + { + nss_conf=k++; + seq[nss_conf] = new(char[/*MAXRES*/par.maxResLen+2]); + sname[nss_conf] = new(char[15]); + strcpy(seq[nss_conf]," "); + strcpy(sname[nss_conf],"ss_conf"); + } + ptr=strscn(line+5); + if (ptr) + { + strcut(ptr); + if (strlen(seq[nss_conf])+strlen(ptr)>=(unsigned)(/*MAXRES*/par.maxResLen)) + printf("\nWARNING: HMM %s has SSPRD records with more than %i residues.\n",name,/*MAXRES*/par.maxResLen); + else strcat(seq[nss_conf],ptr); + } + } + + else if (!strncmp("SSCIT",line,5)) continue; + else if (!strcmp("XT ",str4)) continue; + else if (!strcmp("NULT",str4)) continue; + + else if (!strcmp("NULE",str4)) + { + ptr=line+4; + for (a=0; (a < iAlpha) && ptr; ++a){ + /* FIXME: FS introduced alphabet size (was '20') + and dAlphaInv (was '0.05' = 1/20) */ + //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids + pb[s2a[a]] = (float) dAlphaInv * fpow2(float(strinta(ptr,-99999))/HMMSCALE); /* dAlphaInv */ + } + for (a = iAlpha; a < 20; a++){ + pb[s2a[a]] = 0.0; + } + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf("\nNULL "); + for (a=0; a<iAlpha; ++a) { /* FIXME: FS introduced iAlpha, was '20' */ + printf("%5.1f ",100.*pb[s2a[a]]); + } + printf("\n"); + } + } + + else if (!strcmp("EVD ",str4)) + { + char* ptr=line+4; + ptr = strscn(ptr); + sscanf(ptr,"%f",&lamda); + ptr = strscn(ptr); + sscanf(ptr,"%f",&mu); + if (lamda<0) + { + if (v>=2 && ignore_hmmer_cal==0) + cerr<<endl<<"Warning: some HMMs have been calibrated with HMMER's 'hmmcalibrate'. These calibrations will be ignored\n"; + ignore_hmmer_cal=1; + mu = lamda = 0.0; + } + } + + ///////////////////////////////////////////////////////////////////////////////////// + // Read transition probabilities from start state + else if (!strncmp("HMM",line,3)) + { + fgetline(line,LINELEN-1,dbf); // Skip line with amino acid labels + fgetline(line,LINELEN-1,dbf); // Skip line with transition labels + ptr=line; + for (a=0; a<=M2D && ptr; ++a) + tr[0][a] = float(strinta(ptr,-99999))/HMMSCALE; //store transition probabilites as log2 values + // strinta returns next integer in string and puts ptr to first char + // after the integer. Returns -99999 if '*' is found. + // ptr is set to 0 if no integer is found after ptr. + tr[0][I2M] = tr[0][D2M] = 0.0; + tr[0][I2I] = tr[0][D2D] = -99999.0; + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf(" "); + for (a=0; a<=D2D && ptr; ++a) printf("%5.1f ",100*fpow2(tr[i][a])); + printf("\n"); + } + + // Prepare to store DSSP states (if there are none, delete afterwards) + nss_dssp=k++; + seq[nss_dssp] = new(char[/*MAXRES*/par.maxResLen+2]); + sname[nss_dssp] = new(char[15]); + strcpy(sname[nss_dssp],"ss_dssp"); + + ///////////////////////////////////////////////////////////////////////////////////// + // Read columns of HMM + int next_i=0; // index of next column + while (fgetline(line,LINELEN-1,dbf) && !(line[0]=='/' && line[1]=='/') && line[0]!='#') + { + if (strscn(line)==NULL) continue; // skip lines that contain only white space + + // Read in AA probabilities + ptr=line; + int prev_i = next_i; + next_i = strint(ptr); ++i; + if (v && next_i!=prev_i+1) + if (++warn<5) + { + cerr<<endl<<"WARNING: in HMM "<<name<<" state "<<prev_i<<" is followed by state "<<next_i<<"\n"; + if (warn==5) cerr<<endl<<"WARNING: further warnings while reading HMMs will be suppressed.\n"; + } + if (i>L) + { + cerr<<endl<<"Error: in HMM "<<name<<" there are more columns than the stated length "<<L<<"\n"; + return 2; + } + if (i>L && v) + cerr<<endl<<"WARNING: in HMM "<<name<<" there are more columns than the stated length "<<L<<"\n"; + if (i>=/*MAXRES*/par.maxResLen-2) + { + fgetline(line,LINELEN-1,dbf); // Skip two lines + fgetline(line,LINELEN-1,dbf); + continue; + } + + for (a=0; (a<iAlpha) && ptr; ++a){ /* FIXME: FS introduced iAlpha, was '20' */ + f[i][s2a[a]] = (float) pb[s2a[a]]*fpow2(float(strinta(ptr,-99999))/HMMSCALE); + //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids + } + for (a = iAlpha; a < 20; a++){ + f[i][s2a[a]] = 0.0; + } + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf("%6i ",i); + for (a=0; a<iAlpha; ++a) { /* FIXME: FS introduced iAlpha, was '20' */ + printf("%5.1f ",100*f[i][s2a[a]]); + } + printf("\n"); + } + + // Read insert emission line + fgetline(line,LINELEN-1,dbf); + ptr = strscn(line); + if (!ptr) return Warning(dbf,line,name); + annotchr[i]=uprchr(*ptr); + if (*ptr!='-' && *ptr!=' ') annot=1; + + // Read annotation character and seven transition probabilities + fgetline(line,LINELEN-1,dbf); + ptr = strscn(line); + switch (*ptr) + { + case 'H': + ss_dssp[i]=1; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'E': + ss_dssp[i]=2; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'C': + ss_dssp[i]=3; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'S': + ss_dssp[i]=4; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'T': + ss_dssp[i]=5; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'G': + ss_dssp[i]=6; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'B': + ss_dssp[i]=7; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'I': + dssp=1; + case '~': + ss_dssp[i]=3; + seq[nss_dssp][i]=*ptr; + break; + case '-': + default: + ss_dssp[i]=0; + seq[nss_dssp][i]=*ptr; + break; + + } + + ptr+=2; + for (a=0; a<=D2D && ptr; ++a) + tr[i][a] = float(strinta(ptr,-99999))/HMMSCALE; //store transition prob's as log2-values + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf(" "); + for (a=0; a<=D2D; ++a) printf("%5.1f ",100*fpow2(tr[i][a])); + printf("\n"); + } + } + + if (line[0]=='/' && line[1]=='/') break; + + } /* strncmp("HMM") */ + + } //while(getline) + + if (L==0) return 0; //End of db file -> stop reading in + + // Set coefficients of EVD (= 0.0 if not calibrated for these parameters) + // lamda = lamda_hash.Show(par.Key()); + // mu = mu_hash.Show(par.Key()); + if (lamda && v>=2) printf("HMM %s is already calibrated: lamda=%-5.3f, mu=%-5.2f\n",name,lamda,mu); + + if (v && i!=L) cerr<<endl<<"Warning: in HMM "<<name<<" there are only "<<i<<" columns while the stated length is "<<L<<"\n"; + if (v && i>=/*MAXRES*/par.maxResLen-2) {i=/*MAXRES*/par.maxResLen-2; cerr<<endl<<"WARNING: maximum number "<</*MAXRES*/par.maxResLen-2<<" of residues exceeded while reading HMM "<<name<<"\n";} + if (v && !i) cerr<<endl<<"WARNING: HMM "<<name<<" contains no match states. Check the alignment that gave rise to this HMM.\n"; + L = i; + + if (strlen(longname)>0) strcat(longname," "); + strncat(longname,name,DESCLEN-strlen(longname)-1); // longname = ACC NAME DESC + if (strlen(name)>0) strcat(longname," "); + strncat(longname,desc,DESCLEN-strlen(longname)-1); + longname[DESCLEN-1]='\0'; + ScopID(cl,fold,sfam,fam);// get scop classification from basename (e.g. a.1.2.3.4) + RemoveExtension(file,filestr); // copy name of dbfile without extension into 'file' + + // Secondary structure + if (!dssp) + { + // remove dssp sequence + // memory that had been allocated in case ss_dssp was given needs to be freed + delete[] seq[nss_dssp]; seq[nss_dssp] = NULL; + // memory that had been allocated in case ss_dssp was given needs to be freed + delete[] sname[nss_dssp]; sname[nss_dssp] = NULL; + nss_dssp=-1; + k--; + } + if (nss_pred>=0) + { + for (i=1; i<=L; ++i) ss_pred[i] = ss2i(seq[nss_pred][i]); + if (nss_conf>=0) + for (i=1; i<=L; ++i) ss_conf[i] = cf2i(seq[nss_conf][i]); + else + for (i=1; i<=L; ++i) ss_conf[i] = 5; + } + + // Copy query (first sequence) and consensus residues? + if (par.showcons) + { + sname[k]=new(char[10]); + strcpy(sname[k],"Consensus"); + sname[k+1]=new(char[strlen(longname)+1]); + strcpy(sname[k+1],longname); + seq[k]=new(char[L+2]); + seq[k][0]=' '; + seq[k][L+1]='\0'; + seq[k+1]=new(char[L+2]); + seq[k+1][0]=' '; + seq[k+1][L+1]='\0'; + for (i=1; i<=L; ++i) + { + float pmax=0.0; + int amax=0; + for (a=0; a<NAA; ++a) + if (f[i][a]>pmax) {amax=a; pmax=f[i][a];} + if (pmax>0.6) seq[k][i]=i2aa(amax); + else if (pmax>0.4) seq[k][i]=lwrchr(i2aa(amax)); + else seq[k][i]='x'; + seq[k+1][i]=i2aa(amax); + } + ncons=k++; // nfirst is set later! + } + else + { + sname[k]=new(char[strlen(longname)+1]); + /* FIXME valgrind says bytes get lost here during hmm iteration -- + fixed in HMM::ClobberGlobal(), I (FS) think */ + strcpy(sname[k],longname); + seq[k]=new(char[L+2]); + seq[k][0]=' '; + seq[k][L+1]='\0'; + } + + if (annot) // read in some annotation characters? + { + annotchr[0]=' '; + annotchr[L+1]='\0'; + strcpy(seq[k],annotchr); // overwrite the consensus sequence with the annotation characters + } + else if (!par.showcons) // we have not yet calculated the consensus, but we need it now as query (first sequence) + { + /* FIXME: FS set ncons=k + don't understand why it is not set but seem to need it */ + ncons = k; + for (i=1; i<=L; ++i) + { + float pmax=0.0; + int amax=0; + for (a=0; a<NAA; ++a) + if (f[i][a]>pmax) {amax=a; pmax=f[i][a];} + seq[k][i]=i2aa(amax); + } + } +// printf("%i query name=%s seq=%s\n",n,sname[n],seq[n]); + nfirst=k++; + + n_display=k; + + // Calculate overall Neff_HMM + Neff_HMM=0; + for (i=1; i<=L; ++i) + { + float S=0.0; + for (a=0; a<iAlpha; ++a) { /* FIXME: FS introduced iAlpha, was '20' */ + if (f[i][a]>1E-10) S-=f[i][a]*fast_log2(f[i][a]); + } + Neff_HMM+=(float) fpow2(S); + } + Neff_HMM/=L; + for (i=0; i<=L; ++i) Neff_M[i] = Neff_I[i] = Neff_D[i] = 10.0; // to add only little additional pseudocounts! + if (v>=2) + cout<<"Read in HMM "<<name<<" with "<<L<<" match states and effective number of sequences = "<<Neff_HMM<<"\n"; + + // Set emission probabilities of zero'th (begin) state and L+1st (end) state to background probabilities + for (a=0; a<iAlpha; ++a) { /* FIXME: FS introduced iAlpha, was '20' */ + f[0][a]=f[L+1][a]=pb[a]; + } + delete[] annotchr; annotchr = NULL; + + return 1; //return status: ok + +} /* this is the end of HMM::ReadHMMer() */ + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Read an HMM from a HMMER3 .hmm file; return 0 at end of file + */ +int +HMM::ReadHMMer3(FILE* dbf, char* filestr) +{ + char line[LINELEN]=""; // input line + char desc[DESCLEN]=""; // description of family + char str4[5]=""; // first 4 letters of input line + char* ptr; // pointer for string manipulation + int i=0; // index for match state (first=1) + int a; // amino acid index + char dssp=0; // 1 if a consensus SS has been found in the transition prob lines + char annot=0; // 1 if at least one annotation character in insert lines is ne '-' or ' ' + int k=0; // index for seq[k] + char* annotchr; // consensus amino acids in ASCII format, or, in HMMER format, the reference annotation character in insert line + //annotchr = new char[MAXRES]; // consensus amino acids in ASCII format, or, in HMMER format, the reference annotation character in insert line + annotchr = new char[par.maxResLen]; // consensus amino acids in ASCII format, or, in HMMER format, the reference annotation character in insert line + static int warn=0; + int iAlpha = 20; /* size of alphabet, default is protein = 20 */ + double dAlphaInv = 1.00 / (double)(iAlpha); /* weight of AA */ + + trans_lin=0; + L=0; + Neff_HMM=0; + n_seqs=n_display=N_in=N_filtered=0; + nss_dssp=nsa_dssp=nss_pred=nss_conf=nfirst=ncons=-1; + lamda=mu=0.0; + trans_lin=0; // transition probs in log space + name[0]=longname[0]=desc[0]=fam[0]='\0'; + //If at the end of while-loop L is still 0 then we have reached end of db file + + // Do not delete name and seq vectors because their adresses are transferred to hitlist as part of a hit!! + + + while (fgetline(line,LINELEN-1,dbf) && !(line[0]=='/' && line[1]=='/')) + { + + if (strscn(line)==NULL) continue; // skip lines that contain only white space + if (!strncmp("HMMER",line,5)) continue; + + substr(str4,line,0,3); // copy the first four characters into str4 + + if (!strcmp("NAME",str4) && name[0]=='\0') + { + ptr=strscn(line+4); // advance to first non-white-space character + strncpy(name,ptr,NAMELEN-1); // copy full name to name + strcut(name); // ...cut after first word... + if (v>=4) cout<<"Reading in HMM "<<name<<":\n"; + } + + else if (!strcmp("ACC ",str4)) + { + ptr=strscn(line+4); // advance to first non-white-space character + strncpy(longname,ptr,DESCLEN-1); // copy Accession id to longname... + } + + else if (!strcmp("DESC",str4)) + { + ptr=strscn(line+4); // advance to first non-white-space character + if (ptr) + { + strncpy(desc,ptr,DESCLEN-1); // copy description to name... + desc[DESCLEN-1]='\0'; + strcut(ptr); // ...cut after first word... + } + if (!ptr || ptr[1]!='.' || strchr(ptr+3,'.')==NULL) strcpy(fam,""); else strcpy(fam,ptr); // could not find two '.' in name? + } + + else if (!strcmp("LENG",str4)) + { + ptr=line+4; + L=strint(ptr); //read next integer (number of match states) + } + + else if (!strcmp("ALPH",str4)) { + + ptr=strscn(line+4); + + if (0 == strcmp(ptr, "amino")){ + iAlpha = 20; + } + else if (0 == strcmp(ptr, "Nucleic")){ + iAlpha = 4; + printf("%s:%s:%d: WARNING: HMM reading does not work for DNA/RNA\n", + __FUNCTION__, __FILE__, __LINE__); + } + else { + return Warning(dbf,line,name); + } + dAlphaInv = 1.00 / (double)(iAlpha); + //continue; + } + else if (!strcmp("RF ",str4)) continue; + else if (!strcmp("CS ",str4)) continue; + else if (!strcmp("MAP ",str4)) continue; + else if (!strcmp("COM ",str4)) continue; + else if (!strcmp("NSEQ",str4)) + { + ptr=line+4; + N_in=N_filtered=strint(ptr); //read next integer: number of sequences after filtering + } + + else if (!strcmp("DATE",str4)) continue; + else if (!strncmp("CKSUM ",line,5)) continue; + else if (!strcmp("GA ",str4)) continue; + else if (!strcmp("TC ",str4)) continue; + else if (!strcmp("NC ",str4)) continue; + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // Still needed??? + + else if (!strncmp("SADSS",line,5)) + { + if (nsa_dssp<0) + { + nsa_dssp=k++; + seq[nsa_dssp] = new(char[/*MAXRES*/par.maxResLen+2]); + sname[nsa_dssp] = new(char[15]); + strcpy(seq[nsa_dssp]," "); + strcpy(sname[nsa_dssp],"sa_dssp"); + + } + ptr=strscn(line+5); + if (ptr) + { + strcut(ptr); + if (strlen(seq[nsa_dssp])+strlen(ptr)>=(unsigned)(/*MAXRES*/par.maxResLen)) + printf("\nWARNING: HMM %s has SADSS records with more than %i residues.\n",name,/*MAXRES*/par.maxResLen); + else strcat(seq[nsa_dssp],ptr); + } + } + + else if (!strncmp("SSPRD",line,5)) + { + if (nss_pred<0) + { + nss_pred=k++; + seq[nss_pred] = new(char[/*MAXRES*/par.maxResLen+2]); + sname[nss_pred] = new(char[15]); + strcpy(seq[nss_pred]," "); + strcpy(sname[nss_pred],"ss_pred"); + + } + ptr=strscn(line+5); + if (ptr) + { + strcut(ptr); + if (strlen(seq[nss_pred])+strlen(ptr)>=(unsigned)(/*MAXRES*/par.maxResLen)) + printf("\nWARNING: HMM %s has SSPRD records with more than %i residues.\n",name,/*MAXRES*/par.maxResLen); + else strcat(seq[nss_pred],ptr); + } + } + + else if (!strncmp("SSCON",line,5)) + { + if (nss_conf<0) + { + nss_conf=k++; + seq[nss_conf] = new(char[/*MAXRES*/par.maxResLen+2]); + sname[nss_conf] = new(char[15]); + strcpy(seq[nss_conf]," "); + strcpy(sname[nss_conf],"ss_conf"); + } + ptr=strscn(line+5); + if (ptr) + { + strcut(ptr); + if (strlen(seq[nss_conf])+strlen(ptr)>=(unsigned)(/*MAXRES*/par.maxResLen)) + printf("\nWARNING: HMM %s has SSPRD records with more than %i residues.\n",name,/*MAXRES*/par.maxResLen); + else strcat(seq[nss_conf],ptr); + } + } + + else if (!strncmp("SSCIT",line,5)) continue; + else if (!strcmp("XT ",str4)) continue; + ////////////////////////////////////////////////////////////////////////////////////////////////////// + else if (!strncmp("STATS LOCAL",line,11)) continue; + + else if (!strcmp("EFFN",str4)) + { + ptr=line+4; + float effn = strflt(ptr); + // Calculate Neff_HMM by using f(x) = ax^0.1 + bx^0.5 + cx + d (fitted with scop25 dataset) + Neff_HMM = -1.403534 * pow(effn, 0.1) + 4.428118 * pow(effn, 0.5) - 0.2885410 * effn - 1.108568; + } + + ///////////////////////////////////////////////////////////////////////////////////// + // Read transition probabilities from start state + else if (!strncmp("HMM",line,3)) + { + fgetline(line,LINELEN-1,dbf); // Skip line with amino acid labels + fgetline(line,LINELEN-1,dbf); // Skip line with transition labels + ptr=strscn(line); + + if (!strncmp("COMPO",ptr,5)) + { + ptr=ptr+5; + for (a=0; a<20 && ptr; ++a) + //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids + pb[s2a[a]] = (float) exp(-1.0*strflta(ptr,99999)); + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf("\nNULL "); + for (a=0; a<20; ++a) printf("%6.3g ",100.*pb[s2a[a]]); + printf("\n"); + } + fgetline(line,LINELEN-1,dbf); // Read next line + } + + fgetline(line,LINELEN-1,dbf); // Skip line with 0-states insert probabilities + + ptr = strscn(line); + for (a=0; a<=D2D && ptr; ++a) + tr[0][a] = log2((float) exp(-1.0*strflta(ptr,99999))); //store transition probabilites as log2 values + // strinta returns next integer in string and puts ptr to first char + // after the integer. Returns -99999 if '*' is found. + // ptr is set to 0 if no integer is found after ptr. + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf(" "); + for (a=0; a<=D2D && ptr; ++a) printf("%6.3g ",100*fpow2(tr[i][a])); + printf("\n"); + } + + // Prepare to store DSSP states (if there are none, delete afterwards) + nss_dssp=k++; + seq[nss_dssp] = new(char[/*MAXRES*/par.maxResLen+2]); + sname[nss_dssp] = new(char[15]); + strcpy(sname[nss_dssp],"ss_dssp"); + + ///////////////////////////////////////////////////////////////////////////////////// + // Read columns of HMM + int next_i=0; // index of next column + while (fgetline(line,LINELEN-1,dbf) && !(line[0]=='/' && line[1]=='/') && line[0]!='#') + { + if (strscn(line)==NULL) continue; // skip lines that contain only white space + + // Read in AA probabilities + ptr=line; + int prev_i = next_i; + next_i = strint(ptr); ++i; + if (v && next_i!=prev_i+1) + if (++warn<5) + { + cerr<<endl<<"WARNING: in HMM "<<name<<" state "<<prev_i<<" is followed by state "<<next_i<<"\n"; + if (warn==5) cerr<<endl<<"WARNING: further warnings while reading HMMs will be suppressed.\n"; + } + if (i>L) + { + cerr<<endl<<"Error: in HMM "<<name<<" there are more columns than the stated length "<<L<<"\n"; + return 2; + } + if (i>L && v) + cerr<<endl<<"WARNING: in HMM "<<name<<" there are more columns than the stated length "<<L<<"\n"; + if (i>=/*MAXRES*/par.maxResLen-2) + { + fgetline(line,LINELEN-1,dbf); // Skip two lines + fgetline(line,LINELEN-1,dbf); + continue; + } + + for (a=0; a<iAlpha && ptr; ++a){ /* FIXME: FS introduced iAlpha, was '20' */ + f[i][s2a[a]] = (float) exp(-1.0*strflta(ptr,99999)); + //s2a[a]: transform amino acids Sorted by alphabet -> internal numbers for amino acids + } + for (a = iAlpha; a < 20; a++){ + f[i][s2a[a]] = 0.0; + } + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf("%6i ",i); + for (a=0; a<iAlpha; ++a) printf("%6.3g ",100*f[i][s2a[a]]); + printf("\n"); + } + + // Ignore MAP annotation + ptr = strscn(line); //find next word + ptr = strscn_ws(line); // ignore word + + // Read RF and CS annotation + ptr = strscn(line); + if (!ptr) return Warning(dbf,line,name); + annotchr[i]=uprchr(*ptr); + if (*ptr!='-' && *ptr!=' ') annot=1; + + ptr = strscn(line); + switch (*ptr) + { + case 'H': + ss_dssp[i]=1; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'E': + ss_dssp[i]=2; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'C': + ss_dssp[i]=3; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'S': + ss_dssp[i]=4; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'T': + ss_dssp[i]=5; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'G': + ss_dssp[i]=6; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'B': + ss_dssp[i]=7; + seq[nss_dssp][i]=*ptr; + dssp=1; + break; + case 'I': + dssp=1; + case '~': + ss_dssp[i]=3; + seq[nss_dssp][i]=*ptr; + break; + case '-': // no SS available from any template + case '.': // no clear consensus SS structure + case 'X': // no clear consensus SS structure + ss_dssp[i]=0; + seq[nss_dssp][i]='-'; + break; + default: + ss_dssp[i]=0; + seq[nss_dssp][i]=*ptr; + break; + } + + // Read insert emission line + fgetline(line,LINELEN-1,dbf); + + // Read seven transition probabilities + fgetline(line,LINELEN-1,dbf); + + ptr+=2; + for (a=0; a<=D2D && ptr; ++a) + tr[i][a] = log2((float) exp(-1.0*strflta(ptr,99999))); //store transition prob's as log2-values + if (!ptr) return Warning(dbf,line,name); + if (v>=4) + { + printf(" "); + for (a=0; a<=D2D; ++a) printf("%6.3g ",100*fpow2(tr[i][a])); + printf("\n"); + } + } + + if (line[0]=='/' && line[1]=='/') break; + + } /* strncmp("HMM") */ + + } //while(getline) + + if (L==0) return 0; //End of db file -> stop reading in + + if (v && i!=L) cerr<<endl<<"Warning: in HMM "<<name<<" there are only "<<i<<" columns while the stated length is "<<L<<"\n"; + if (v && i>=/*MAXRES*/par.maxResLen-2) {i=/*MAXRES*/par.maxResLen-2; cerr<<endl<<"WARNING: maximum number "<</*MAXRES*/par.maxResLen-2<<" of residues exceeded while reading HMM "<<name<<"\n";} + if (v && !i) cerr<<endl<<"WARNING: HMM "<<name<<" contains no match states. Check the alignment that gave rise to this HMM.\n"; + L = i; + + if (strlen(longname)>0) strcat(longname," "); + strncat(longname,name,DESCLEN-strlen(longname)-1); // longname = ACC NAME DESC + if (strlen(name)>0) strcat(longname," "); + strncat(longname,desc,DESCLEN-strlen(longname)-1); + longname[DESCLEN-1]='\0'; + ScopID(cl,fold,sfam,fam);// get scop classification from basename (e.g. a.1.2.3.4) + RemoveExtension(file,filestr); // copy name of dbfile without extension into 'file' + + // Secondary structure + if (!dssp) + { + // remove dssp sequence + delete[] seq[nss_dssp]; // memory that had been allocated in case ss_dssp was given needs to be freed + delete[] sname[nss_dssp]; // memory that had been allocated in case ss_dssp was given needs to be freed + nss_dssp=-1; + k--; + } + else { seq[nss_dssp][0]='-'; seq[nss_dssp][L+1]='\0'; } + + if (nss_pred>=0) + { + for (i=1; i<=L; ++i) ss_pred[i] = ss2i(seq[nss_pred][i]); + if (nss_conf>=0) + for (i=1; i<=L; ++i) ss_conf[i] = cf2i(seq[nss_conf][i]); + else + for (i=1; i<=L; ++i) ss_conf[i] = 5; + } + + // Copy query (first sequence) and consensus residues? + if (par.showcons) + { + sname[k]=new(char[10]); + strcpy(sname[k],"Consensus"); + sname[k+1]=new(char[strlen(longname)+1]); + strcpy(sname[k+1],longname); + seq[k]=new(char[L+2]); + seq[k][0]=' '; + seq[k][L+1]='\0'; + seq[k+1]=new(char[L+2]); + seq[k+1][0]=' '; + seq[k+1][L+1]='\0'; + for (i=1; i<=L; ++i) + { + float pmax=0.0; + int amax=0; + for (a=0; a<NAA; ++a) + if (f[i][a]>pmax) {amax=a; pmax=f[i][a];} + if (pmax>0.6) seq[k][i]=i2aa(amax); + else if (pmax>0.4) seq[k][i]=lwrchr(i2aa(amax)); + else seq[k][i]='x'; + seq[k+1][i]=i2aa(amax); + } + ncons=k++; // nfirst is set later! + } + else + { + sname[k]=new(char[strlen(longname)+1]); + strcpy(sname[k],longname); + seq[k]=new(char[L+2]); + seq[k][0]=' '; + seq[k][L+1]='\0'; + } + + if (annot) // read in some annotation characters? + { + annotchr[0]=' '; + annotchr[L+1]='\0'; + strcpy(seq[k],annotchr); // overwrite the consensus sequence with the annotation characters + } + else if (!par.showcons) // we have not yet calculated the consensus, but we need it now as query (first sequence) + { + for (i=1; i<=L; ++i) + { + float pmax=0.0; + int amax=0; + for (a=0; a<NAA; ++a) + if (f[i][a]>pmax) {amax=a; pmax=f[i][a];} + seq[k][i]=i2aa(amax); + } + } + // printf("%i query name=%s seq=%s\n",n,sname[n],seq[n]); + nfirst=k++; + + n_display=k; + n_seqs=k; + + // If no effektive number of sequences is given, calculate Neff_HMM by given profile + if (Neff_HMM == 0) { + for (i=1; i<=L; ++i) + { + float S=0.0; + for (a=0; a<20; ++a) + if (f[i][a]>1E-10) S-=f[i][a]*fast_log2(f[i][a]); + Neff_HMM+=(float) fpow2(S); + } + Neff_HMM/=L; + } + + for (i=0; i<=L; ++i) Neff_M[i] = Neff_I[i] = Neff_D[i] = 10.0; // to add only little additional pseudocounts! + Neff_M[L+1]=1.0f; + Neff_I[L+1]=Neff_D[L+1]=0.0f; + + if (v>=2) + cout<<"Read in HMM "<<name<<" with "<<L<<" match states and effective number of sequences = "<<Neff_HMM<<"\n"; + + /////////////////////////////////////////////////////////////////// + + // Set emission probabilities of zero'th (begin) state and L+1st (end) state to background probabilities + for (a=0; a<20; ++a) f[0][a]=f[L+1][a]=pb[a]; + delete[] annotchr; + + has_pseudocounts=true; + + return 1; //return status: ok + + +} /* this is the end of HMM::ReadHMMer3() */ + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Add transition pseudocounts to HMM (and calculate lin-space transition probs) + */ +void +HMM::AddTransitionPseudocounts(float gapd, float gape, float gapf, float gapg, float gaph, float gapi, float gapb) +{ + int i; //position in alignment + float sum; + float pM2M, pM2I, pM2D, pI2I, pI2M, pD2D, pD2M; + float p0,p1,p2; + if (par.gapb<=0) return; + if (trans_lin==1) {fprintf(stderr,"Error: Adding transition pseudocounts to linear representation of %s not allowed. Please report this error to the HHsearch developers.\n",name); exit(6);} + if (trans_lin==2) {fprintf(stderr,"Error: Adding transition pseudocounts twice is %s not allowed. Please report this error to the HHsearch developers.\n",name); exit(6);} + trans_lin=2; + + // Calculate pseudocount transition probabilities + pM2D=pM2I=gapd*0.0286; //a-priori probability for inserts and deletions + pM2M=1-pM2D-pM2I; + // gape=0 -> pI2I=0 gape=1 -> pI2I=0.75 gape=inf -> pI2I=1. + pI2I=1.0*gape/(gape-1+1.0/0.75); + pI2M=1-pI2I; + // gape=0 -> pD2D=0 gape=1 -> pD2D=0.75 gape=inf -> pD2D=1. + pD2D=1.0*gape/(gape-1+1.0/0.75); + pD2M=1-pD2D; + + for (i=0; i<=L; ++i) //for all columns in HMM + { + // Transitions from M state + p0 = (Neff_M[i]-1)*fpow2(tr[i][M2M]) + gapb*pM2M; + p1 = (Neff_M[i]-1)*fpow2(tr[i][M2D]) + gapb*pM2D; + p2 = (Neff_M[i]-1)*fpow2(tr[i][M2I]) + gapb*pM2I; + if (i==0) p1=p2=0; //from M(0) no transition to D(1) and I(0) possible + if (i==L) p1=p2=0; //from M(L) no transition to D(L+1) and I(L+1) possible + sum = p0+p1+p2+FLT_MIN; + +// p0 = p0/sum ; +// p1 = pow(p1/sum,gapf); +// p2 = pow(p2/sum,gapg); +// sum = p0+p1+p2+FLT_MIN; +// tr[i][M2M] = fast_log2(p0/sum); +// tr[i][M2D] = fast_log2(p1/sum); +// tr[i][M2I] = fast_log2(p2/sum); + + tr[i][M2M] = fast_log2(p0/sum); + tr[i][M2D] = fast_log2(p1/sum)*gapf; + tr[i][M2I] = fast_log2(p2/sum)*gapg; + + // Transitions from I state + p0 = Neff_I[i]*fpow2(tr[i][I2M]) + gapb*pI2M; + p1 = Neff_I[i]*fpow2(tr[i][I2I]) + gapb*pI2I; + sum = p0+p1+FLT_MIN; + +// p0 = pow(p0/sum,gapg); +// p1 = pow(p1/sum,gapi); +// sum = p0+p1+FLT_MIN; +// tr[i][I2M] = fast_log2(p0/sum); +// tr[i][I2I] = fast_log2(p1/sum); + + tr[i][I2M] = fast_log2(p0/sum); + tr[i][I2I] = fast_log2(p1/sum)*gapi; + + // Transitions from D state + p0 = Neff_D[i]*fpow2(tr[i][D2M]) + gapb*pD2M; + p1 = Neff_D[i]*fpow2(tr[i][D2D]) + gapb*pD2D; + if (i==L) p1=0; //from D(L) no transition to D(L+1) possible + sum = p0+p1+FLT_MIN; + +// p0 = pow(p0/sum,gapf); +// p1 = pow(p1/sum,gaph); +// sum = p0+p1+FLT_MIN; +// tr[i][D2M] = fast_log2(p0/sum); +// tr[i][D2D] = fast_log2(p1/sum); + + tr[i][D2M] = fast_log2(p0/sum); + tr[i][D2D] = fast_log2(p1/sum)*gaph; + + // SS-dependent gap penalties + tr[i][M2M_GAPOPEN]=tr[i][M2M]; + tr[i][GAPOPEN]=0.0; + tr[i][GAPEXTD]=0.0; + } + + if (v>=4) + { + printf("\nPseudocount transition probabilities:\n"); + printf("pM2M=%4.1f%%, pM2I=%4.1f%%, pM2D=%4.1f%%, ",100*pM2M,100*pM2I,100*pM2D); + printf("pI2M=%4.1f%%, pI2I=%4.1f%%, ",100*pI2M,100*pI2I); + printf("pD2M=%4.1f%%, pD2D=%4.1f%% ",100*pD2M,100*pD2D); + printf("tau = %4.1f%%\n\n",100.*gapb/(Neff_HMM-1+gapb)); + printf("Listing transition probabilities WITH pseudocounts:\n"); + printf(" i dssp pred sacc M->M M->I M->D I->M I->I D->M D->D\n"); + + for (i=1; i<=L; ++i) //for all columns in HMM + { + printf("%4i %1c %1c %1c %6.3f %6.3f %6.3f ",i,i2ss(ss_dssp[i]),i2ss(ss_pred[i]),i2sa(sa_dssp[i]),fpow2(tr[i][M2M]),fpow2(tr[i][M2I]),fpow2(tr[i][M2D])); + printf("%6.3f %6.3f ",fpow2(tr[i][I2M]),fpow2(tr[i][I2I])); + printf("%6.3f %6.3f ",fpow2(tr[i][D2M]),fpow2(tr[i][D2D])); + printf("%1i %2i %1i\n",ss_pred[i],ss_conf[i],ss_dssp[i]); + } + printf("\n"); + printf("nss_dssp=%i nss_pred=%i\n",nss_dssp,nss_pred); + } + return; +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Use secondary structure-dependent gap penalties + * on top of the HMM transition penalties + */ +void +HMM::UseSecStrucDependentGapPenalties() +{ + int i; // column in HMM + int ii; + //unsigned char iis[MAXRES]; // inside-integer array + unsigned char iis[par.maxResLen]; // inside-integer array + float d; // Additional penalty for opening gap whithin SS element + float e; // Additional penalty for extending gap whithin SS element + + // Determine inside-integers: + // CCSTCCCHHHHHHHHHHHCCCCCEEEEECCSBGGGCCCCEECC + // 0000000123444432100000012210000000000001000 + ii=0; + for (i=0; i<=L; ++i) // forward run + { + if (ss_dssp[i]==1 || ss_dssp[i]==2) {ii+=(ii<par.ssgapi);} else ii=0; + iis[i]=ii; + } for (i=0; i<=L; ++i) + ii=0; + iis[0]=iis[L]=0; + for (i=L; i>=0; i--) // backward run + { + if (ss_dssp[i]==1 || ss_dssp[i]==2) {ii+=(ii<par.ssgapi);} else ii=0; + iis[i-1]=imin(ii,iis[i-1]); + } + + // Add SS-dependent gap penalties to HMM transition penalties + for (i=0; i<=L; ++i) //for all columns in HMM + { + d=-iis[i]*par.ssgapd; + e=-iis[i]*par.ssgape; + tr[i][GAPOPEN]=d; + tr[i][GAPEXTD]=e; + tr[i][M2M_GAPOPEN]+=d; + tr[i][M2I]+=d; + tr[i][I2M]+=d; + tr[i][I2I]+=e; + tr[i][M2D]+=d; + tr[i][D2M]+=d; + tr[i][D2D]+=e; + } + + if (v>=3) + { + printf("Col SS II\n"); + for (i=0; i<=L; ++i) printf("%3i %c %2i\n",i,i2ss(ss_dssp[i]),iis[i]); + } + return; +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Generate an amino acid frequency matrix g[][] with full pseudocount admixture (tau=1) + */ +void +HMM::PreparePseudocounts() +{ + for (int i=0; i<=L+1; ++i) + for (int a=0; a<20; ++a) + g[i][a] = // produces fast code + R[a][0]*f[i][0] +R[a][1]*f[i][1] +R[a][2]*f[i][2] +R[a][3]*f[i][3] +R[a][4]*f[i][4] + +R[a][5]*f[i][5] +R[a][6]*f[i][6] +R[a][7]*f[i][7] +R[a][8]*f[i][8] +R[a][9]*f[i][9] + +R[a][10]*f[i][10]+R[a][11]*f[i][11]+R[a][12]*f[i][12]+R[a][13]*f[i][13]+R[a][14]*f[i][14] + +R[a][15]*f[i][15]+R[a][16]*f[i][16]+R[a][17]*f[i][17]+R[a][18]*f[i][18]+R[a][19]*f[i][19]; +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Add amino acid pseudocounts to HMM and calculate average protein aa probabilities pav[a] + * Pseudocounts: t.p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] + */ +void +HMM::AddAminoAcidPseudocounts(char pcm, float pca, float pcb, float pcc) +{ + int i; //position in HMM + int a; //amino acid (0..19) + float sum; + float tau; //tau = pseudocount admixture + + for (a=0; a<20; ++a) pav[a]=pb[a]*100.0f/Neff_HMM; // initialize vector of average aa freqs with pseudocounts + + // Calculate amino acid frequencies p[i][a] = (1-tau(i))*f[i][a] + tau(i)*g[i][a] + switch (pcm) + { + case 0: //no pseudocounts whatsoever: tau=0 + for (i=1; i<=L; ++i) + for (a=0; a<20; ++a) + pav[a] += ( p[i][a]=f[i][a] ); + break; + case 1: //constant pseudocounts (for optimization): tau = pca + tau = pca; + for (i=1; i<=L; ++i) + for (a=0; a<20; ++a) + pav[a] += ( p[i][a] = (1.-tau)*f[i][a] + tau * g[i][a] ); + break; + case 2: //divergence-dependent pseudocounts + case 4: //divergence-dependent pseudocounts and rate matrix rescaling + if (par.pcc==1.0f) + for (i=1; i<=L; ++i) + { + tau = fmin(1.0, pca/(1. + Neff_M[i]/pcb ) ); + for (a=0; a<20; ++a) + pav[a] += ( p[i][a] = (1.-tau)*f[i][a] + tau * g[i][a] ); + } + else + for (i=1; i<=L; ++i) + { + tau = fmin(1.0, pca/(1. + pow((Neff_M[i])/pcb,pcc))); + for (a=0; a<20; ++a) + pav[a] += ( p[i][a] = (1.-tau)*f[i][a] + tau * g[i][a] ); + } + break; + case 3: // constant-divergence pseudocounts + for (i=1; i<=L; ++i) + { + float x = Neff_M[i]/pcb; + pca = 0.793 + 0.048*(pcb-10.0); + tau = fmax(0.0, pca*(1-x + pcc*x*(1-x)) ); + for (a=0; a<20; ++a) + pav[a] += ( p[i][a] = (1.-tau)*f[i][a] + tau * g[i][a] ); + } + if (v>=2) { printf("Divergence before / after addition of amino acid pseudocounts: %5.2f / %5.2f\n",Neff_HMM, CalcNeff()); } + break; + } //end switch (pcm) + + + // Normalize vector of average aa frequencies pav[a] + NormalizeTo1(pav,NAA); + + for (a=0; a<20; ++a) + p[0][a] = p[L+1][a] = pav[a]; + + // DEBUGGING output + if (v>=3) + { + switch (pcm) + { + case 0: + cout<<"No pseudocounts added (-pcm 0)\n"; + return; + case 1: + cout<<"Adding constant AA pseudocount admixture of "<<pca<<" to HMM "<<name<<"\n"; + break; + case 2: + cout<<"Adding divergence-dependent AA pseudocounts (-pcm 2) with admixture of " + <<pca/(1.+pow((Neff_HMM-1.)/pcb,pcc))<<" to HMM "<<name<<"\n"; + break; + } //end switch (pcm) + cout<<"\nAverage amino acid frequencies WITH pseudocounts in HMM: \nProf: "; + for (a=0; a<20; ++a) printf("%4.1f ",100*pav[a]); + cout<<"\n"; + if (v>=4) + { + cout<<"\nAmino acid frequencies WITHOUT pseudocounts:\n A R N D C Q E G H I L K M F P S T W Y V\n"; + for (i=1; i<=L; ++i) + { + printf("%3i: ",i); + sum=0; + for (a=0; a<20; ++a) + { + sum+=f[i][a]; + printf("%4.1f ",100*f[i][a]); + } + printf(" sum=%5.3f\n",sum); + } + cout<<"\nAmino acid frequencies WITH pseudocounts:\n A R N D C Q E G H I L K M F P S T W Y V\n"; + for (i=1; i<=L; ++i) + { + printf("%3i: ",i); + sum=0; + for (a=0; a<20; ++a) + { + sum+=p[i][a]; + printf("%4.1f ",100*p[i][a]); + } + printf(" sum=%5.3f\n",sum); + } + } + } + return; +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Factor Null model into HMM t + */ +void +HMM::IncludeNullModelInHMM(HMM& q, HMM& t) +{ + + int i,j; //query and template match state indices + int a; //amino acid index + + switch (par.columnscore) + { + default: + case 0: // Null model with background prob. from database + for (a=0; a<20; ++a) pnul[a]=pb[a]; + break; + + case 1: // Null model with background prob. equal average from query and template + for (a=0; a<20; ++a) pnul[a]=0.5*(q.pav[a]+t.pav[a]); + break; + + case 2: // Null model with background prob. from template protein + for (a=0; a<20; ++a) pnul[a]=t.pav[a]; + break; + + case 3: // Null model with background prob. from query protein + for (a=0; a<20; ++a) pnul[a]=q.pav[a]; + break; + + case 4: // Null model with background prob. equal average from query and template + for (a=0; a<20; ++a) pnul[a]=sqrt(q.pav[a]*t.pav[a]); + break; + + case 10: // Separated column scoring for Stochastic Backtracing (STILL USED??) + for (i=0; i<=q.L+1; ++i) + { + float sum = 0.0; + for (a=0; a<20; ++a) sum += pb[a]*q.p[i][a]; + sum = 1.0/sqrt(sum); + for (a=0; a<20; ++a) q.p[i][a]*=sum; + } + for (j=0; j<=t.L+1; j++) + { + float sum = 0.0; + for (a=0; a<20; ++a) sum += pb[a]*t.p[j][a]; + sum = 1.0/sqrt(sum); + for (a=0; a<20; ++a) t.p[j][a]*=sum; + } + break; + + case 11: // log co-emission probability (no null model) + for (a=0; a<20; ++a) pnul[a]=0.05; + break; + + } + + // !!!!! ATTENTION!!!!!!! after this t.p is not the same as after adding pseudocounts !!! + //Introduce amino acid weights into template (for all but SOP scores) + if (par.columnscore!=10) + for (a=0; a<20; ++a) + for (j=0; j<=t.L+1; j++) + t.p[j][a]/=pnul[a]; + + if (v>=5) + { + cout<<"\nAverage amino acid frequencies\n"; + cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; + cout<<"Q: "; + for (a=0; a<20; ++a) printf("%4.1f ",100*q.pav[a]); + cout<<"\nT: "; + for (a=0; a<20; ++a) printf("%4.1f ",100*t.pav[a]); + cout<<"\nNull: "; + for (a=0; a<20; ++a) printf("%4.1f ",100*pnul[a]); + cout<<"\npb: "; + for (a=0; a<20; ++a) printf("%4.1f ",100*pb[a]); + } + + + return; +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Write HMM to output file + */ +void +HMM::WriteToFile(char* outfile) +{ + const int SEQLEN=100; // number of residues per line for sequences to be displayed + int i,a; + + if (trans_lin) {fprintf(stderr,"Error: Writing transition pseudocounts in linear representation not allowed. Please report this error to the HHsearch developers.\n"); exit(6);} + + FILE *outf=NULL; + if (strcmp(outfile,"stdout")) + { + if (par.append) outf=fopen(outfile,"a"); else outf=fopen(outfile,"w"); + if (!outf) OpenFileError(outfile); + } + else + outf = stdout; + if (v>=2) cout<<"Writing HMM to "<<outfile<<"\n"; + +// fprintf(outf,"HHsearch HHM format 1.5\n"); + fprintf(outf,"HHsearch 1.5\n"); // format specification + fprintf(outf,"NAME %s\n",longname); // name of first sequence + fprintf(outf,"FAM %s\n",fam); // family name + char file_nopath[NAMELEN]; + RemovePath(file_nopath,file); + fprintf(outf,"FILE %s\n",file_nopath); // base name of alignment file + + // Print command line + fprintf(outf,"COM "); + for (int i=0; i<par.argc; i++) + if (strlen(par.argv[i])<=100) + fprintf(outf,"%s ",par.argv[i]); + else + fprintf(outf,"<%i characters> ",(int)strlen(par.argv[i])); + fprintf(outf,"\n"); + + // print out date stamp + time_t* tp=new(time_t); + *tp=time(NULL); + fprintf(outf,"DATE %s",ctime(tp)); + delete tp; tp = NULL; /* really? FS */ + + // Print out some statistics of alignment + fprintf(outf,"LENG %i match states, %i columns in multiple alignment\n",L,l[L]); + fprintf(outf,"FILT %i out of %i sequences passed filter (-id %i -cov %i -qid %i -qsc %.2f -diff %i)\n",N_filtered,N_in,par.max_seqid,par.coverage,par.qid,par.qsc,par.Ndiff); + fprintf(outf,"NEFF %-4.1f\n",Neff_HMM); + + // Print selected sequences from alignment (including secondary structure and confidence values, if known) + fprintf(outf,"SEQ\n"); + for (int n=0; n<n_display; n++) + { + fprintf(outf,">%s\n",sname[n]); + //first sequence character starts at 1; 0 not used. + for(unsigned int j=0; j<strlen(seq[n]+1); j+=SEQLEN) fprintf(outf,"%-.*s\n",SEQLEN,seq[n]+1+j); + } + fprintf(outf,"#\n"); + + // print null model background probabilities from substitution matrix + fprintf(outf,"NULL "); + for (a=0; a<20; ++a) fout(outf,-iround(fast_log2(pb[s2a[a]])*HMMSCALE )); + fprintf(outf,"\n"); + + // print table header line with amino acids + fprintf(outf,"HMM "); + for (a=0; a<20; ++a) fprintf(outf,"%1c\t",i2aa(s2a[a])); + fprintf(outf,"\n"); + + // print table header line with state transitions + fprintf(outf," M->M\tM->I\tM->D\tI->M\tI->I\tD->M\tD->D\tNeff\tNeff_I\tNeff_D\n"); + + // print out transition probabilities from begin state (virtual match state) + fprintf(outf," "); + for (a=0; a<=D2D; ++a) fout(outf,-iround(tr[0][a]*HMMSCALE)); + fout(outf,iround(Neff_M[0]*HMMSCALE)); + fout(outf,iround(Neff_I[0]*HMMSCALE)); + fout(outf,iround(Neff_D[0]*HMMSCALE)); + fprintf(outf,"\n"); + + // Start loop for printing HMM columns + int h=1; + for (i=1; i<=L; ++i) + { + + while(islower(seq[nfirst][h]) && seq[nfirst][h]) h++; + fprintf(outf,"%1c %-4i ",seq[nfirst][h++],i); + + // Print emission probabilities for match state + for (a=0; a<20; ++a) fout(outf,-iround(fast_log2(p[i][s2a[a]])*HMMSCALE )); + fprintf(outf,"%-i",l[i]); + fprintf(outf,"\n"); + + // Print transition probabilities + fprintf(outf," "); + for (a=0; a<=D2D; ++a) fout(outf,-iround(tr[i][a]*HMMSCALE)); + fout(outf,iround(Neff_M[i]*HMMSCALE)); + fout(outf,iround(Neff_I[i]*HMMSCALE)); + fout(outf,iround(Neff_D[i]*HMMSCALE)); + fprintf(outf,"\n\n"); + } // end for(i)-loop for printing HMM columns + + fprintf(outf,"//\n"); + fclose(outf); +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Write HMM to output file + */ +void +HMM::InsertCalibration(char* infile) +{ + char* line = new(char[LINELEN]); // input line + char** lines = new(char*[3*L+100000]); + int nline=0; + int l; + char done=0; // inserted new 'EVD mu sigma' line? + + // Read from infile all lines and insert the EVD line with lamda and mu coefficients + ifstream inf; + inf.open(infile, ios::in); + if (!inf) OpenFileError(infile); + if (v>=2) cout<<"Recording calibration coefficients in "<<infile<<"\n"; + + while (inf.getline(line,LINELEN) && !(line[0]=='/' && line[1]=='/') && nline<2*/*MAXRES*/par.maxResLen) + { + + // Found an EVD lamda mu line? -> remove + while (!done && !strncmp(line,"EVD ",3) && !(line[0]=='/' && line[1]=='/') && nline<2*/*MAXRES*/par.maxResLen) + inf.getline(line,LINELEN); + if ((line[0]=='/' && line[1]=='/') || nline>=2*/*MAXRES*/par.maxResLen) + {fprintf(stderr,"Error: wrong format in %s. Expecting hhm format\n",infile); exit(1);} + + // Found the SEQ line? -> insert calibration before this line + if (!done && (!strncmp("SEQ",line,3) || !strncmp("HMM",line,3)) && (isspace(line[3]) || line[3]=='\0')) + { + done=1; + lines[nline]=new(char[128]); + if (!lines[nline]) MemoryError("space to read in HHM file for calibration"); + sprintf(lines[nline],"EVD %-7.4f %-7.4f",lamda,mu); + nline++; + } + lines[nline]=new(char[strlen(line)+1]); + if (!lines[nline]) MemoryError("space to read in HHM file for calibration"); + strcpy (lines[nline],line); + nline++; + } + inf.close(); + + // Write to infile all lines + FILE* infout=fopen(infile,"w"); + if (!infout) { + cerr<<endl<<"WARNING in "<<program_name<<": no calibration coefficients written to "<<infile<<":\n"; + cerr<<"Could not open file for writing.\n"; + return; + } + for (l=0; l<nline; l++) { + fprintf(infout,"%s\n",lines[l]); + delete[] lines[l]; lines[l] = NULL; + } + fprintf(infout,"//\n"); + fclose(infout); + delete[] line; line = NULL; + delete[] lines; lines = NULL; + return; +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Write HMM to output file in HMMER format + */ +void +HMM::WriteToFileHMMER(char* outfile) +{ + const int INTSCALE=1000; //scaling factor in HMMER files + const float pBD=0.50; + const int LOG2pBD=iround(fast_log2(pBD)*INTSCALE); + const int LOG2pBM=iround(fast_log2(1-pBD)*INTSCALE); + const float pJB=1.0/350; + const int LOG2pJB=iround(fast_log2(pJB)*INTSCALE); + const int LOG2pJJ=iround(fast_log2(1-pJB)*INTSCALE); + const float pEJ=0.5; + const int LOG2pEJ=iround(fast_log2(pEJ)*INTSCALE); + const int LOG2pEC=iround(fast_log2(1-pEJ)*INTSCALE); + char c; + int i,a; + + if (trans_lin) {fprintf(stderr,"Error: Writing transition pseudocounts in linear representation not allowed. Please report this error to the HHsearch developers.\n"); exit(6);} + + FILE *outf=NULL; + if (strcmp(outfile,"stdout")) + { + if (par.append) outf=fopen(outfile,"a"); else outf=fopen(outfile,"w"); + if (!outf) OpenFileError(outfile); + } + else + outf = stdout; + if (v>=2) cout<<"Writing HMM to "<<outfile<<"\n"; + + fprintf(outf,"HMMER2.0 [hhmake %s]\n",VERSION_AND_DATE); + fprintf(outf,"NAME %s\n",file); // base name of alignment file + fprintf(outf,"DESC %s\n",longname); + fprintf(outf,"LENG %i\n",L); + fprintf(outf,"ALPH Amino\n"); // amino acid seuqences (not DNA) + fprintf(outf,"RF yes\n"); // reference annotation flag + fprintf(outf,"CS yes\n"); // consensus structure annotation flag + fprintf(outf,"MAP yes\n"); // write MA column number after each line of aa probabilities + + fprintf(outf,"COM "); // print out command line + for (i=0; i<=par.argc-1; ++i) fprintf(outf,"%s ",par.argv[i]); fprintf(outf,"\n"); + + fprintf(outf,"NSEQ %i\n",N_filtered); // print number of sequences after filtering + + // Date stamp + time_t* tp=new(time_t); + *tp=time(NULL); + fprintf(outf,"DATE %s",ctime(tp)); + delete tp; tp = NULL; /* really? FS */ + + // Print out secondary structure + if (nss_dssp>=0) + fprintf(outf,"SSDSS %s\n",seq[nss_dssp]); + if (nsa_dssp>=0) + fprintf(outf,"SADSS %s\n",seq[nsa_dssp]); + if (nss_pred>=0) + fprintf(outf,"SSPRD %s\n",seq[nss_pred]); + if (nss_conf>=0) + fprintf(outf,"SSCNF %s\n",seq[nss_conf]); + + + // Special Plan7 transitions that control repeated detection of profile HMM within sequence + fprintf(outf,"XT %6i %6i %6i %6i %6i %6i %6i %6i\n",LOG2pJB,LOG2pJJ,LOG2pEC,LOG2pEJ,LOG2pJB,LOG2pJJ,LOG2pJB,LOG2pJJ); + fprintf(outf,"NULT -4 -8455\n"); + + + // Null model background probabilities from substitution matrix + fprintf(outf,"NULE "); + for (a=0; a<20; ++a) + { + float lg2=fast_log2(pb[s2a[a]]*20.0); + if (lg2<-99.999) fprintf(outf," *"); else fprintf(outf," %6i",iround(lg2*INTSCALE)); + } + fprintf(outf,"\n"); + + // Table header line with amino acids + fprintf(outf,"HMM "); + for (a=0; a<20; ++a) fprintf(outf," %1c ",i2aa(s2a[a])); + fprintf(outf,"\n"); + + // Table header line with state transitions + fprintf(outf," m->m m->i m->d i->m i->i d->m d->d b->m m->e\n"); + + // Transition probabilities from begin state + fprintf(outf," %6i * %6i\n",LOG2pBM,LOG2pBD); + + // Start loop for printing HMM columns + int h=1, hss=1; + for (i=1; i<=L; ++i) + { + + // Emission probabilities for match state + fprintf(outf," %5i",i); + for (a=0; a<20; ++a) fprintf(outf," %6i",imax(-9999,iround(fast_log2(p[i][s2a[a]]/pb[s2a[a]])*INTSCALE))); + fprintf(outf," %5i",l[i]); + fprintf(outf,"\n"); + + // Emission probabilities (relative to null model) for insert state + while(islower(seq[nfirst][h]) && seq[nfirst][h]) h++; + if (i==L) + fprintf(outf," %1c * * * * * * * * * * * * * * * * * * * *\n",seq[nfirst][h++]); + else + fprintf(outf," %1c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",seq[nfirst][h++]); + + // Transition probabilities + if (nss_dssp>=0) + { + while(islower(seq[nss_dssp][hss]) && seq[nss_dssp][hss]) hss++; + c=seq[nss_dssp][hss++]; + } + else c=' '; + fprintf(outf," %1c",c); + if (i==1) + { + for (a=0; a<=D2D; ++a) fprintf(outf," %6i",imax(-9999,iround(tr[i][a]*INTSCALE))); + fprintf(outf," %6i *\n",LOG2pBM); + } + else if (i==L) + { + for (a=0; a<=D2D; ++a) fprintf(outf," *"); + fprintf(outf," * 0\n"); + } + else + { + for (a=0; a<=D2D; ++a) fprintf(outf," %6i",imax(-9999,iround(tr[i][a]*INTSCALE))); + fprintf(outf," * *\n"); + } + } + + fprintf(outf,"//\n"); + fclose(outf); +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transform log to lin transition probs + */ +void +HMM::Log2LinTransitionProbs(float beta) +{ + if (trans_lin==1) return; + trans_lin=1; + for (int i=0; i<=L; ++i) + { + for (int a=0; a<NTRANS; ++a) + tr[i][a] = fpow2(beta*tr[i][a]); +/* FIXME valgrind says: "Conditional jump or move depends on + * uninitialised value(s)" when using hmm iteration + */ + } +} + + +/** + * @brief Set query columns in His-tags etc to Null model distribution + */ +void +HMM::NeutralizeTags() +{ + char* qseq = seq[nfirst]; + char* pt; + int a,i; + + if (NULL == qseq){ + return; + } + + // Neutralize His tag + if ( (pt=strstr(qseq,"HHHHH")) ) + { + int i0 = pt-qseq+1; + if (v>=2) printf("Neutralized His-tag at position %i\n",i0); + for (i=imax(i0-5,1); i<i0; ++i) // neutralize leading 5 columns + for (a=0; a<NAA; ++a) p[i][a]=pb[a]; + for (; (*pt)!='H'; ++i,++pt) // neutralize His columns + for (a=0; a<NAA; ++a) p[i][a]=pb[a]; + i0=i; + for (; i<imin(i0+5,L+1); ++i) // neutralize trailing 5 columns + for (a=0; a<NAA; ++a) p[i][a]=pb[a]; + if (v>=3) printf("start:%i end:%i\n",imax(i0-5,1),i-1); + } + + // Neutralize C-myc tag + if ( (pt=strstr(qseq,"EQKLISEEDL")) ) + { + if (v>=2) printf("Neutralized C-myc-tag at position %i\n",int(pt-qseq)+1); + for (i=pt-qseq+1; i<=pt-qseq+10; ++i) + for (a=0; a<NAA; ++a) p[i][a]=pb[a]; + } + // Neutralize FLAG tag + if ( (pt=strstr(qseq,"DYKDDDDK")) ) + { + if (v>=2) printf("Neutralized FLAG-tag at position %i\n",int(pt-qseq)+1); + for (i=pt-qseq+1; i<=pt-qseq+8; ++i) + for (a=0; a<NAA; ++a) p[i][a]=pb[a]; + } +} + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate effective number of sequences using profiles INCLUDING pseudocounts + */ +float +HMM::CalcNeff() +{ + float Neff=0; + for (int i=1; i<=L; ++i) + for (int a=0; a<20; ++a) + if (p[i][a]>1E-10) Neff-=p[i][a]*fast_log2(p[i][a]); + return fpow2(Neff/L); +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Calculate consensus of HMM (needed to merge HMMs later) + */ +void +HMM::CalculateConsensus() +{ + int i; // position in query + int a; // amino acid + if (!Xcons) Xcons = new char[/*MAXRES*/par.maxResLen+2]; + for (i=1; i<=L; ++i) + { + float max=f[i][0]-pb[0]; + for (a=1; a<20; ++a) + if (f[i][a]-pb[a]>max) Xcons[i]=a; + } + Xcons[0]=Xcons[L+1]=ENDGAP; +} + +// ///////////////////////////////////////////////////////////////////////////////////// +// // Store linear transition probabilities +// ///////////////////////////////////////////////////////////////////////////////////// +// void HMM::StoreLinearTransitionProbs() +// { +// int i; // position in query +// for (i=0; i<=L+1; ++i) if (!tr_lin[i]) tr_lin[i] = new(float[NTRANS]); +// for (i=0; i<=L+1; ++i) +// { +// tr_lin[i][M2M] = fpow2(tr[i][M2M]); +// tr_lin[i][M2I] = fpow2(tr[i][M2I]); +// tr_lin[i][M2D] = fpow2(tr[i][M2D]); +// tr_lin[i][D2M] = fpow2(tr[i][M2D]); +// tr_lin[i][D2D] = fpow2(tr[i][D2D]); +// tr_lin[i][I2M] = fpow2(tr[i][I2M]); +// tr_lin[i][I2I] = fpow2(tr[i][I2I]); +// } +// } + + +// #define Weff(Neff) (1.0+par.neffa*(Neff-1.0)+(par.neffb-4.0*par.neffa)/16.0*(Neff-1.0)*(Neff-1.0)) + +// ///////////////////////////////////////////////////////////////////////////////////// +// // Initialize f[i][a] with query HMM +// ///////////////////////////////////////////////////////////////////////////////////// +// void HMM::MergeQueryHMM(HMM& q, float wk[]) +// { +// int i; // position in query +// int a; // amino acid +// float Weff_M, Weff_D, Weff_I; +// for (i=1; i<=L; i++) +// { +// Weff_M = Weff(q.Neff_M[i]-1.0); +// Weff_D = Weff(q.Neff_D[i]-1.0); +// Weff_I = Weff(q.Neff_I[i]-1.0); +// for (a=0; a<20; a++) f[i][a] = q.f[i][a]*wk[i]*Weff_M; +// tr_lin[i][M2M] = q.tr_lin[i][M2M]*wk[i]*Weff_M; +// tr_lin[i][M2I] = q.tr_lin[i][M2I]*wk[i]*Weff_M; +// tr_lin[i][M2D] = q.tr_lin[i][M2D]*wk[i]*Weff_M; +// tr_lin[i][D2M] = q.tr_lin[i][D2M]*wk[i]*Weff_D; +// tr_lin[i][D2D] = q.tr_lin[i][D2D]*wk[i]*Weff_D; +// tr_lin[i][I2M] = q.tr_lin[i][I2M]*wk[i]*Weff_I; +// tr_lin[i][I2I] = q.tr_lin[i][I2I]*wk[i]*Weff_I; +// } +// } + + + +// ///////////////////////////////////////////////////////////////////////////////////// +// // Normalize probabilities in total merged super-HMM +// ///////////////////////////////////////////////////////////////////////////////////// +// void HMM::NormalizeHMMandTransitionsLin2Log() +// { +// int i; // position in query +// int a; // amino acid +// for (i=0; i<=L+1; i++) +// { +// float sum=0.0; +// for (a=0; a<20; a++) sum += f[i][a]; +// for (a=0; a<20; a++) f[i][a]/=sum; +// sum = tr_lin[i][M2M] + tr_lin[i][M2I] + tr_lin[i][M2D]; +// tr_lin[i][M2M] /= sum; +// tr_lin[i][M2I] /= sum; +// tr_lin[i][M2D] /= sum; +// tr[i][M2M] = fast_log2(tr_lin[i][M2M]); +// tr[i][M2I] = fast_log2(tr_lin[i][M2I]); +// tr[i][M2D] = fast_log2(tr_lin[i][M2D]); +// sum = tr_lin[i][D2M] + tr_lin[i][D2D]; +// tr_lin[i][D2M] /= sum; +// tr_lin[i][D2D] /= sum; +// tr[i][D2M] = fast_log2(tr_lin[i][D2M]); +// tr[i][D2D] = fast_log2(tr_lin[i][D2D]); +// sum = tr_lin[i][I2M] + tr_lin[i][I2I]; +// tr_lin[i][I2M] /= sum; +// tr_lin[i][I2I] /= sum; +// tr[i][I2M] = fast_log2(tr_lin[i][I2M]); +// tr[i][I2I] = fast_log2(tr_lin[i][I2I]); +// } +// } + + +// UNCOMMENT TO ACTIVATE COMPOSITIONALLY BIASED PSEUDOCOUNTS BY RESCALING THE RATE MATRIX + +// ///////////////////////////////////////////////////////////////////////////////////// +// //// Function to minimize +// ///////////////////////////////////////////////////////////////////////////////////// +// double RescaleMatrixFunc(double x[]) +// { +// double sum=0.0; +// for (int a=0; a<20; ++a) +// { +// double za=0.0; +// for (int b=0; b<20; ++b) za+=P[a][b]*x[b]; +// sum += (x[a]*za-qav[a])*(x[a]*za-qav[a]); +// } +// return sum; +// } + +// ///////////////////////////////////////////////////////////////////////////////////// +// //// Gradient of function to minimize +// ///////////////////////////////////////////////////////////////////////////////////// +// void RescaleMatrixFuncGrad(double grad[], double x[]) +// { +// double z[20] = {0.0}; +// double w[20]; +// double tmp; +// for (int a=0; a<20; ++a) +// for (int b=0; b<20; ++b) z[a] += P[a][b]*x[b]; + +// for (int a=0; a<20; ++a) w[a] = x[a]*z[a]-qav[a]; +// for (int a=0; a<20; ++a) +// { +// tmp = w[a]*z[a]; +// for (int b=0; b<20; ++b) tmp += P[a][b]*x[b]*w[b]; +// grad[a] = 2.0*tmp; +// } +// return; +// } + + +// ///////////////////////////////////////////////////////////////////////////////////// +// //// Rescale a substitution matrix to biased aa frequencies in global vector qav[a] +// ///////////////////////////////////////////////////////////////////////////////////// +// void HMM::RescaleMatrix() +// { +// int a,b; +// int code; +// double x[21]; // scaling factor +// double val_min; +// const int len=20; +// const int max_iterations=50; + +// if (v>=2) printf("Adjusting rate matrix to query amino acid composition ...\n"); + +// // Put amino acid frequencies into global array (needed to call WNLIB's conjugate gradient method) +// for (a=0; a<20; ++a) qav[a] = pav[a]; + +// // Initialize scaling factors x[a] +// for (a=0; a<20; ++a) x[a]=pow(qav[a]/pb[a],0.73); // Initialize + +// // Call conjugate gradient minimization method from WNLIB +// wn_conj_gradient_method(&code,&val_min,x,len,&RescaleMatrixFunc,&RescaleMatrixFuncGrad,max_iterations); + + +// // Calculate z[a] = sum_b Pab*xb +// float sum_err=0.0f; +// float sum = 0.0f; +// for (a=0; a<20; ++a) +// { +// float za=0.0f; // za = sum_b Pab*xb +// for (b=0; b<20; ++b) za+=P[a][b]*x[b]; +// sum_err += (x[a]*za/qav[a]-1)*(x[a]*za/qav[a]-1); +// sum += x[a]*za; +// } +// if (sum_err>1e-3 & v>=1) fprintf(stderr,"WARNING: adjusting rate matrix by CG resulted in residual error of %5.3f.\n",sum_err); + +// // Rescale rate matrix +// for (a=0; a<20; ++a) +// for (b=0; b<20; ++b) +// { +// P[a][b] *= x[a]*x[b]/sum; +// R[a][b] = P[a][b]/qav[b]; +// } + +// // How well approximated? +// if (v>=3) +// { +// // Calculate z[a] = sum_b Pab*xb +// float z[21]; +// for (a=0; a<20; ++a) +// for (z[a]=0.0, b=0; b<20; ++b) z[a]+=P[a][b]; +// printf("Adjust A R N D C Q E G H I L K M F P S T W Y V\nErr? "); +// for (a=0; a<20; ++a) printf("%4.0f ",1000*z[a]/qav[a]); +// cout<<endl<<"xa "; +// for (a=0; a<20; ++a) fprintf(stdout,"%4.2f ",x[a]); +// cout<<endl; +// } + +// // Evaluate sequence identity underlying substitution matrix +// if (v>=3) +// { +// float id=0.0f; +// float entropy=0.0f; +// float entropy_qav=0.0f; +// float mut_info=0.0f; +// for (a=0; a<20; ++a) id += P[a][a]; +// for (a=0; a<20; ++a) entropy_qav-=qav[a]*fast_log2(qav[a]); +// for (a=0; a<20; ++a) +// for (b=0; b<20; ++b) +// { +// entropy-=P[a][b]*fast_log2(R[a][b]); +// mut_info += P[a][b]*fast_log2(P[a][b]/qav[a]/qav[b]); +// } + +// fprintf(stdout,"Rescaling rate matrix: sequence identity = %2.0f%%; entropy per column = %4.2f bits (out of %4.2f); mutual information = %4.2f bits\n",100*id,entropy,entropy_qav,mut_info); +// } +// return; +// } + + +/* @* HMM::ClobberGlobal (eg, q,t) + */ +void +HMM::ClobberGlobal(void){ + + for (int i = 0; i < n_display; i++){ + if (sname[i]){ + delete[] sname[i]; sname[i] = NULL; + } + if (seq[i]){ + delete[] seq[i]; seq[i] = NULL; + } + } + Neff_M[0] = Neff_I[0] = Neff_D[0] = 0.0; + longname[0] = '\0'; file[0] = '\0'; + ss_dssp[0] = sa_dssp[0] = ss_pred[0] = ss_conf[0] = '\0'; + Xcons = NULL; + l[0] = 0; + L = 0; + Neff_HMM = 0; + n_display = N_in = N_filtered = 0; + nss_dssp = nsa_dssp = nss_pred = nss_conf = nfirst = ncons = -1; + lamda = 0.0; mu = 0.0; + name[0] = longname[0] = fam[0] = '\0'; + + for (int i = 0; i < NAA; i++){ + pav[i] = 0; + } + + /* @= */ + return; + +} /* this is the end of ClobberGlobal() */ + + +/* + * EOF hhhmm-C.h + */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhhmm.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,204 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhhmm.h 165 2010-12-22 16:24:48Z fabian $ + */ + +// hhhmm.h + + +class HMM +{ + public: + HMM(int maxseqdis=MAXSEQDIS, int maxres=/*MAXRES*/par.maxResLen); + ~HMM(); + HMM& operator=(HMM&); + + int n_display; // number of sequences stored for display of alignment (INCLUDING >ss_ and >cf_ sequences) + int n_seqs; // number of sequences read in (INCLUDING >ss_ and >cf_ sequences) + char** sname; // names of stored sequences + char** seq; // residues of stored sequences (first at pos 1!) + int ncons; // index of consensus sequence + int nfirst; // index of first sequence (query sequence of HMM) + int nss_dssp; // index of seq[] with secondary structure by dssp + int nsa_dssp; // index of seq[] with solvent accessibility by dssp + int nss_pred; // index of seq[] with predicted secondary structure + int nss_conf; // index of seq[] with confidence values for secondary structure prediction + + int L; // length of HMM = number of match states; set in declaration of HMM object + int N_in; // number of sequences in alignment + int N_filtered; // number of sequences after filtering + float* Neff_M; // Neff_M[i] = diversity of subalignment of seqs that have residue in col i + float* Neff_I; // Neff_I[i] = diversity of subalignment of seqs that have insert in col i + float* Neff_D; // Neff_D[i] = diversity of subalignment of seqs that have delete in col i + float Neff_HMM; // average number of Neff over total length of HMM + + char* longname; // Full name of first sequence of original alignment (NAME field) + char name[NAMELEN]; // HMM name = first word in longname in lower case + char file[NAMELEN]; // Basename (with path, without extension) of alignment file that was used to construct the HMM + char fam[NAMELEN]; // family ID (derived from name) (FAM field) + char sfam[NAMELEN]; // superfamily ID (derived from name) + char fold[NAMELEN]; // fold ID (derived from name) + char cl[NAMELEN]; // class ID (derived from name) + + float lamda, mu; // coefficients for aa score distribution of HMM using parameters in 'Parameters par' + bool has_pseudocounts; // set to true if HMM contains pseudocounts + + // Make a flat copy of q + void FlatCopyTo(HMM& t); + + // Read an HMM from a HHsearch .hhm file and return 0 at end of file + int Read(FILE* dbf, char* path=NULL); + + // Read an HMM from a HMMer .hmm file; return 0 at end of file + int ReadHMMer(FILE* dbf, char* filestr=NULL); + + // Read an HMM from a HMMer3 .hmm file; return 0 at end of file + int ReadHMMer3(FILE* dbf, char* filestr=NULL); + + // Add transition pseudocounts to HMM + void AddTransitionPseudocounts(float gapd=par.gapd, float gape=par.gape, float gapf=par.gapf, float gapg=par.gapg, float gaph=par.gaph, float gapi=par.gapi, float gapb=par.gapb); + + // Use secondary structure-dependent gap penalties on top of the HMM transition penalties + void UseSecStrucDependentGapPenalties(); + + // Generate an amino acid frequency matrix g[][] with full pseudocount admixture (tau=1) + void PreparePseudocounts(); + + // Add amino acid pseudocounts to HMM: t.p[i][a] = (1-tau)*f[i][a] + tau*g[i][a] + void AddAminoAcidPseudocounts(char pcm=par.pcm, float pca=par.pca, float pcb=par.pcb, float pcc=par.pcc); + + // Add no amino acid pseudocounts to HMM: copy t.p[i][a] = f[i][a] + void NoAminoAcidPseudocounts() {for(int i=1; i<=L; i++) for(int a=0; a<20; a++) p[i][a]=f[i][a];}; + + // Factor Null model into HMM t + void IncludeNullModelInHMM(HMM& q, HMM& t); + + // Write HMM to output file + void WriteToFile(char* outfile); + + // Insert calibration line 'EVD lamda mu hashvalue' into HMM file + void InsertCalibration(char* infile); + + // Write HMM to output file in HMMER format + void WriteToFileHMMER(char* outfile); + + // Transform log to lin transition probs + void Log2LinTransitionProbs(float beta=1.0); + + // Set query columns in His-tags etc to Null model distribution + void NeutralizeTags(); + + // Calculate effective number of sequences using profiles INCLUDING pseudocounts + float CalcNeff(); + + // Calculate consensus of HMM (needed to merge HMMs later) + void CalculateConsensus(); + + // Store linear transition probabilities + void StoreLinearTransitionProbs(); + + // Initialize f[i][a] with query HMM + void MergeQueryHMM(HMM& q, float wk[]); + + // Normalize probabilities in total merged super-HMM + void NormalizeHMMandTransitionsLin2Log(); + + // Rescale rate matrices P[a][b], R[a][b] according to HMM av. aa composition in pav[a] + void RescaleMatrix(); + +#ifdef CLUSTALO + void ClobberGlobal(void); + char cQT; /* query or template */ +#endif + +private: + float** f; // f[i][a] = prob of finding amino acid a in column i WITHOUT pseudocounts + float** g; // f[i][a] = prob of finding amino acid a in column i WITH pseudocounts + float** p; // p[i][a] = prob of finding amino acid a in column i WITH OPTIMUM pseudocounts + float** tr; // log2 of transition probabilities M2M M2I M2D I2M I2I D2M D2D M2M_GAPOPEN GAPOPEN GAPEXTD +/* float** tr_lin; // transition probs in log space */ + char trans_lin; // transition probs are given in log or lin space? (0: p_tr 1: log(p_tr) + + char* ss_dssp; // secondary structure determined by dssp 0:- 1:H 2:E 3:C 4:S 5:T 6:G 7:B + char* sa_dssp; // solvent accessibility state determined by dssp 0:- 1:A (absolutely buried) 2:B 3:C 4:D 5:E (exposed) + char* ss_pred; // predicted secondary structure 0:- 1:H 2:E 3:C + char* ss_conf; // confidence value of prediction 0:- 1:0 ... 10:9 + char* Xcons; // consensus sequence in internal representation (A=0 R=1 N=2 D=3 ...) + float pav[NAA]; // pav[a] = average freq of amino acids in HMM (including subst matrix pseudocounts) + float pnul[NAA]; // null model probabilities used in comparison (only set in template/db HMMs) + int* l; // l[i] = pos. of j'th match state in aligment +/* char trans_lin; // transition probs are given in log or lin space? (0: p_tr 1: log(p_tr) */ + + // Utility for Read() + int Warning(FILE* dbf, char line[], char name[]) + { + if (v) cerr<<"\nWARNING: could not read line\n\'"<<line<<"\'\nin HMM "<<name<<" in "<<file<<"\n"; + while (fgetline(line,LINELEN,dbf) && !(line[0]=='/' && line[1]=='/')); + if (line) return 2; //return status: skip HMM + return 0; //return status: end of database file + } + + friend class Hit; + friend class Alignment; + friend class HMMshadow; +}; + +class HMMshadow { + + public: + float *Neff_M; + float *Neff_I; + float *Neff_D; + float **f; + float **g; + float **p; + float **tr; + float pav[20]; + + void copyHMMtoShadow(const HMM &hmm) { + Neff_M = hmm.Neff_M; + Neff_I = hmm.Neff_I; + Neff_D = hmm.Neff_D; + f = hmm.f; + g = hmm.g; + p = hmm.p; + tr = hmm.tr; + memcpy(pav, hmm.pav, 20*sizeof(float)); + } + + void copyShadowToHMM(const HMM &hmm, const hmm_light rShadow) { + + int i, j; + + for (i = 0; i < rShadow.L+1; i++){ + hmm.Neff_M[i] = rShadow.Neff_M[i]; + hmm.Neff_I[i] = rShadow.Neff_I[i]; + hmm.Neff_D[i] = rShadow.Neff_D[i]; + for (j = 0; j < 20; j++){ + hmm.f[i][j] = rShadow.f[i][j]; + hmm.g[i][j] = rShadow.g[i][j]; + hmm.p[i][j] = rShadow.p[i][j]; + } + for (j = 0; j < 7; j++){ + hmm.tr[i][j] = rShadow.tr[i][j]; + } + memcpy((void *)hmm.pav, rShadow.pav, 20*sizeof(float)); + } + } /* this is the end of copyShadowToHMM() */ + +} /* class HMMshadow */;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhmatrices-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,474 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhmatrices-C.h 199 2011-02-21 18:24:49Z fabian $ + */ + +// Substitution matrices and their background frequencies + +// The following background frequencies were calculated by the formula pa = (P[a,b]/(pa*pb))^(-1) * (1,...,1) +// For the Blousum50-matrix this becomes pb[a]= SUM_(b=1,20) (2^(BLOSUM50[a,b]/3))^(-1) +// A R N D C Q E G H I L K M F P S T W Y V +// Gonnet 7.68,5.14,4.02,5.41,1.89,3.27,5.99,7.56,3.69,5.06,10.01,5.97,2.20,3.50,4.54,4.67,7.12,1.25,3.95,7.28 +// BLOSUM50 8.24,6.24,4.46,4.77,2.03,2.90,6.78,6.69,2.53,6.89,10.7 ,5.04,1.49,4.93,3.97,5.95,6.13,1.34,3.45,6.28 + +const float Gonnet[]={ +// A R N D C Q E G H I L K M F P S T W Y V + 10227, 3430, 2875, 3869, 1625, 2393, 4590, 6500, 2352, 3225, 5819, 4172, 1435, 1579, 3728, 4610, 6264, 418, 1824, 5709, // A + 3430, 7780, 2209, 2589, 584, 2369, 3368, 3080, 2173, 1493, 3093, 5701, 763, 859, 1893, 2287, 3487, 444, 1338, 2356, // R + 2875, 2209, 3868, 3601, 501, 1541, 2956, 3325, 1951, 1065, 2012, 2879, 532, 688, 1480, 2304, 3204, 219, 1148, 1759, // N + 3869, 2589, 3601, 8618, 488, 2172, 6021, 4176, 2184, 1139, 2151, 3616, 595, 670, 2086, 2828, 3843, 204, 1119, 2015, // D + 1625, 584, 501, 488, 5034, 355, 566, 900, 516, 741, 1336, 591, 337, 549, 419, 901, 1197, 187, 664, 1373, // C + 2393, 2369, 1541, 2172, 355, 1987, 2891, 1959, 1587, 1066, 2260, 2751, 570, 628, 1415, 1595, 2323, 219, 871, 1682, // Q + 4590, 3368, 2956, 6021, 566, 2891, 8201, 3758, 2418, 1624, 3140, 4704, 830, 852, 2418, 2923, 4159, 278, 1268, 2809, // E + 6500, 3080, 3325, 4176, 900, 1959, 3758,26066, 2016, 1354, 2741, 3496, 741, 797, 2369, 3863, 4169, 375, 1186, 2569, // G + 2352, 2173, 1951, 2184, 516, 1587, 2418, 2016, 5409, 1123, 2380, 2524, 600, 1259, 1298, 1642, 2446, 383, 876, 1691, // H + 3225, 1493, 1065, 1139, 741, 1066, 1624, 1354, 1123, 6417, 9630, 1858, 1975, 2225, 1260, 1558, 3131, 417, 1697, 7504, // I + 5819, 3093, 2012, 2151, 1336, 2260, 3140, 2741, 2380, 9630,25113, 3677, 4187, 5540, 2670, 2876, 5272, 1063, 3945,11005, // L + 4172, 5701, 2879, 3616, 591, 2751, 4704, 3496, 2524, 1858, 3677, 7430, 949, 975, 2355, 2847, 4340, 333, 1451, 2932, // K + 1435, 763, 532, 595, 337, 570, 830, 741, 600, 1975, 4187, 949, 1300, 1111, 573, 743, 1361, 218, 828, 2310, // M + 1579, 859, 688, 670, 549, 628, 852, 797, 1259, 2225, 5540, 975, 1111, 6126, 661, 856, 1498, 1000, 4464, 2602, // F + 3728, 1893, 1480, 2086, 419, 1415, 2418, 2369, 1298, 1260, 2670, 2355, 573, 661,11834, 2320, 3300, 179, 876, 2179, // P + 4610, 2287, 2304, 2828, 901, 1595, 2923, 3863, 1642, 1558, 2876, 2847, 743, 856, 2320, 3611, 4686, 272, 1188, 2695, // S + 6264, 3487, 3204, 3843, 1197, 2323, 4159, 4169, 2446, 3131, 5272, 4340, 1361, 1498, 3300, 4686, 8995, 397, 1812, 5172, // T + 418, 444, 219, 204, 187, 219, 278, 375, 383, 417, 1063, 333, 218, 1000, 179, 272, 397, 4101, 1266, 499, // W + 1824, 1338, 1148, 1119, 664, 871, 1268, 1186, 876, 1697, 3945, 1451, 828, 4464, 876, 1188, 1812, 1266, 9380, 2227, // Y + 5709, 2356, 1759, 2015, 1373, 1682, 2809, 2569, 1691, 7504,11005, 2932, 2310, 2602, 2179, 2695, 5172, 499, 2227,11569};// V + +const float Blosum30[]= { +// A R N D C Q E G H I L K M F P S T W Y V + 0.0096, + 0.0038,0.0109, + 0.0031,0.0019,0.0055, + 0.0043,0.0026,0.0027,0.0095, + 0.0014,0.0011,0.0010,0.0010,0.0070, + 0.0031,0.0031,0.0014,0.0018,0.0007,0.0039, + 0.0044,0.0031,0.0024,0.0037,0.0018,0.0028,0.0094, + 0.0052,0.0032,0.0032,0.0035,0.0011,0.0020,0.0035,0.0173, + 0.0016,0.0014,0.0011,0.0011,0.0004,0.0010,0.0018,0.0015,0.0060, + 0.0040,0.0022,0.0024,0.0018,0.0012,0.0016,0.0023,0.0036,0.0012,0.0072, + 0.0056,0.0039,0.0032,0.0043,0.0023,0.0027,0.0051,0.0051,0.0022,0.0066,0.0139, + 0.0044,0.0043,0.0027,0.0032,0.0010,0.0021,0.0053,0.0039,0.0013,0.0026,0.0044,0.0063, + 0.0018,0.0012,0.0009,0.0008,0.0004,0.0007,0.0012,0.0013,0.0008,0.0014,0.0027,0.0017,0.0012, + 0.0027,0.0023,0.0017,0.0011,0.0008,0.0010,0.0016,0.0022,0.0008,0.0027,0.0055,0.0023,0.0008,0.0077, + 0.0028,0.0021,0.0012,0.0021,0.0007,0.0015,0.0030,0.0030,0.0014,0.0017,0.0027,0.0029,0.0005,0.0011,0.0091, + 0.0056,0.0035,0.0028,0.0034,0.0013,0.0021,0.0038,0.0051,0.0017,0.0033,0.0047,0.0042,0.0010,0.0027,0.0024,0.0075, + 0.0040,0.0019,0.0024,0.0024,0.0009,0.0016,0.0023,0.0028,0.0010,0.0027,0.0046,0.0025,0.0010,0.0016,0.0020,0.0041,0.0046, + 0.0005,0.0007,0.0002,0.0004,0.0003,0.0004,0.0007,0.0011,0.0002,0.0005,0.0009,0.0006,0.0002,0.0007,0.0004,0.0005,0.0003,0.0027, + 0.0014,0.0022,0.0008,0.0015,0.0004,0.0011,0.0016,0.0016,0.0010,0.0018,0.0045,0.0017,0.0007,0.0024,0.0011,0.0017,0.0014,0.0009,0.0044, + 0.0056,0.0031,0.0022,0.0027,0.0012,0.0015,0.0026,0.0033,0.0012,0.0063,0.0074,0.0030,0.0015,0.0032,0.0017,0.0036,0.0036,0.0005,0.0024,0.0083}; + +const float Blosum40[]= { +// A R N D C Q E G H I L K M F P S T W Y V + 0.0148, + 0.0029,0.0109, + 0.0029,0.0019,0.0069, + 0.0032,0.0021,0.0031,0.0126, + 0.0015,0.0007,0.0007,0.0009,0.0093, + 0.0026,0.0024,0.0017,0.0016,0.0004,0.0048, + 0.0040,0.0026,0.0023,0.0048,0.0010,0.0032,0.0118, + 0.0066,0.0023,0.0035,0.0031,0.0012,0.0020,0.0028,0.0260, + 0.0014,0.0012,0.0013,0.0014,0.0003,0.0010,0.0015,0.0014,0.0060, + 0.0037,0.0017,0.0017,0.0016,0.0008,0.0012,0.0018,0.0024,0.0009,0.0105, + 0.0050,0.0030,0.0021,0.0027,0.0015,0.0023,0.0036,0.0034,0.0017,0.0082,0.0209, + 0.0041,0.0051,0.0027,0.0030,0.0010,0.0026,0.0045,0.0035,0.0013,0.0023,0.0037,0.0099, + 0.0017,0.0010,0.0007,0.0007,0.0003,0.0007,0.0010,0.0013,0.0007,0.0018,0.0037,0.0012,0.0018, + 0.0022,0.0016,0.0013,0.0013,0.0008,0.0008,0.0015,0.0021,0.0009,0.0031,0.0055,0.0018,0.0011,0.0105, + 0.0027,0.0014,0.0014,0.0019,0.0005,0.0013,0.0026,0.0028,0.0008,0.0020,0.0021,0.0023,0.0007,0.0010,0.0151, + 0.0060,0.0025,0.0030,0.0030,0.0013,0.0026,0.0034,0.0052,0.0013,0.0025,0.0034,0.0034,0.0011,0.0019,0.0022,0.0089, + 0.0040,0.0019,0.0022,0.0024,0.0011,0.0015,0.0025,0.0029,0.0009,0.0028,0.0039,0.0029,0.0011,0.0019,0.0022,0.0043,0.0070, + 0.0007,0.0005,0.0003,0.0003,0.0001,0.0004,0.0005,0.0008,0.0002,0.0005,0.0009,0.0005,0.0002,0.0008,0.0003,0.0004,0.0003,0.0045, + 0.0019,0.0016,0.0010,0.0011,0.0004,0.0010,0.0014,0.0017,0.0012,0.0020,0.0031,0.0017,0.0010,0.0032,0.0009,0.0015,0.0014,0.0008,0.0060, + 0.0054,0.0023,0.0017,0.0022,0.0012,0.0014,0.0025,0.0028,0.0008,0.0083,0.0082,0.0027,0.0018,0.0031,0.0018,0.0032,0.0040,0.0005,0.0020,0.0113}; + +const float Blosum50[]= { +// A R N D C Q E G H I L K M F P S T W Y V + 0.0192, + 0.0027,0.0152, + 0.0024,0.0020,0.0101, + 0.0026,0.0019,0.0035,0.0161, + 0.0015,0.0005,0.0006,0.0005,0.0091, + 0.0022,0.0025,0.0016,0.0017,0.0004,0.0057, + 0.0034,0.0029,0.0023,0.0048,0.0006,0.0033,0.0141, + 0.0062,0.0020,0.0031,0.0028,0.0009,0.0017,0.0023,0.0316, + 0.0012,0.0013,0.0015,0.0011,0.0003,0.0010,0.0013,0.0011,0.0064, + 0.0035,0.0015,0.0013,0.0012,0.0008,0.0011,0.0015,0.0018,0.0007,0.0140, + 0.0048,0.0028,0.0017,0.0018,0.0014,0.0019,0.0026,0.0027,0.0013,0.0104,0.0304, + 0.0033,0.0064,0.0027,0.0026,0.0006,0.0029,0.0043,0.0028,0.0014,0.0017,0.0027,0.0130, + 0.0016,0.0009,0.0007,0.0005,0.0004,0.0008,0.0008,0.0009,0.0005,0.0022,0.0042,0.0010,0.0029, + 0.0020,0.0012,0.0009,0.0008,0.0006,0.0007,0.0012,0.0015,0.0009,0.0030,0.0058,0.0012,0.0012,0.0154, + 0.0022,0.0011,0.0011,0.0015,0.0004,0.0011,0.0019,0.0019,0.0006,0.0013,0.0017,0.0018,0.0005,0.0007,0.0171, + 0.0062,0.0025,0.0032,0.0028,0.0011,0.0022,0.0030,0.0044,0.0012,0.0021,0.0029,0.0031,0.0010,0.0016,0.0018,0.0111, + 0.0039,0.0021,0.0026,0.0022,0.0010,0.0015,0.0024,0.0025,0.0009,0.0029,0.0038,0.0026,0.0011,0.0015,0.0016,0.0047,0.0100, + 0.0005,0.0004,0.0002,0.0002,0.0001,0.0003,0.0004,0.0005,0.0002,0.0005,0.0008,0.0004,0.0003,0.0009,0.0002,0.0003,0.0004,0.0059, + 0.0015,0.0013,0.0009,0.0009,0.0004,0.0009,0.0012,0.0012,0.0013,0.0018,0.0027,0.0013,0.0007,0.0039,0.0006,0.0013,0.0012,0.0008,0.0077, + 0.0054,0.0020,0.0015,0.0016,0.0013,0.0014,0.0020,0.0022,0.0007,0.0107,0.0092,0.0022,0.0021,0.0030,0.0016,0.0029,0.0041,0.0005,0.0018,0.0164}; + +const float Blosum65[]= { +// A R N D C Q E G H I L K M F P S T W Y V + 0.0222, + 0.0022,0.0181, + 0.0019,0.0019,0.0148, + 0.0021,0.0015,0.0037,0.0225, + 0.0016,0.0004,0.0004,0.0004,0.0127, + 0.0018,0.0024,0.0015,0.0016,0.0003,0.0076, + 0.0029,0.0025,0.0021,0.0049,0.0003,0.0034,0.0168, + 0.0057,0.0016,0.0027,0.0024,0.0007,0.0013,0.0018,0.0396, + 0.0010,0.0013,0.0014,0.0009,0.0002,0.0010,0.0013,0.0009,0.0096, + 0.0031,0.0012,0.0009,0.0011,0.0012,0.0008,0.0012,0.0013,0.0006,0.0191, + 0.0043,0.0023,0.0013,0.0014,0.0016,0.0016,0.0019,0.0020,0.0009,0.0115,0.0388, + 0.0032,0.0062,0.0024,0.0024,0.0005,0.0030,0.0040,0.0024,0.0012,0.0015,0.0024,0.0166, + 0.0013,0.0007,0.0005,0.0004,0.0004,0.0007,0.0006,0.0007,0.0003,0.0025,0.0052,0.0008,0.0045, + 0.0016,0.0009,0.0007,0.0007,0.0005,0.0005,0.0008,0.0011,0.0008,0.0030,0.0056,0.0009,0.0012,0.0186, + 0.0021,0.0009,0.0008,0.0011,0.0003,0.0008,0.0014,0.0013,0.0005,0.0009,0.0013,0.0015,0.0004,0.0005,0.0195, + 0.0065,0.0022,0.0030,0.0027,0.0011,0.0018,0.0029,0.0037,0.0011,0.0017,0.0024,0.0030,0.0008,0.0012,0.0016,0.0137, + 0.0037,0.0017,0.0022,0.0019,0.0009,0.0013,0.0021,0.0022,0.0007,0.0027,0.0033,0.0023,0.0010,0.0012,0.0013,0.0048,0.0133, + 0.0004,0.0003,0.0002,0.0001,0.0002,0.0002,0.0002,0.0004,0.0002,0.0004,0.0007,0.0003,0.0002,0.0009,0.0001,0.0003,0.0003,0.0074, + 0.0013,0.0009,0.0007,0.0006,0.0004,0.0006,0.0008,0.0008,0.0016,0.0015,0.0023,0.0010,0.0006,0.0043,0.0004,0.0010,0.0009,0.0010,0.0113, + 0.0049,0.0015,0.0011,0.0012,0.0014,0.0011,0.0016,0.0017,0.0006,0.0120,0.0094,0.0019,0.0023,0.0025,0.0012,0.0023,0.0035,0.0004,0.0015,0.0206}; + + +const float Blosum80[]= { +// A R N D C Q E G H I L K M F P S T W Y V + 0.0252, + 0.0020,0.0210, + 0.0016,0.0017,0.0166, + 0.0018,0.0013,0.0037,0.0262, + 0.0015,0.0003,0.0004,0.0003,0.0172, + 0.0017,0.0024,0.0014,0.0014,0.0003,0.0094, + 0.0028,0.0023,0.0019,0.0048,0.0003,0.0035,0.0208, + 0.0053,0.0015,0.0025,0.0022,0.0006,0.0011,0.0017,0.0463, + 0.0009,0.0012,0.0012,0.0008,0.0002,0.0011,0.0012,0.0008,0.0104, + 0.0027,0.0010,0.0007,0.0008,0.0011,0.0007,0.0010,0.0009,0.0004,0.0220, + 0.0036,0.0018,0.0011,0.0011,0.0014,0.0014,0.0015,0.0016,0.0008,0.0111,0.0442, + 0.0029,0.0061,0.0022,0.0020,0.0004,0.0028,0.0036,0.0020,0.0010,0.0012,0.0019,0.0190, + 0.0011,0.0006,0.0004,0.0003,0.0004,0.0007,0.0006,0.0005,0.0003,0.0025,0.0052,0.0007,0.0053, + 0.0014,0.0007,0.0006,0.0006,0.0005,0.0005,0.0006,0.0009,0.0007,0.0027,0.0052,0.0007,0.0010,0.0211, + 0.0021,0.0009,0.0007,0.0009,0.0003,0.0007,0.0012,0.0010,0.0004,0.0007,0.0012,0.0012,0.0003,0.0004,0.0221, + 0.0064,0.0020,0.0029,0.0024,0.0010,0.0017,0.0026,0.0034,0.0010,0.0015,0.0021,0.0026,0.0007,0.0010,0.0014,0.0167, + 0.0036,0.0015,0.0020,0.0016,0.0009,0.0012,0.0019,0.0019,0.0007,0.0024,0.0028,0.0020,0.0009,0.0011,0.0011,0.0048,0.0156, + 0.0003,0.0002,0.0001,0.0001,0.0001,0.0002,0.0002,0.0003,0.0001,0.0003,0.0006,0.0002,0.0002,0.0007,0.0001,0.0002,0.0002,0.0087, + 0.0011,0.0007,0.0006,0.0005,0.0003,0.0005,0.0006,0.0006,0.0016,0.0013,0.0020,0.0008,0.0005,0.0046,0.0003,0.0009,0.0008,0.0010,0.0148, + 0.0046,0.0013,0.0009,0.0010,0.0013,0.0010,0.0015,0.0014,0.0005,0.0123,0.0089,0.0015,0.0022,0.0022,0.0010,0.0021,0.0033,0.0004,0.0012,0.0246}; + + +// prediction accuracy of Psipred: +// Ppred[cf][B][A] = P(A,B,cf)/P(A)/P(B,cf) = P(A|B,cf)/P(A) +// A = observed ss state B = predicted ss state cf = confidence value of prediction +//float Ppred[MAXCF][NSSPRED][NDSSP]= +const float Ppred[]= + { +//pred/obs - H E ~ S T G B + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=- + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // H + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // E + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=0 + 1.000, 1.128, 0.519, 0.834, 0.957, 1.488, 2.106, 1.085 , // H + 1.000, 0.233, 2.240, 1.216, 0.913, 0.519, 0.923, 1.759 , // E + 1.000, 0.640, 1.017, 1.122, 1.069, 1.242, 2.140, 1.999 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=1 + 1.000, 1.251, 0.485, 0.771, 0.847, 1.371, 2.266, 0.864 , // H + 1.000, 0.222, 2.542, 1.069, 0.804, 0.428, 0.671, 1.728 , // E + 1.000, 0.474, 1.103, 1.295, 1.232, 1.214, 1.835, 1.989 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=2 + 1.000, 1.383, 0.426, 0.637, 0.778, 1.349, 2.436, 0.824 , // H + 1.000, 0.202, 2.769, 0.999, 0.714, 0.320, 0.551, 1.566 , // E + 1.000, 0.395, 1.005, 1.407, 1.376, 1.336, 1.725, 2.063 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=3 + 1.000, 1.531, 0.369, 0.552, 0.682, 1.280, 2.420, 0.698 , // H + 1.000, 0.169, 2.970, 0.954, 0.556, 0.273, 0.489, 1.504 , // E + 1.000, 0.352, 0.843, 1.515, 1.542, 1.456, 1.684, 1.958 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=4 + 1.000, 1.750, 0.305, 0.444, 0.537, 1.134, 2.295, 0.600 , // H + 1.000, 0.124, 3.179, 0.847, 0.513, 0.228, 0.413, 1.897 , // E + 1.000, 0.282, 0.718, 1.664, 1.630, 1.577, 1.625, 1.877 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=5 + 1.000, 1.952, 0.250, 0.353, 0.456, 0.982, 2.050, 0.466 , // H + 1.000, 0.102, 3.464, 0.699, 0.453, 0.174, 0.284, 1.357 , // E + 1.000, 0.227, 0.574, 1.782, 1.846, 1.681, 1.418, 1.885 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=6 + 1.000, 2.183, 0.171, 0.263, 0.319, 0.792, 1.933, 0.345 , // H + 1.000, 0.079, 3.712, 0.612, 0.281, 0.133, 0.196, 1.089 , // E + 1.000, 0.173, 0.458, 1.915, 2.007, 1.766, 1.220, 1.704 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=7 + 1.000, 2.389, 0.132, 0.192, 0.224, 0.605, 1.605, 0.183 , // H + 1.000, 0.053, 3.997, 0.449, 0.201, 0.072, 0.141, 0.919 , // E + 1.000, 0.109, 0.328, 2.013, 2.304, 1.882, 0.960, 1.512 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=8 + 1.000, 2.668, 0.065, 0.098, 0.144, 0.354, 1.059, 0.102 , // H + 1.000, 0.029, 4.285, 0.284, 0.113, 0.044, 0.059, 0.522 , // E + 1.000, 0.053, 0.200, 2.099, 2.444, 2.133, 0.671, 1.290 , // ~ + 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=9 + 1.000, 2.966, 0.009, 0.023, 0.036, 0.113, 0.214, 0.017 , // H + 1.000, 0.010, 4.555, 0.119, 0.027, 0.010, 0.013, 0.209 , // E + 1.000, 0.026, 0.101, 2.576, 1.853, 2.204, 0.308, 0.499 // ~ + }; + +// float Ppred[]= +// { +// //pred/obs - H E ~ S T G B +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=- +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=0 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=1 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=2 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=3 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=4 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=5 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=6 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=7 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=8 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ +// 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 , // - conf=9 +// 1.000, 2.000, 0.500, 1.000, 1.000, 1.000, 1.000, 0.500, // H +// 1.000, 0.500, 2.000, 0.500, 1.000, 1.000, 0.500, 1.000, // E +// 1.000, 1.000, 1.000, 2.000, 2.000, 2.000, 1.000, 1.000, // ~ + + +float Pobs[]={0, 0.3268,0.2119,0.2061,0.0913,0.1143,0.0376,0.0120}; + +float Pevo_full[]= + { +// - H E C + 1.00, 0.00, 0.00, 0.00, + 0.00, 0.94, 0.00, 0.04, + 0.00, 0.00, 0.92, 0.04, + 0.00, 0.06, 0.08, 0.92 + }; + +//psipred accuracy for confidence values 0-9 +const float p_acc[]={0.00,0.47,0.53,0.56,0.58,0.62,0.69,0.74,0.82,0.88,0.96}; + +/** + * @brief + */ +void +SetBlosumMatrix(const float BlosumXX[]) +{ + int a,b,n=0; + if (v>=3) printf("Using the BLOSUM%2i matrix\n",par.matrix); + for (a=0; a<20; ++a) + for (pb[a]=0.0f, b=0; b<=a; ++b,++n) + P[a][b] = BlosumXX[n]; + for (a=0; a<19; a++) + for (b=a+1; b<20; ++b) + P[a][b] = P[b][a]; + for (a=0; a<20; ++a) P[a][20]=P[20][a]=1.0f; + return; +} + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Set (global variable) substitution matrix with derived matrices and background frequencies + */ +void +SetSubstitutionMatrix() +{ + int a,b; + switch (par.matrix) + { + default: + case 0: //Gonnet matrix + if (v>=3) cout<<"Using the Gonnet matrix "; + for (a=0; a<20; ++a) + for (pb[a]=0.0f, b=0; b<20; ++b) + P[a][b] = 0.000001f*Gonnet[a*20+b]; + for (a=0; a<20; ++a) P[a][20]=P[20][a]=1.0f; + break; + + case 30: //BLOSUM30 + SetBlosumMatrix(Blosum30); + break; + case 40: //BLOSUM40 + SetBlosumMatrix(Blosum40); + break; + case 50: //BLOSUM50 + SetBlosumMatrix(Blosum50); + break; + case 65: //BLOSUM65 + SetBlosumMatrix(Blosum65); + break; + case 80: //BLOSUM80 + SetBlosumMatrix(Blosum80); + break; + } + + // Check transition probability matrix, renormalize P and calculate pb[a] + float sumab=0.0f; + for (a=0; a<20; a++) + for (b=0; b<20; ++b) sumab+=P[a][b]; + for (a=0; a<20; a++) + for (b=0; b<20; ++b) P[a][b]/=sumab; + for (a=0; a<20; a++) + for (pb[a]=0.0f, b=0; b<20; ++b) pb[a]+=P[a][b]; + + //Compute similarity matrix for amino acid pairs (for calculating consensus sequence) + for (a=0; a<20; ++a) + for (b=0; b<20; ++b) + Sim[a][b] = P[a][b]*P[a][b]/P[a][a]/P[b][b]; + + //Precompute matrix R for amino acid pseudocounts: + for (a=0; a<20; ++a) + for (b=0; b<20; ++b) + R[a][b] = P[a][b]/pb[b]; //R[a][b]=P(a|b) + + //Precompute matrix R for amino acid pseudocounts: + for (a=0; a<20; ++a) + for (b=0; b<20; ++b) + S[a][b] = log2(R[a][b]/pb[a]); // S[a][b] = log2(P(a,b)/P(a)/P(b)) + + // Evaluate sequence identity underlying substitution matrix + if (v>=3) + { + float id=0.0f; + float entropy=0.0f; + float entropy_pb=0.0f; + float mut_info=0.0f; + for (a=0; a<20; ++a) id+=P[a][a]; + for (a=0; a<20; ++a) entropy_pb-=pb[a]*log2(pb[a]); + for (a=0; a<20; ++a) + for (b=0; b<20; ++b) + { + entropy-=P[a][b]*log2(R[a][b]); + mut_info += P[a][b]*S[a][b]; + } + + printf(": sequence identity = %2.0f%%; entropy per column = %4.2f bits (out of %4.2f); mutual information = %4.2f bits\n",100*id,entropy,entropy_pb,mut_info); + } + + if (v>=4) //Debugging: probability matrix and dissimilarity matrix + { + cout<<"Check matrix: before renormalization sum P(a,b)= "<<sumab<<"...\n";//PRINT + cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; + cout<<"p[] "; + for (a=0; a<20; a++) printf("%4.1f ",100*pb[a]); + cout<<endl<<"\nSubstitution matrix log2( P(a,b)/p(a)/p(b) ) (in bits):\n"; + cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; + for (b=0; b<20; b++) + { + cout<<i2aa(b)<<" "; + for (a=0; a<20; a++) printf("%4.1f ",S[a][b]); + cout<<endl; + } + cout<<endl<<"\nOdds matrix P(a,b)/p(a)/p(b):\n"; + cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; + for (b=0; b<20; b++) + { + cout<<i2aa(b)<<" "; + for (a=0; a<20; a++) printf("%4.1f ",P[b][a]/pb[a]/pb[b]); + cout<<endl; + } + cout<<endl<<"\nMatrix of conditional probabilities P(a|b) = P(a,b)/p(b) (in %):\n"; + cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; + for (b=0; b<20; b++) + { + cout<<i2aa(b)<<" "; + for (a=0; a<20; a++) printf("%4.1f ",100*R[b][a]); + cout<<endl; + } + cout<<endl<<"\nProbability matrix P(a,b) (in %):\n"; + cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; + for (b=0; b<20; b++) + { + cout<<i2aa(b)<<" "; + for (a=0; a<20; a++) printf("%5.0f ",1000000*P[b][a]); + cout<<endl; + } + cout<<endl<<"Similarity matrix P(a,b)^2/P(a,a,)/P(b,b) (in %):\n"; + cout<<" A R N D C Q E G H I L K M F P S T W Y V\n"; + for (b=0; b<20; b++) + { + cout<<i2aa(b)<<" "; + for (a=0; a<20; a++) printf("%4.0f ",100*Sim[b][a]); + cout<<endl; + } + cout<<endl; + + + } +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Set secondary structure substitution matrix + */ +void +SetSecStrucSubstitutionMatrix() +{ + int A; //observed ss state (determined dssp) + int B,BB; //predicted ss states (by psipred) + int cf,ccf; //confidence value of prediction + float P73[NDSSP][NSSPRED][MAXCF]; //P73[cf][B][A] = P(A,B,cf)/P(A)/P(B,cf) = P(A|B,cf)/P(A) + float sum; + + // S73[A][B][cf][b] = score for matching observed ss state A in query with state B in template + // predicted with confidence cf, when query and template columns are diverged by b units + for (cf=0; cf<MAXCF; cf++) + for (A=0; A<NDSSP; A++) + for (B=0; B<NSSPRED; B++) + { + P73[A][B][cf] = 1.-par.ssa + par.ssa*Ppred[cf*NSSPRED*NDSSP + B*NDSSP + A]; + S73[A][B][cf] = log2(P73[A][B][cf]); + } + + for (B=0; B<NSSPRED; B++) + for (cf=0; cf<MAXCF; cf++) + for (BB=0; BB<NSSPRED; BB++) + for (ccf=0; ccf<MAXCF; ccf++) + { + sum=0; + for (A=1; A<NDSSP; A++) + sum += P73[A][B][cf] * P73[A][BB][ccf] * Pobs[A]; + S33[B][cf][BB][ccf] = log2(sum); + } +} /* this is the end of SetSecStrucSubstitutionMatrix() */ + + + +/* + * EOF hhmatrices-C.h + */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/hhutil-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,659 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: hhutil-C.h 229 2011-04-07 17:09:07Z fabian $ + */ + +////////////////////////////////////////////////////////////////////////////// +// Transform a character to lower case and '.' to '-' and vice versa +////////////////////////////////////////////////////////////////////////////// + + +inline char +MatchChr(char c) {return ((c>='a' && c<='z')? c-'a'+'A' : (c=='.'? '-':c) );} + +inline char +InsertChr(char c) {return ((c>='A' && c<='Z')? c+'a'-'A' : ((c>='0' && c<='9') || c=='-')? '.':c );} + +inline int +WordChr(char c) {return (int)((c>='A' && c<='Z') || (c>='a' && c<='z'));} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms the one-letter amino acid code into an integer between 0 and 22 + */ +inline char +aa2i(char c) +{ + //A R N D C Q E G H I L K M F P S T W Y V + if (c>='a' && c<='z') c+='A'-'a'; + switch (c) + { + case 'A': return 0; + case 'R': return 1; + case 'N': return 2; + case 'D': return 3; + case 'C': return 4; + case 'Q': return 5; + case 'E': return 6; + case 'G': return 7; + case 'H': return 8; + case 'I': return 9; + case 'L': return 10; + case 'K': return 11; + case 'M': return 12; + case 'F': return 13; + case 'P': return 14; + case 'S': return 15; + case 'T': return 16; + case 'W': return 17; + case 'Y': return 18; + case 'V': return 19; + case 'X': return ANY; + case 'J': return ANY; + case 'O': return ANY; + case 'U': return 4; //Selenocystein -> Cystein + case 'B': return 3; //D (or N) + case 'Z': return 6; //E (or Q) + case '-': return GAP; + case '.': return GAP; + case '_': return GAP; + } + if (c>=0 && c<=32) return -1; // white space and control characters + return -2; +} + +/////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms integers between 0 and 22 into the one-letter amino acid code + */ +inline char +i2aa(char c) +{ + //A R N D C Q E G H I L K M F P S T W Y V + switch (c) + { + case 0: return 'A'; + case 1: return 'R'; + case 2: return 'N'; + case 3: return 'D'; + case 4: return 'C'; + case 5: return 'Q'; + case 6: return 'E'; + case 7: return 'G'; + case 8: return 'H'; + case 9: return 'I'; + case 10: return 'L'; + case 11: return 'K'; + case 12: return 'M'; + case 13: return 'F'; + case 14: return 'P'; + case 15: return 'S'; + case 16: return 'T'; + case 17: return 'W'; + case 18: return 'Y'; + case 19: return 'V'; + case ANY: return 'X'; + case GAP: return '-'; + case ENDGAP: return '-'; + } + return '?'; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms the dssp/psipred secondary structure code into an integer number + */ +inline char +ss2i(char c) +{ + //- H E C S T G B + if (c>='a' && c<='z') c+='A'-'a'; + switch (c) + { + case '.': return 0; + case '-': return 0; + case 'X': return 0; + case 'H': return 1; + case 'E': return 2; + case 'C': return 3; + case '~': return 3; + case 'S': return 4; + case 'T': return 5; + case 'G': return 6; + case 'B': return 7; + case 'I': return 3; + case ' ': return -1; + case '\t': return -1; + case '\n': return -1; + } + return -2; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms integers between 0 and 8 into the dssp/psipred secondary structure code + */ +inline char +i2ss(int c) +{ + //- H E C S T G B + switch (c) + { + case 0: return '-'; + case 1: return 'H'; + case 2: return 'E'; + case 3: return 'C'; + case 4: return 'S'; + case 5: return 'T'; + case 6: return 'G'; + case 7: return 'B'; + case 8: return 'I'; + } + return '?'; +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms the solvend accessiblity code into an integer number + */ +inline char +sa2i(char c) +{ + //- A B C D E + if (c>='a' && c<='z') c+='A'-'a'; + switch (c) + { + case '.': return 0; + case '-': return 0; + case 'A': return 1; + case 'B': return 2; + case 'C': return 3; + case 'D': return 4; + case 'E': return 5; + case 'F': return 6; + case ' ': return -1; + case '\t': return -1; + case '\n': return -1; + } + return -2; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms integers between 0 and 5 into the solvent accessibility code + */ +inline char i2sa(int c) +{ + //- H E C S T G B + switch (c) + { + case 0: return '-'; + case 1: return 'A'; + case 2: return 'B'; + case 3: return 'C'; + case 4: return 'D'; + case 5: return 'E'; + case 6: return 'F'; + } + return '?'; +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms alternative secondary structure symbols into symbols + */ +inline char +ss2ss(char c) +{ + //- H E C S T G B + switch (c) + { + case '~': return 'C'; + case 'I': return 'C'; + case 'i': return 'c'; + case 'H': + case 'E': + case 'C': + case 'S': + case 'T': + case 'G': + case 'B': + case 'h': + case 'e': + case 'c': + case 's': + case 't': + case 'g': + case 'b': + case '.': + return c; + } + return '-'; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms confidence values of psipred into internal code + */ +inline char +cf2i(char c) +{ + switch (c) + { + case '-': return 0; + case '.': return 0; + case '0': return 1; + case '1': return 2; + case '2': return 3; + case '3': return 4; + case '4': return 5; + case '5': return 6; + case '6': return 7; + case '7': return 8; + case '8': return 9; + case '9': return 10; + } + return 0; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Transforms internal representation of psipred confidence values into printable chars + */ +inline char +i2cf(char c) +{ + switch (c) + { + case 0: return '-'; + case 1: return '0'; + case 2: return '1'; + case 3: return '2'; + case 4: return '3'; + case 5: return '4'; + case 6: return '5'; + case 7: return '6'; + case 8: return '7'; + case 9: return '8'; + case 10: return '9'; + } + return '-'; +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Fast lookup of log2(1+2^(-x)) for x>=0 (precision < 0.35%) + */ +inline float +fast_addscore(float x) +{ + static float val[2001]; // val[i]=log2(1+2^(-x)) + static char initialized; + if (x>20) return 0.0; + if (x<0) + { + fprintf(stderr,"Error in function fast_addscore: argument %g is negative\n",x); + exit(7); + } + if (!initialized) //First fill in the log2-vector + { + for (int i=0; i<=2000; i++) val[i]=log2(1.0+pow(2,-0.01*(i+0.5))); + initialized=1; + } + return val[(int)(100.0*x)]; +} + + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Little utilities for output + */ +inline void +fout(FILE* outf, int d) +{ + if (d>=99999) fprintf(outf,"*\t"); else fprintf(outf,"%i\t",d); + return; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Errors + */ +int +FormatError(const char infile[], const char details[]="") +{ + cerr<<"Error in "<</*par.argv[0],FS*/__FILE__<<": wrong format while reading file \'"<<infile<<". "<<details<<"\n"; + exit(1); +} + +int +OpenFileError(const char outfile[]) +{ + cerr<<endl<<"Error in "<</*par.argv[0],FS*/__FILE__<<": could not open file \'"<<outfile<<"\'\n"; + exit(2); +} + +int +MemoryError(const char arrayname[]) +{ + cerr<<"Error in "<</*par.argv[0],FS*/__FILE__<<": Memory overflow while creating \'"<<arrayname<<"\'. Please report this bug to developers\n"; + exit(3); +} + +int +InternalError(const char errstr[]) +{ + cerr<<"Error in "<</*par.argv[0],FS*/__FILE__<<": "<<errstr<<". Please report this bug to developers\n"; + exit(6); +} + + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Takes family code (eg. a.1.2.3) and returns strings 'a', 'a.1', and 'a.1.2' + */ +inline void +ScopID(char cl[], char fold[], char sfam[], const char fam[]) +{ + char* ptr; + + //get scop class ID + strcpy(cl,fam); + ptr = strchr(cl,'.'); //return adress of next '.' in name + if(ptr) ptr[0]='\0'; + + //get scop fold ID + strcpy(fold,fam); + ptr = strchr(fold,'.'); //return adress of next '.' in name + if(ptr) ptr = strchr(ptr+1,'.'); //return adress of next '.' in name + if(ptr) ptr[0]='\0'; + + //get scop superfamily ID + strcpy(sfam,fam); + ptr = strchr(sfam,'.'); //return adress of next '.' in name + if(ptr) ptr = strchr(ptr+1,'.'); //return adress of next '.' in name + if(ptr) ptr = strchr(ptr+1,'.'); //return adress of next '.' in name + if(ptr) ptr[0]='\0'; + return; +} + +////////////////////////////////////////////////////////////////////////////// +/** + * @brief Read up to n lines of outfile and write to screen (STDERR) + */ +void +WriteToScreen(char* outfile, int n) +{ + char line[LINELEN]=""; + ifstream outf; + outf.open(outfile, ios::in); + if (!outf) {OpenFileError(outfile);} + cout<<"\n"; + for(; n>0 && outf.getline(line,LINELEN); n--) cout<<line<<"\n"; + outf.close(); + cout<<"\n"; +} + +inline void +WriteToScreen(char* outfile) {WriteToScreen(outfile,INT_MAX);} + + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Read .hhdefaults file into array argv_conf (beginning at argv_conf[1]) + */ +void +ReadDefaultsFile(int& argc_conf, char** argv_conf) +{ + char line[LINELEN]=""; + char filename[NAMELEN]; + char* c_first; //pointer to first character of argument string + char* c; //pointer to scan line read in for end of argument + // ifstream configf; + FILE* configf=NULL; + argc_conf=1; //counts number of arguments read in + + // Open config file + strcpy(filename,"./.hhdefaults"); + configf = fopen(filename,"r"); + if (!configf && getenv("HOME")) + { + strcpy(filename,getenv("HOME")); + strcat(filename,"/.hhdefaults"); + configf = fopen(filename,"r"); + if (!configf) + { + if (v>=3) cerr<<"Warning: could not find ./.hhdefaults or "<<filename<<"\n"; + return; + } + } + else if (!configf) return; // only webserver has no home directory => need no warning + + // Scan file until line 'program_nameANYTHING' + while (fgets(line,LINELEN,configf)) + if (!strncmp(line,program_name,6)) break; + // Found line 'program_nameANYTHING'? + if (!strncmp(line,program_name,6)) + { + // Read in options until end-of-file or empty line + while (fgets(line,LINELEN,configf) && strcmp(line,"\n")) + { + // Analyze line + c=line; + do + { + // Find next word + while (*c==' ' || *c=='\t') c++; //Advance until next non-white space + if (*c=='\0' || *c=='\n' || *c=='#') break; //Is next word empty string? + c_first=c; + while (*c!=' ' && *c!='\t' && *c!='#' && *c!='\0' && *c!='\n' ) c++; //Advance until next white space or '#' + if (*c=='\0' || *c=='\n' || *c=='#') //Is end of line reached? + { + *c='\0'; + argv_conf[argc_conf]=new(char[strlen(c_first)+1]); + strcpy(argv_conf[argc_conf++],c_first); + break; + } + *c='\0'; + argv_conf[argc_conf]=new(char[strlen(c_first)+1]); + strcpy(argv_conf[argc_conf++],c_first); + printf("Argument: %s\n",c_first); + c++; + } while (1); + } //end read line + if (v>=3) + { + cout<<"Arguments read in from .hhdefaults:"; + for (int argc=1; argc<argc_conf; argc++) cout<<(argv_conf[argc][0]=='-'? " ":"")<<argv_conf[argc]<<" "; + cout<<"\n"; + } + else if (v>=3) cout<<"Read in "<<argc_conf<<" default arguments for "<<program_name<<" from "<<filename<<"\n"; + } + else //found no line 'program_name anything" + { + if (v>=3) cerr<<endl<<"Warning: no default options for \'"<<program_name<<"\' found in "<<filename<<"\n"; + return; //no line 'program_name anything' found + } +// configf.close(); + fclose(configf); +} + + +///////////////////////////////////////////////////////////////////////////////////// +/** + * @brief Set default parameter values + */ +void +SetDefaults() +{ + + par.append=0; // overwrite output file + par.outformat=0; // 0: hhr 1: FASTA 2:A2M 3:A3M + par.p=20.0f; // minimum threshold for inclusion in hit list and alignment listing + par.E=1e6f; // maximum threshold for inclusion in hit list and alignment listing + par.b=10; // min number of alignments + par.B=500; // max number of alignments + par.z=10; // min number of lines in hit list + par.Z=500; // max number of lines in hit list + par.e=1e-3f; // maximum E-value for inclusion in output alignment, output HMM, and PSI-BLAST checkpoint model + par.showcons=1; // show consensus sequence + par.showdssp=1; // show predicted secondary structure + par.showpred=1; // show dssp secondary structure + par.cons=0; // show first non-SS sequence as main representative sequence (not consensus) + par.nseqdis=1; // maximum number of query sequences for output alignment + par.mark=0; // 1: only marked sequences (or first) get displayed; 0: most divergent ones get displayed + par.aliwidth=80; // number of characters per line in output alignments for HMM search + par.max_seqid=90; // default for maximum sequence identity threshold + par.qid=0; // default for minimum sequence identity with query + par.qsc=-20.0f; // default for minimum score per column with query + par.coverage=0; // default for minimum coverage threshold + par.Ndiff=100; // pick Ndiff most different sequences from alignment + par.coverage_core=80; // Minimum coverage for sequences in core alignment + par.qsc_core=0.3f; // Minimum score per column of core sequence with query + par.coresc=-20.0f; // Minimum score per column with core alignment (HMM) + + par.M=1; // match state assignment is by A2M/A3M + par.Mgaps=50; // Above this percentage of gaps, columns are assigned to insert states (for par.M=2) + par.calibrate=0; // default: no calibration + par.calm=0; // derive P-values from: 0:query calibration 1:template calibration 2:both + par.mode=0; // + + par.wg=0; // 0: use local sequence weights 1: use local ones + + par.matrix=0; // Subst.matrix 0: Gonnet, 1: HSDM, 2: BLOSUM50 3: BLOSUM62 + par.pcm=2; // pseudocount mode: default=divergence-dependent (but not column-specific) +#if 1 /* Nelder-Meade on Baliscore */ + par.pca=1.712190f; // default values for substitution matrix pseudocounts + par.pcb=1.039640f; // significant reduction of pcs by Neff_M starts around Neff_M-1=pcb + par.pcc=0.878067f; // pcs are reduced prop. to 1/Neff^pcc + par.pcw=0.0f; // wc>0 weighs columns according to their intra-clomun similarity + + par.gapb=1.405220; // default values for transition pseudocounts + par.gapd=1.316760; // gap open penalty pseudocount; 0.25 corresponds to 7.1*gapf bits + par.gape=1.793780; // gap extension penalty pseudocount + par.gapf=1.034710; // factor for increasing gap open penalty for deletes + par.gapg=0.894772; // factor for increasing gap open penalty for inserts + par.gaph=0.544072; // factor for increasing gap extension penalty for deletes + par.gapi=0.862559; // factor for increasing gap extension penalty for inserts +#else /* Soeding's default*/ + par.pca=1.0f; // default values for substitution matrix pseudocounts + par.pcb=1.5f; // significant reduction of pcs by Neff_M starts around Neff_M-1=pcb + par.pcc=1.0f; // pcs are reduced prop. to 1/Neff^pcc + par.pcw=0.0f; // wc>0 weighs columns according to their intra-clomun similarity + + par.gapb=1.0; // default values for transition pseudocounts + par.gapd=0.15; // gap open penalty pseudocount; 0.25 corresponds to 7.1*gapf bits + par.gape=1.0; // gap extension penalty pseudocount + par.gapf=0.6; // factor for increasing gap open penalty for deletes + par.gapg=0.6; // factor for increasing gap open penalty for inserts + par.gaph=0.6; // factor for increasing gap extension penalty for deletes + par.gapi=0.6; // factor for increasing gap extension penalty for inserts +#endif + /* Viterbi parameters optimised on Sabre (R228), FS, r228 -> r229 */ +#if 1 + par.pcaV=1.245150f; // default values for substitution matrix pseudocounts + par.pcbV=1.682110f; // significant reduction of pcs by Neff_M starts around Neff_M-1=pcb + par.pccV=1.483840f; // pcs are reduced prop. to 1/Neff^pcc + par.pcwV=0.0f; // wc>0 weighs columns according to their intra-clomun similarity + + par.gapbV=0.818625; // default values for transition pseudocounts + par.gapdV=0.666110; // gap open penalty pseudocount; 0.25 corresponds to 7.1*gapf bits + par.gapeV=1.028050; // gap extension penalty pseudocount + par.gapfV=0.710760; // factor for increasing gap open penalty for deletes + par.gapgV=1.649800; // factor for increasing gap open penalty for inserts + par.gaphV=0.470604; // factor for increasing gap extension penalty for deletes + par.gapiV=0.829479; // factor for increasing gap extension penalty for inserts +#else /* Soeding default*/ + par.pcaV=1.0f; // default values for substitution matrix pseudocounts + par.pcbV=1.5f; // significant reduction of pcs by Neff_M starts around Neff_M-1=pcb + par.pccV=1.0f; // pcs are reduced prop. to 1/Neff^pcc + par.pcwV=0.0f; // wc>0 weighs columns according to their intra-clomun similarity + + par.gapbV=1.0; // default values for transition pseudocounts + par.gapdV=0.15; // gap open penalty pseudocount; 0.25 corresponds to 7.1*gapf bits + par.gapeV=1.0; // gap extension penalty pseudocount + par.gapfV=0.6; // factor for increasing gap open penalty for deletes + par.gapgV=0.6; // factor for increasing gap open penalty for inserts + par.gaphV=0.6; // factor for increasing gap extension penalty for deletes + par.gapiV=0.6; // factor for increasing gap extension penalty for inserts +#endif + + par.ssm=2; // ss scoring mode: 0:no ss score 1:score after alignment 2:score during alignment + par.ssw=0.11f; // weight of ss scoring + par.ssa=1.0f; // weight of ss evolution matrix + par.shift=-0.01f; // Shift match score up + par.mact=0.3001f; // Score threshold for MAC alignment in local mode (set to 0.5001 to track user modification) + par.corr=0.1f; // Weight of correlations of scores for |i-j|<=4 + par.wstruc=1.0f; // Weight of structure scores + + par.egq=0.0f; // no charge for end gaps as default + par.egt=0.0f; // no charge for end gaps as default + + par.trans=0; // no transitive scoring as default + par.Emax_trans=100.0f; // use intermediate HMMs with E-values up to 100 between query and database HMM + par.Emax_trans=100.0f; // use intermediate HMMs with E-values up to 100 between query and database HMM + par.wtrans=1.0f; // Ztot[k] = Zq[k] + wtrans * (Zforward[k]+Zreverse[k]) + par.ssgap=0; // 1: add secondary structure-dependent gap penalties 0:off + par.ssgapd=1.0f; // secondary structure-dependent gap-opening penalty (per residue) + par.ssgape=0.0f; // secondary structure-dependent gap-extension penalty (per residue) + par.ssgapi=4; // max. number of inside-integer(ii); gap-open-penalty= -ii*ssgapd + + par.loc=1; // local vs. global alignment as default + par.altali=2; // find up to two (possibly overlapping) subalignments + par.forward=0; // 0: Viterbi algorithm; 1: Viterbi+stochastic sampling; 3:Maximum Accuracy (MAC) algorithm + par.realign=1; // realign with MAC algorithm + + par.repmode=0; // repeats score independently of one another + par.columnscore=1; // Default column score is 1: null model pnul = 1/2 * (q_av(a)+p_av(a)) + par.min_overlap=0; // automatic minimum overlap used + par.opt=0; // Default = optimization mode off + par.readdefaultsfile=0; // Default = do not read a defaults file ./.hhdefaults or HOME/.hhdefaults + par.maxdbstrlen=200; // maximum length of database string to be printed in 'Command' line of hhr file + par.mode=0; + par.idummy=par.jdummy=0; // + + par.notags=1; // neutralize His-tags, FLAG-tags, C-myc-tags + + // Initialize strings + strcpy(par.infile,"stdin"); + strcpy(par.outfile,""); + strcpy(par. pairwisealisfile,""); + strcpy(par.buffer,"buffer.txt"); + strcpy(par.scorefile,""); + strcpy(par.wfile,""); + strcpy(par.alnfile,""); + strcpy(par.hhmfile,""); + strcpy(par.psifile,""); + par.exclstr=NULL; + +#if 0 /* read parameter file from home-dir */ +#include "hhutil-C-help.h" +#endif /* read parameter file from home-dir */ + + return; +} /** this is the end of SetDefaults() **/ + +/* + * EOF hhutil-C.h + */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/list-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,600 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: list-C.h 143 2010-10-14 13:11:14Z andreas $ + */ + +// list.C +// Class for double-linked list + + + +#ifndef JLIST +#define JLIST + +#ifndef MAIN +#include <iostream> // cin, cout +#include <stdlib.h> // +#include <stdio.h> // +using std::cout; +using std::cerr; +#endif + +#include "list.h" + +//////////////////////////////////////////////////////////////////////////// +// Double-linked list implementation with head and tail dummy elements +// We set head->prev=head and tail->next=tail. +// This makes sure that repeated current=current->next; ends up in tail +// and repeated current=current->prev; ends up in head. +// head and tail optionally contain a NULL element of Typ defined by method Null(Typ) +//////////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////////// +// Constructors and destructor + +//////////////////////////////////////////////////////////////////////////// +// Creates empty List with two dummy elements +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +List<Typ>::List() +{ + head=new ListEl<Typ>(); + if (!head) { cerr<<"Could not create new element\n"; return; } + tail=new ListEl<Typ>(head,NULL); + if (!tail) { cerr<<"Could not create new element\n"; return; } + tail->next = tail; + head->prev = head; + head->next = tail; + current = head; + size=0; +} + +//////////////////////////////////////////////////////////////////////////// +// Creates List with one element +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +List<Typ>::List(Typ d) +{ + head=new ListEl<Typ>(); + if (!head) { cerr<<"Could not create new element\n"; return; } + tail=new ListEl<Typ>(); + if (!tail) { cerr<<"Could not create new element\n"; return; } + ListEl<Typ>* el = new ListEl<Typ>(d,head,tail); + if (!el) { cerr<<"Could not create new element\n"; return; } + head->prev = head; + head->next = el; + tail->prev = el; + tail->next = tail; + current = head; + size=1; +} + +//////////////////////////////////////////////////////////////////////////// +// Destructor deletes List object +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +List<Typ>::~List() +{ + ListEl<Typ>* n=head->next; + while(head!=n) + { + delete(head); head = NULL; + head=n; + n=head->next; + } + delete(head); head = NULL; +} + +//////////////////////////////////////////////////////////////////////////// +// Flat copy +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +List<Typ>& List<Typ>::operator=(List<Typ>& l) +{ + head = l.head; + tail = l.tail; + current = l.current; + size = l.size; +} + + +//////////////////////////////////////////////////////////////////////////// +// Reverse order of list +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +void List<Typ>::Reverse() +{ + ListEl<Typ> *n; // next list element; also for swapping + ListEl<Typ> *c; // current element to be sorted in. Everything to the left is already sorted + if (Size()<=1) return; + for (c=head; c!=tail; c=n) + { + // Swap prev and next pointers of all list elements + n = c->next; + c->next = c->prev; + c->prev = n; + } + + // Swap prev and next pointers of tail + tail->next = tail->prev; + tail->prev = tail; + + // Swap head an tail + n = head; + head = tail; + tail = n; +} + + + + +//////////////////////////////////////////////////////////////////////////// +// Methods that act at the end of the list + +//////////////////////////////////////////////////////////////////////////// +// Insert Element after LAST of list (and return address of data element) +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +Typ* List<Typ>::Push(Typ d) +{ + ListEl<Typ>* t=new ListEl<Typ>(d,tail->prev,tail); + if (!t) { cerr<<"Could not create new element\n"; return 0; } + tail->prev->next=t; + tail->prev = t; + size++; + return &(t->data); +} + +//////////////////////////////////////////////////////////////////////////// +// Remove and return LAST element of list. Returns head->data if empty +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +Typ List<Typ>::Pop() +{ + if (!size) return head->data; + ListEl<Typ>* t=tail->prev; + if (current==t) current=tail; + Typ d=t->data; + t->prev->next=tail; + tail->prev=t->prev; + delete t; t = NULL; + size--; + return d; +} + + + +//////////////////////////////////////////////////////////////////////////// +// Methods that act at the beginning of the list + +//////////////////////////////////////////////////////////////////////////// +// Insert element as FIRST element of list (and return address of data element) +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +Typ* List<Typ>::Enqueue(Typ d) +{ + ListEl<Typ>* h = new ListEl<Typ>(d,head,head->next); + if (!h) { cerr<<"Could not create new element\n"; return 0; } + h->next->prev = h; + head->next=h; + size++; + return &(h->data); +} + +//////////////////////////////////////////////////////////////////////////// +// Remove element at BEGINNING of list +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +Typ List<Typ>::Dequeue() +{ + if (!size) return head->data; + ListEl<Typ>* h=head->next; + if (current==h) current=head; + Typ d=h->data; + h->next->prev=head; + head->next=h->next; + delete h; h = NULL; + size--; + return d; +} + +//////////////////////////////////////////////////////////////////////////// +// Methods that work with 'current' position in the list + +//////////////////////////////////////////////////////////////////////////// +// Reads next element; advances current position by 1 +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +inline Typ List<Typ>::ReadNext() +{ + current = current->next; + return current->data; +} + +//////////////////////////////////////////////////////////////////////////// +// Reads current element again (NULL if nothing read yet) +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +inline Typ List<Typ>::ReadCurrent() +{ + return current->data; +} + +//////////////////////////////////////////////////////////////////////////// +// Reads previous element; moves current position back by 1 +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +inline Typ List<Typ>::ReadPrevious() +{ + current = current->prev; + return current->data; +} + +//////////////////////////////////////////////////////////////////////////// +// Reads next element; advances current position by 1 +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +inline Typ* List<Typ>::ReadNextAddress() +{ + current = current->next; + if (current==tail) return NULL; + return &(current->data); +} + +//////////////////////////////////////////////////////////////////////////// +// Reads address of current element again, returns NULL if at end of list +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +inline Typ* List<Typ>::ReadCurrentAddress() +{ + if (current==tail) return NULL; + return &(current->data); +} + +//////////////////////////////////////////////////////////////////////////// +// Sets current position to k and reads k'th element (first=1) +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +Typ List<Typ>::Read(int pos) +{ + if (pos>size) {current = tail; return tail->data;} + if (pos<=0) {current = head; return head->data;} + current = head->next; + for (; pos>1; pos--) current = current->next; //If pos==2 do 1 iteration + return current->data; +} + +//////////////////////////////////////////////////////////////////////////// +// Inserts element d AFTER current element and sets current element to inserted +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +void List<Typ>::Insert(Typ d) +{ + ListEl<Typ>* el = new ListEl<Typ>(d,current,current->next); + if (!el) { cerr<<"Could not create new element\n"; return; } + (current->next)->prev = el; + current->next = el; + current=el; + size++; +} + +//////////////////////////////////////////////////////////////////////////// +// Deletes current element and returns content of deleted element. Current element +// will be previous one after Delete(). After Reset() delete first element (not 0'th) +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +Typ List<Typ>::Delete() +{ + Typ d; + ListEl<Typ>* p; + if (!size || current==tail) return tail->data; + if (current==head) current = head->next; // After Reset() delete first element (not 0'th) + (current->prev)->next = current->next; + (current->next)->prev = current->prev; + d = current->data; + p = current->prev; + delete current; current = NULL; + current = p; + size--; + return d; +} + +//////////////////////////////////////////////////////////////////////////// +// Methods that return useful information about the list + +//////////////////////////////////////////////////////////////////////////// +// Get current position within list (0 <= pos <= Size+1) +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +int List<Typ>::GetPos() +{ + int pos=0; + ListEl<Typ>* el; + for (el = head; el!=current; el=el->next) pos++; + return pos; +} + +//////////////////////////////////////////////////////////////////////////// +//print out list +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +void List<Typ>::PrintList() +{ + int j=0; + ListEl<Typ>* c=current; + Reset(); + printf("List: "); + while (!End()) + { + j++; + cout<<j<<" "<<ReadNext()<<" "; + if (!(j%10)) cout<<"\n "; + } + cout<<"\n"; + current=c; +} + +//////////////////////////////////////////////////////////////////////////// +// Get largest data element +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +Typ List<Typ>::Largest() +{ + Typ* result= &((tail->prev)->data); + Reset(); + while (!End()) + { + if (*result<ReadNext()) result=ReadCurrentAddress(); + } + return *result; +} + +//////////////////////////////////////////////////////////////////////////// +// Get smallest data element +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +Typ List<Typ>::Smallest() +{ + Typ* result= &((tail->prev)->data); + Reset(); + while (!End()) + { + if (ReadNext()<*result) result=ReadCurrentAddress(); + } + return *result; +} + +///////////////////////////////////////////////////////////////////////////// +// Methods that manipulate the list as a whole + +//////////////////////////////////////////////////////////////////////////// +// Copies list 0 into list object +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +void List<Typ>::Copy(List<Typ>* list) +{ + if (list==this) return; + while (!End()) Pop(); //empty list + list->Reset(); + while (!list->End()) Push(list->ReadNext()); +} + +//////////////////////////////////////////////////////////////////////////// +// Appends a copy of list2 to class object +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +void List<Typ>::AppendCopy(List<Typ>* list2) +{ + List<Typ>* cpy=new List<Typ>; + cpy->Copy(list2); + Append(cpy); + delete cpy; cpy = NULL; +} + +//////////////////////////////////////////////////////////////////////////// +// Appends list2 to class object +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +void List<Typ>::Append(List<Typ>* list) +{ + if (this==list) { AppendCopy(list); return;} + (tail->prev)->next = list->head->next; + (list->head->next)->prev = tail->prev; + if (current==tail) current=tail->prev; + ListEl<Typ>* t=tail; + tail = list->tail; + size += list->size; + +// Reuse old tail as new tail t for list2 and initialize pointers for empty list + list->tail=t; + list->head->next=t; + t->prev=list->head; + t->next=t; + list->head->prev=list->head; + t->data=list->head->data; + list->current=list->head; + list->size = 0; +} + +//////////////////////////////////////////////////////////////////////////// +// Use QUICKSORT to sort list in ascending order between two list elements +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +void List<Typ>::SortList(ListEl<Typ>* left, ListEl<Typ>* right, int sz) +{ + if (sz<=1) return; // when SortList() is called, left=head->next, right=tail->prev + ListEl<Typ> *l=left->prev, *r=right->next; + + // Choose *random* pivot element!! + // (Otherwise, complexity for an already sorted list is N^2 => recursive calls may lead to stack overflow) + ListEl<Typ> *c=left; + for (int i=1; i<(int)(float(rand())*sz/(RAND_MAX+0.999)); i++) c = c->next; + SwapContent(left,c); + + Typ pivot = left->data; +// Typ* pivot= &(left->data); + int sz0=sz+1; + // cout<<"Sorting between "<<left->data<<" and "<<right->data<<". Pivot="<<pivot<<endl; + while(1) + { +// PrintList(); + do {r=r->prev; sz0--;} while (pivot < r->data); + do l=l->next; while (l->data < pivot); + if (l==r || l->prev==r) break; + SwapContent(l,r); + } + SortList(left,r,sz0); + SortList(r->next,right,sz-sz0); + pivot = tail->data; // to avoid calling the destructor of Typ on some real data element + } + +//////////////////////////////////////////////////////////////////////////// +// Use QUICKSORT to sort list of POINTERS by comparing the objects the pointers point to +//////////////////////////////////////////////////////////////////////////// +template <class Typ> +void List<Typ>::SortPointerList(ListEl<Typ>* left, ListEl<Typ>* right) +{ + if (right==left || right->next==left) return; + ListEl<Typ> *l=left->prev, *r=right->next; + Typ pivot=left->data; +// cout<<"Sorting between "<<left->data<<" and "<<right->data<<". Pivot="<<pivot<<endl; + while(1) + { +// PrintList(); + do + { + r=r->prev; +// cout<<"r=r->prev. r->data="<<r->data<<endl; + } while(*pivot < *(r->data)); + do + { + l=l->next; +// cout<<"l=l->next l->data="<<l->data<<endl; + } while (*(l->data) < *pivot); + if (l==r || l->prev==r) break; + SwapContent(l,r); + } + SortPointerList(left,r); + SortPointerList(r->next,right); +} + +// Use INSERTSORT to sort list in asscending order between two list elements. Use only for presorted lists, otherwise time O(N^2)! +template <class Typ> +void List<Typ>::ResortList() +{ + ListEl<Typ> *c; // current element to be sorted in. Everything to the left is already sorted + ListEl<Typ> *n; // next element to be sorted in + ListEl<Typ> *p; // pointer for looping through sorted part of list + ListEl<Typ> *pnext; // for swapping + if (Size()<=1) return; + c=head->next->next; + while (c!=tail) + { + p=c->prev; + n=c->next; + if (c->data < p->data) + { + do {p=p->prev;} while (p!=head && c->data < p->data); + // Connect c->prev to c->next ... + c->next->prev=c->prev; + c->prev->next=c->next; + // ... and insert c between p and p->next ... + pnext=p->next; + p->next=c; + c->next=pnext; + pnext->prev=c; + c->prev=p; + } + c=n; + } +} + + +#endif /* JLIST */ + + +// //Main program: test class List + +// int main() +// { +// int p; +// List<int>* plist=new List<int>(11); +// List<int> list(22); + +// plist->Push(24); +// plist->Push(18); +// plist->Push(3); +// plist->Enqueue(17); +// plist->Enqueue(29); +// printf("List 1 with pushed and enqueued elements:\n"); +// plist->PrintList(); + +// list.Push(222); +// printf("List 1 with list 2 appended:\n"); +// plist->Append(&list); +// plist->PrintList(); + +// printf("Pushing one element three times into list 2:\n"); +// list.Push(333); +// list.Push(444); +// list.Push(555); +// printf("Printing plist and list with three elements:\n"); +// list.PrintList(); +// plist->PrintList(); + +// printf("list.Copy(plist). Printing list 1 and 2:\n"); +// list.Copy(plist); +// plist->PrintList(); +// list.PrintList(); + +// printf("Appending list 1 to itself:\n"); +// plist->Append(plist); +// plist->PrintList(); + +// cout<<"Popping "<<plist->Pop()<<"\n"; +// cout<<"Popping "<<plist->Pop()<<"\n"; +// plist->PrintList(); + +// cout<<"Dequeing "<<plist->Dequeue()<<"\n"; +// cout<<"Dequeing "<<plist->Dequeue()<<"\n"; +// plist->PrintList(); + +// cout<<"Reversing list\n"; +// plist->Reverse(); +// plist->PrintList(); + +// cout<<"Reversing to original list\n"; +// plist->Reverse(); +// plist->PrintList(); + +// for (p=plist->Reset(); p>=5;p--) +// {cout<<plist->GetPos()<<": "<<plist->Read(p)<<"\n";} + +// cout<<"Deleting "<<plist->Delete()<<"\n"; +// cout<<"Deleting "<<plist->Delete()<<"\n"; +// plist->PrintList(); + +// plist->Append(plist); +// plist->PrintList(); +// cout<<"List 1 sorted:\n"; +// plist->SortList(); +// plist->PrintList(); + +// }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/list.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,193 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: list.h 143 2010-10-14 13:11:14Z andreas $ + */ + +// list.h + + +////////////////////////////////////////////////////////////////////////////// +// Double-linked list implementation with head and tail dummy elements +// We set head->prev=head and tail->next=tail. +// This makes sure that repeated current=current->next; ends up in tail +// and repeated current=current->prev; ends up in head. +// head and tail optionally contain a NULL element of Typ defined by method Null(Typ) +////////////////////////////////////////////////////////////////////////////// + +template<class Typ> +class List +{ +protected: +template<class Typ1> +class ListEl //elements of List; essentially a data structure + { + public: + Typ1 data; //Typ is type of data to be stored in list + ListEl* prev; //points to previous list element + ListEl* next; //points to next list element + ListEl() : prev(0), next(0) {} + ListEl(Typ1 d) : data(d), prev(0), next(0) {} + ListEl(ListEl* p, ListEl* n) : prev(p), next(n) {} + ListEl(Typ1 d, ListEl* p, ListEl* n) : data(d), prev(p), next(n) {} + }; + + ListEl<Typ>* head; //points to dummy element at beginning of list + ListEl<Typ>* tail; //points to dummy element at end of list + ListEl<Typ>* current; //current element position within list + int size; //Number of elements in list + + // Use QUICKSORT to sort list in asscending order between two list elements + void SortList(ListEl<Typ>*, ListEl<Typ>*, int); + // Use QUICKSORT to sort list of pointers by comparing elements they point to + void SortPointerList(ListEl<Typ>*, ListEl<Typ>*); + + // Swap two list elements by making a flat copy (don't need two copies of data) + // Warning: Gets slow if Typ is composite type with many variables (>=5) + void SwapContent(ListEl<Typ>* e1, ListEl<Typ>* e2) + { Typ d; if (e1!=e2) {d=e1->data; e1->data=e2->data; e2->data=d;} } + +public: +////////////////////////////////////////////////////////////////////////////// +// General methods + List(); + List(Typ d); + ~List(); + List<Typ>& operator=(List<Typ>&); + + // Set Null element that will be returned when trying to read from an empty list + void Null(Typ null) {head->data = tail->data = null;} + + +////////////////////////////////////////////////////////////////////////////// +// Methods that act at the end of the list + + // Insert Element after LAST element of list (and return address of data element) + Typ* Push(Typ); + + // Remove and return LAST element of list. Returns head->data if list empty + Typ Pop(); + + // return LAST element of list. Returns null element in head->data if list empty + Typ ReadLast() {return tail->prev->data;} + + +////////////////////////////////////////////////////////////////////////////// +// Methods that act at the beginning of the list + + // Insert element as FIRST element of list (and return address of data element) + Typ* Enqueue(Typ); + + // Remove and return element at BEGINNING of list. Returns head->data if list empty + Typ Dequeue(); + + // return FIRST element of list. Returns null element in head->data if list empty + Typ ReadFirst() {if (size) return head->next->data; else return head->data;} + + +////////////////////////////////////////////////////////////////////////////// +// Methods that work with 'current' position in the list + + // Advances current position by 1 and reads next element; returns head->data if at end of list. + Typ ReadNext(); + + // Reads current element again + Typ ReadCurrent(); + + // Moves current position back by 1 and reads previous element; returns head->data if at beginning of list. + Typ ReadPrevious(); + + // Advances current position by 1 and reads address of next element; returns NULL if at end of list. + Typ* ReadNextAddress(); + + // Reads address of current element again, returns NULL if at end of list + Typ* ReadCurrentAddress(); + + // Sets current position to k and reads k'th element (first=1). Returns head->data if current points to no data element + Typ Read(int); + + // Inserts element AFTER CURRENT element; current element will be set to inserted element + void Insert(Typ); + + // Removes and returns element at CURRENT position. New position is one BEFORE current position. + // Returns head->data if current points to no data element. After Reset() delete first element (not 0'th) + Typ Delete(); + + // Overwrites data at current position with new data + void Overwrite(Typ d) {current->data=d;} + + // Reset current position to 0 (one BEFORE the first) + int Reset() {current = head; return size;} + + // Reset current position to End (one AFTER the last) + int SetToEnd() {current = tail; return size;} + + +////////////////////////////////////////////////////////////////////////////// +// Methods that return information about the list + + // Return number of list elements (size>=0) + int Size() {return size;} + + // return true if end of list, i.e. ReadNext would give tail->data (i.e. current position >= Size) + char End() {return (current==tail || current==tail->prev);} + char End(void* curr) {return ( curr == tail || curr == tail->prev);} + + // return true if start of list, i.e. ReadPrevious would give head->data (i.e. current position <=1) + char Start() {return (current==head || current==head->next);} + + // Get current position within list (0 <= pos <= Size+1) + int GetPos(); + + //print out list (elements assumed int) + void PrintList(); + + // Get largest data element (Null element for empty list) + Typ Largest(); + + // Get smallest data element (Null element for empty list) + Typ Smallest(); + +////////////////////////////////////////////////////////////////////////////// +// Methods that manipulate the list as a whole + + // Reverse list + void Reverse(); + + // Copies list into list object + void Copy(List<Typ>* list); + + // Appends a copy of list to class object + void AppendCopy(List<Typ>* list); + + // Appends list to class object list + void Append(List<Typ>* list); + + // Use QUICKSORT to sort list in ascending order. Use only for UNSORTED lists, otherwise time O(N^2) instead of O(N*log(N)) +/* void SortList() {if (size>1) SortList(head->next, tail->prev);} */ + void SortList() {if (size>1) SortList(head->next, tail->prev, size);} + void QuickSort() {if (size>1) SortList(head->next, tail->prev, size);} + + // Use QUICKSORT to sort list of pointers in ascending order. Use only for UNSORTED lists, otherwwise time O(N^2)! + void SortPointerList() {if (size>1) SortPointerList(head->next, tail->prev);} + void QuickSortPointer() {if (size>1) SortPointerList(head->next, tail->prev);} + + // Use INSERTSORT to sort list in asscending order. Use only for PRESORTED lists, otherwise time O(N^2)! + void ResortList(); +}; + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/hhalign/util-C.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,879 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: util-C.h 155 2010-11-17 12:18:47Z fabian $ + */ + +// Utility subroutines + + +#ifndef MAIN +#include <iostream> // cin, cout, cerr +#include <fstream> // ofstream, ifstream +#include <cstdio> // printf +#include <stdlib.h> // exit +#include <time.h> // clock +#endif +#include <sys/time.h> + +///////////////////////////////////////////////////////////////////////////////////// +// Arithmetics +///////////////////////////////////////////////////////////////////////////////////// + +//// max and min +inline double dmax(double x, double y) { return (x>y? x : y);} +inline double dmin(double x, double y) { return (x<y? x : y);} +inline int imax(int x, int y) { return (x>y? x : y);} +inline int imin(int x, int y) { return (x<y? x : y);} +inline int iabs(int x) { return (x>=0? x : -x);} + +// Rounding up, rounding down and rounding to nearest integer +inline int iceil(double x) {return int(ceil(x));} +inline int ifloor(double x) {return int(floor(x));} +inline int iround(double x) {return int(floor(x+0.5));} + +//// Generalized mean: d=0: sqrt(x*y) d=1: (x+y)/2 d->-inf: min(x,y) d->+inf: max(x,y) +inline double fmean(double x, double y, double d) { return pow( (pow(x,d)+pow(y,d))/2 ,1./d);} + +// log base 2 +inline float log2(float x) {return (x<=0? (float)(-100000):1.442695041*log(x));} +inline float log10(float x) {return (x<=0? (float)(-100000):0.434294481*log(x));} + + +///////////////////////////////////////////////////////////////////////////////////// +// fast log base 2 +///////////////////////////////////////////////////////////////////////////////////// + +// This function returns log2 with a max abolute deviation of +/- 1.5E-5 (typically 0.8E-5). +// It takes 1.42E-8 s whereas log2(x) takes 9.5E-7 s. It is hence 9.4 times faster. +// It makes use of the representation of 4-byte floating point numbers: +// seee eeee emmm mmmm mmmm mmmm mmmm mmmm +// s is the sign, +// the following 8 bits, eee eee e, give the exponent + 127 (in hex: 0x7f). +// The following 23 bits, m, give the mantisse, the binary digits behind the decimal point. +// In summary: x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeee-127) +// The expression (((*(int *)&x) & 0x7f800000 ) >>23 )-0x7f is the exponent eeeeeeee, i.e. +// the largest integer that is smaller than log2(x) (e.g. -1 for 0.9). *(int *)&x is an integer which +// contains the bytes as the floating point variable x is represented in memory. +// Check: assert( sizeof(f) == sizeof(int) ); +// Check: assert( sizeof(f) == 4 ); +inline float fast_log2(float x) +{ + static float lg2[1025]; // lg2[i] = log2[1+x/1024] + static float diff[1025]; // diff[i]= (lg2[i+1]-lg2[i])/8096 (for interpolation) + static char initialized; + if (x<=0) return -100000; + if (!initialized) //First fill in the arrays lg2[i] and diff[i] + { + float prev = 0.0f; + lg2[0] = 0.0f; + for (int i=1; i<=1024; ++i) + { + lg2[i] = log(float(1024+i))*1.442695041-10.0f; + diff[i-1] = (lg2[i]-prev)*1.2352E-4; + prev = lg2[i]; + } + initialized=1; + } + int a = (((*((int *)&x)) & 0x7F800000) >>23 )-0x7f; + int b = ((*((int *)&x)) & 0x007FE000) >>13; + int c = ((*((int *)&x)) & 0x00001FFF); + return a + lg2[b] + diff[b]*(float)(c); +} + +///////////////////////////////////////////////////////////////////////////////////// +// fast 2^x +// ATTENTION: need to compile with g++ -fno-strict-aliasing when using -O2 or -O3!!! +// Relative deviation < 1.5E-4 +///////////////////////////////////////////////////////////////////////////////////// +inline float fpow2(float x) +{ + if (x>=128) return FLT_MAX; + if (x<=-128) return FLT_MIN; + int *px = (int*)(&x); // store address of float as pointer to long + float tx = (x-0.5f) + (3<<22); // temporary value for truncation: x-0.5 is added to a large integer (3<<22) + int lx = *((int*)&tx) - 0x4b400000; // integer value of x + float dx = x-(float)(lx); // float remainder of x + x = 1.0f + dx*(0.6960656421638072f // cubic apporoximation of 2^x + + dx*(0.224494337302845f // for x in the range [0, 1] + + dx*(0.07944023841053369f))); + *px += (lx<<23); // add integer power of 2 to exponent + return x; +} + +///////////////////////////////////////////////////////////////////////////////////// +// ATTENTION: +// Can't be used with -O2/-O3 optimization on some compilers ! +// Works with g++ version 4.1, but not with 3.4, in which case it returns values +// that are a factor 1.002179942 too low +// +// Fast pow2 routine (Johannes Soeding) +// Same speed as fpow2(), but *relative* deviation < 1.2E-7 +// Makes use of the binary representation of floats in memory: +// x = (-1)^s * 1.mmmmmmmmmmmmmmmmmmmmmm * 2^(eeeeeee-127) +// is represented as +// 31 23 7654 3210 +// seee eeee emmm mmmm mmmm mmmm mmmm mmmm +// s is the sign, the 8 bits eee eee e are the exponent + 127 (in hex: 0x7f), +// and the following 23 bits m give the mantisse. +// We decompose the argument x = a + b, with integer a and 0 <= b < 1 +// Therefore 2^x = 2^a * 2^b where a is the binary exponent of 2^x +// and 1 <= 2^b < 2, i.e. 2^b determines the mantisse uniquely. +// To calculate 2^b, we split b into the first 10 bits and the last 13 bits, +// b = b' + c, and then look up the mantisse of 2^b' in a precomputed table. +// We use the residual c to interpolate between the mantisse for 2^b' and 2(b'+1/1024) +///////////////////////////////////////////////////////////////////////////////////// +inline float fast_pow2(float x) +{ + if (x<=-127) return 5.9E-39; + if (x>=128) return 3.4E38; + static char initialized=0; + static unsigned int pow2[1025]; + static unsigned int diff[1025]; + static int y = 0; + if (!initialized) //First fill in the pow2-vector + { + float f; + unsigned int prev = 0; + pow2[0] = 0; + for (int b=1; b<1024; b++) + { + f=pow(2.0,float(b)/1024.0); + pow2[b]=(*((unsigned int *)(&f)) & 0x7FFFFF); // store the mantisse of 2^(1+b/1024) + diff[b-1]=pow2[b]-prev; + prev=pow2[b]; + } + pow2[1024]=0x7FFFFF; + diff[1023]=pow2[1024]-prev; + initialized=1; + } + + int *px = (int *)(&x); // store address of float as pointer to int + int E = ((*px & 0x7F800000)>>23)-127; // E is exponent of x and is <=6 + unsigned int M=(*px & 0x007FFFFF) | 0x00800000; // M is the mantisse 1.mmm mmmm mmmm mmmm mmmm mmmm + int a,b,c; + if (x>=0) + { + if (E>=0) { + a = 0x3F800000 + ((M<<E) & 0x7F800000); // a is exponent of 2^x, beginning at bit 23 + b = ((M<<E) & 0x007FE000)>>13; + c = ((M<<E) & 0x00001FFF); + } else { + a = 0x3F800000; // a = exponent of 2^x = 0 + b = ((M>>(-E)) & 0x007FE000)>>13; + c = ((M>>(-E)) & 0x00001FFF); + } + } + else + { + if (E>=0) { + a = 0x3F000000 - ((M<<E) & 0x7F800000); // a is exponent of 2^x + b = (0x00800000-(int)((M<<E) & 0x007FFFFF)) >>13; + c = (0x00800000-(int)((M<<E) & 0x007FFFFF)) & 0x00001FFF; + } else { + a = 0x3F000000; // a = exponent of 2^x = -1 + b = (0x00800000-(int)((M>>(-E)) & 0x007FFFFF)) >>13; + c = (0x00800000-(int)((M>>(-E)) & 0x007FFFFF)) & 0x00001FFF; + } + } +/* printf("x=%0X\n",*px); */ +/* printf("E=%0X\n",E); */ +/* printf("M=%0X\n",M); */ +/* printf("a=%0X\n",a); */ +/* printf("b=%0X\n",b); */ + y = a | (pow2[b] + ((diff[b]*c)>>13) ); + /* printf("2^x=%0X\n",*px); */ + return *((float*)&y); +} + + + +// Normalize a float array such that it sums to one +// If it sums to 0 then assign def_array elements to array (optional) +inline float NormalizeTo1(float* array, int length, float* def_array=NULL) +{ + float sum=0.0f; + int k; + for (k=0; k<length; k++) sum+=array[k]; + if (sum!=0.0f) + { + float fac=1.0/sum; + for (k=0; k<length; k++) array[k]*=fac; + } + else if (def_array) + for (k=0; k<length; k++) array[k]=def_array[k]; + return sum; +} + +// Normalize a float array such that it sums to x +// If it sums to 0 then assign def_array elements to array (optional) +inline float NormalizeToX(float* array, int length, float x, float* def_array=NULL) +{ + float sum=0.0; + int k; + for (k=0; k<length; k++) sum+=array[k]; + if (sum) + { + float fac=x/sum; + for (k=0; k<length; k++) array[k]*=fac; + } + else if (def_array) + for (k=0; k<length; k++) array[k]=def_array[k]; + return sum; +} + +///////////////////////////////////////////////////////////////////////////////////// +// Similar to spintf("%*g,w,val), but displays maximum number of digits within width w +///////////////////////////////////////////////////////////////////////////////////// +inline char* sprintg(float val, int w) +{ + static char str[100]; + float log10val = log10(fabs(val)); + int neg = (val<0? 1: 0); + if (log10val >= w-neg-1 || -log10val > 3) + { + // positive exponential 1.234E+06 + // negative exponential 1.234E-06 + int d = w-6-neg; + sprintf(str,"%*.*e",w,d<1?1:d,val); + } + else + { + int d = log10val>0? w-2-neg-int(log10val): w-2-neg; + sprintf(str,"%#*.*f",w,d,val); + } + return str; +} + +///////////////////////////////////////////////////////////////////////////////////// +// String utilities +///////////////////////////////////////////////////////////////////////////////////// + +//the integer. If no integer is found, returns INT_MIN and sets ptr to NULL /* MR1 */ +inline int strtoi(const char*& ptr) +{ + int i; + const char* ptr0=ptr; + if (!ptr) return INT_MIN; + while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9')) ptr++; + if (*ptr=='\0') { + ptr=0; + return INT_MIN; + } + if (*(ptr-1)=='-' && ptr>ptr0) i=-atoi(ptr); else i=atoi(ptr); + while (*ptr>='0' && *ptr<='9') ptr++; + return i; +} + + +//Same as strint, but interpretes '*' as default /* MR1 */ +inline int strtoi_(const char*& ptr, int deflt=INT_MAX) +{ + int i; + if (!ptr) return INT_MIN; + while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9') && *ptr!='*') ptr++; + if (*ptr=='\0') { + ptr=0; + return INT_MIN; + } + if (*ptr=='*') { + ptr++; + return deflt; + } + if (*(ptr-1)=='-') i=atoi(ptr-1); + else i=atoi(ptr); + while (*ptr>='0' && *ptr<='9') ptr++; + return i; +} + + +// Returns leftmost integer in ptr and sets the pointer to first char after +// the integer. If no integer is found, returns INT_MIN and sets pt to NULL +int strint(char*& ptr) +{ + int i; + char* ptr0=ptr; + if (!ptr) return INT_MIN; + while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9')) ptr++; + if (*ptr=='\0') + { + ptr=0; + return INT_MIN; + } + if (*(ptr-1)=='-' && ptr>ptr0) i=-atoi(ptr); else i=atoi(ptr); + while (*ptr>='0' && *ptr<='9') ptr++; + return i; +} + +// Same as strint, but interpretes '*' as default +int strinta(char*& ptr, int deflt=99999) +{ + int i; + if (!ptr) return INT_MIN; + while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9') && *ptr!='*') ptr++; + if (*ptr=='\0') + { + ptr=0; + return INT_MIN; + } + if (*ptr=='*') + { + ptr++; + return deflt; + } + if (*(ptr-1)=='-') i=atoi(ptr-1); + else i=atoi(ptr); + while (*ptr>='0' && *ptr<='9') ptr++; + return i; +} + +// Returns leftmost float in ptr and sets the pointer to first char after +// the float. If no float is found, returns FLT_MIN and sets pt to NULL /* MR1 */ +float strflt(char*& ptr) +{ + float i; + char* ptr0=ptr; + if (!ptr) return FLT_MIN; + while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9')) ptr++; + if (*ptr=='\0') + { + ptr=0; + return FLT_MIN; + } + if (ptr>ptr0 && *(ptr-1)=='-') i=-atof(ptr); else i=atof(ptr); + while ((*ptr>='0' && *ptr<='9') || *ptr=='.') ptr++; + return i; +} + +// Same as strint, but interpretes '*' as default /* MR1 */ +float strflta(char*& ptr, float deflt=99999) +{ + float i; + if (!ptr) return FLT_MIN; + while (*ptr!='\0' && !(*ptr>='0' && *ptr<='9') && *ptr!='*') ptr++; + if (*ptr=='\0') + { + ptr=0; + return FLT_MIN; + } + if (*ptr=='*') + { + ptr++; + return deflt; + } + if (*(ptr-1)=='-') i=-atof(ptr); + else i=atof(ptr); + while ((*ptr>='0' && *ptr<='9') || *ptr=='.') ptr++; + return i; +} + + +// Removes the newline and other control characters at the end of a string (if present) +// and returns the new length of the string (-1 if str is NULL) +inline int chomp(char str[]) +{ + if (!str) return -1; + int l=0; + for (l=strlen(str)-1; l>=0 && str[l]<32; l--); + str[++l]='\0'; + return l; +} + +// Emulates the ifstream::getline method; similar to fgets(str,maxlen,FILE*), +// but removes the newline at the end and returns NULL if at end of file or read error +inline char* fgetline(char str[], const int maxlen, FILE* file) +{ + if (!fgets(str,maxlen,file)) return NULL; + if (chomp(str)+1>=maxlen) // if line is cut after maxlen characters... + while (fgetc(file)!='\n'); // ... read in rest of line + return(str); +} + +// copies substring str[a,b] into substr and returns substr +char *substr(char* substr, char* str, int a, int b) +{ + if (b<a) {int i=b; b=a; a=i;} + if (b-a>1000) + {printf("Function substr: >1000 chars to copy. Exiting.\n"); exit(6);} + char* dest=substr; + char* source=str+a; + char* send=str+b; + while (*source!='\0' && source<=send) *(dest++) = *(source++); + *dest='\0'; + return substr; +} + + +// Returns pointer to first non-white-space character in str OR to NULL if none found +inline char* strscn(char* str) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr<=32) ptr++; + return (*ptr=='\0')? NULL: ptr; +} + +// Returns pointer to first white-space character in str OR to NULL if none found /* MR1 */ +inline char* strscn_ws(char* str) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr>32) ptr++; + return (*ptr=='\0')? NULL: ptr; +} + +//Returns pointer to first non-white-space character in str OR to NULL if none found /* MR1 */ +inline const char* strscn_c(const char* str) +{ + if (!str) return NULL; + const char* ptr=str; + while (*ptr!='\0' && isspace(*ptr)) ptr++; + return (*ptr=='\0') ? NULL : ptr; +} + +// Returns pointer to first non-white-space character in str OR to end of string '\0' if none found +inline char* strscn_(char* str) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr<=32) ptr++; + return ptr; +} + +// Returns pointer to first non-c character in str OR to NULL if none found +inline char* strscn(char* str, const char c) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr==c) ptr++; + return (*ptr=='\0')? NULL: ptr; +} + +// Returns pointer to first non-c character in str OR to end of string '\0' if none found +inline char* strscn_(char* str, const char c) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr==c) ptr++; + return ptr; +} + +// Cuts string at first white space character found by overwriting it with '\0'. +// Returns pointer to next non-white-space char OR to NULL if no such char found +inline char* strcut(char* str) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr>32) ptr++; + if (*ptr=='\0') return NULL; + *ptr='\0'; + ptr++; + while (*ptr!='\0' && *ptr<=32) ptr++; + return (*ptr=='\0')? NULL:ptr; +} + +// Cuts string at first white space character found by overwriting it with '\0'. +// Returns pointer to next non-white-space char OR to end of string '\0' if none found +inline char* strcut_(char* str) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr>32) ptr++; + if (*ptr=='\0') return ptr; + *ptr='\0'; + ptr++; + while (*ptr!='\0' && *ptr<=32) ptr++; + return ptr; +} + +// Cuts string at first occurence of charcter c, by overwriting it with '\0'. +// Returns pointer to next char not equal c, OR to NULL if none found +inline char* strcut(char* str, const char c) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr!=c) ptr++; + if (*ptr=='\0') return NULL; + *ptr='\0'; + ptr++; + while (*ptr!='\0' && *ptr==c) ptr++; + return (*ptr=='\0')? NULL:ptr; +} + +// Cuts string at first occurence of charcter c, by overwriting it with '\0'. +// Returns pointer to next char not equal c, OR to end of string '\0' if none found +inline char* strcut_(char* str, const char c) +{ + if (!str) return NULL; + char* ptr=str; + while (*ptr!='\0' && *ptr!=c) ptr++; + if (*ptr=='\0') return ptr; + *ptr='\0'; + ptr++; + while (*ptr!='\0' && *ptr==c) ptr++; + return ptr; +} + +// Cuts string at first occurence of substr, by overwriting the first letter with '\0'. +// Returns pointer to next char after occurence of substr, OR to NULL if no such char found +inline char* strcut(char* str, const char* substr) +{ + char* ptr; //present location in str being compared to substr + const char* sptr=substr; //present location in substr being compared to substr + // while not at end of str and not all of substr is matched yet + while (1) + { + for (ptr=str, sptr=substr; *ptr==*sptr && *ptr!='\0'; ptr++, sptr++) ; + if (*sptr=='\0') {*str='\0'; return ptr;} + if (*ptr=='\0') return NULL; + str++; + } +} + +// Cuts string at first occurence of substr, by overwriting the first letter with '\0'. +// Returns pointer to next char after occurence of substr, OR to end of string '\0' if no such char found +inline char* strcut_(char* str, const char* substr) +{ + char* ptr; //present location in str being compared to substr + const char* sptr=substr; //present location in substr being compared to str + // while not at end of str and not all of substr is matched yet + while (1) + { + for (ptr=str, sptr=substr; *ptr==*sptr && *ptr!='\0'; ptr++, sptr++) ; + if (*sptr=='\0') {*str='\0'; return ptr;} + if (*ptr=='\0') return ptr; + str++; + } +} + +// Copies first word in ptr to str. In other words, copies first block of non whitespace characters, +// beginning at ptr, to str. If a word is found, returns address of second word in ptr or, if no second +// word is found, returns address to end of word ('\0' character) in ptr string. If no word is found +// in ptr NULL is returned. +inline char* strwrd(char* str, char* ptr) +{ + ptr=strscn(ptr); // advance to beginning of next word + if (ptr) + { + while (*ptr!='\0' && *ptr>32) *(str++) = *(ptr++); + *str='\0'; + while (*ptr!='\0' && *ptr<=32) ptr++; + return ptr; + } + else return NULL; +} + +// Copies first word ***delimited by char c*** in ptr to str. In other words, copies first block of non-c characters, +// beginning at ptr, to str. If a word is found, returns address of second word in ptr or, if no second +// word is found, returns address to end of word ('\0' character) in ptr string. If no word is found +// in ptr NULL is returned. +inline char* strwrd(char* str, char* ptr, const char c) +{ + ptr=strscn(ptr,c); // advance to beginning of next word + if (ptr) + { + while (*ptr!='\0' && *ptr!=c) *(str++) = *(ptr++); + *str='\0'; + while (*ptr!='\0' && *ptr==c) ptr++; + return ptr; + } + else return NULL; +} + +// Similar to Perl's tr/abc/ABC/: Replaces all chars in str found in one list with characters from the second list +// Returns the number of replaced charactrs +int strtr(char* str, const char oldchars[], const char newchars[]) +{ + char* ptr; + const char *plist; + int ntr=0; + for (ptr=str; *ptr!='\0'; ptr++) + for (plist=oldchars; *plist!='\0'; plist++) + if (*ptr==*plist) + { + *ptr=newchars[plist-oldchars]; + ntr++; + break; + } + return ntr; +} + +// Similar to Perl's tr/abc//d: deletes all chars in str found in the list +// Returns number of removed characters +int strtrd(char* str, const char chars[]) +{ + char* ptr0=str; + char* ptr1=str; + const char *plist; + while (*ptr1!='\0') + { + for (plist=chars; *plist!='\0'; plist++) + if (*ptr1==*plist) break; + if (*plist=='\0') {*ptr0=*ptr1; ptr0++;} + ptr1++; + } + return ptr1-ptr0; +} + +// Similar to Perl's tr/a-z//d: deletes all chars in str found in the list +// Returns number of removed characters +int strtrd(char* str, char char1, char char2) +{ + char* ptr0=str; + char* ptr1=str; + while (*ptr1!='\0') + { + if (*ptr1>=char1 && *ptr1<=char2) {*ptr0=*ptr1; ptr0++;} + ptr1++; + } + return ptr1-ptr0; +} + +// transforms str into an all uppercase string +char* uprstr(char* str) +{ + char* s=str; + while (*s !='\0') {if (*s>='a' && *s<='z') *s+='A'-'a';s++;} + return(str); +} + +// transforms str into an all uppercase string +char* lwrstr(char* str) +{ + char* s=str; + while (*s !='\0') {if (*s>='A' && *s<='Z') *s+='a'-'A'; s++;} + return(str); +} + +// transforms chr into an uppercase character +inline char uprchr(char chr) +{ + return (chr>='a' && chr<='z')? chr+'A'-'a' : chr; +} + +// transforms chr into an lowercase character +inline char lwrchr(char chr) +{ + return (chr>='A' && chr<='Z')? chr-'A'+'a' : chr; +} + + +// Replaces first occurence of str1 by str2 in str. Returns pointer to first occurence or NULL if not found +// ATTENTION: if str2 is longer than str1, allocated memory of str must be long enough!! +inline char* strsubst(char* str, const char str1[], const char str2[]) +{ + char* ptr = strstr(str,str1); + strcpy(ptr,str2); + return ptr; +} + +// Gives elapsed time since first call to this function +inline void ElapsedTimeSinceFirstCall(const char str[]) +{ + timeval t; + static double tfirst=0; + if (tfirst==0) + { + gettimeofday(&t, NULL); + tfirst = 1E-6*t.tv_usec + t.tv_sec; + } + gettimeofday(&t, NULL); + printf("Elapsed time since first call:%12.3fs %s\n",1E-6*t.tv_usec + t.tv_sec - tfirst,str); +} + +// Gives elapsed time since last call to this function +inline void ElapsedTimeSinceLastCall(const char str[]) +{ + timeval t; + static double tlast=0.0; + if (tlast==0.0) + { + gettimeofday(&t, NULL); + tlast = 1.0E-6*t.tv_usec + t.tv_sec; + } + gettimeofday(&t, NULL); + printf("Elapsed time since last call:%12.3fs %s\n",1.0E-6*t.tv_usec + t.tv_sec - tlast,str); + tlast = 1.0E-6*t.tv_usec + t.tv_sec; +} + +inline char* RemovePath(char outname[], char filename[]) +{ + char* ptr; +#ifdef WINDOWS + ptr=strrchr(filename,92); //return adress for LAST \ (backslash) in name +#else + ptr=strrchr(filename,'/'); //return adress for LAST / in name +#endif + if (!ptr) ptr=filename; else ptr++; + strcpy(outname,ptr); + return outname; +} + +inline char* RemoveExtension(char outname[], char filename[]) +{ + char *ptr1; + ptr1=strrchr(filename,'.'); //return adress for LAST '.' in name + if (ptr1) {*ptr1='\0'; strcpy(outname,filename); *ptr1='.';} else strcpy(outname,filename); + return outname; +} + +inline char* RemovePathAndExtension(char outname[], char filename[]) +{ + char *ptr, *ptr1; +#ifdef WINDOWS + ptr=strrchr(filename,92); //return adress for LAST \ (backslash) in name +#else + ptr=strrchr(filename,'/'); //return adress for LAST / in name +#endif + if (!ptr) ptr=filename; else ptr++; + ptr1=strrchr(filename,'.'); //return adress for LAST '.' in name + if (ptr1) {*ptr1='\0'; strcpy(outname,ptr); *ptr1='.';} else strcpy(outname,ptr); + return outname; +} + +inline char* Extension(char extension[], char filename[]) +{ + char* ptr; + ptr=strrchr(filename,'.'); //return adress for LAST '.' in name + if (ptr) strcpy(extension,ptr+1); else *extension='\0'; + return extension; +} + +// Path includes last '/' +inline char* Pathname(char pathname[], char filename[]) +{ + char* ptr; + char chr; +#ifdef WINDOWS + ptr=strrchr(filename,92); //return adress for LAST \ (backslash) in name +#else + ptr=strrchr(filename,'/'); //return adress for LAST / in name +#endif + if (ptr) {chr=*(++ptr); *ptr='\0'; strcpy(pathname,filename); *ptr=chr;} else *pathname='\0'; + return pathname; +} + +// Swaps two integer elements in array k +inline void swapi(int k[], int i, int j) +{ + int temp; + temp=k[i]; k[i]=k[j]; k[j]=temp; +} + +// QSort sorting routine. time complexity of O(N ln(N)) on average +// Sorts the index array k between elements i='left' and i='right' in such a way that afterwards +// v[k[i]] is sorted downwards (up=-1) or upwards (up=+1) +void QSortInt(int v[], int k[], int left, int right, int up=+1) +{ + int i; + int last; // last element to have been swapped + + if (left>=right) return; // do nothing if less then 2 elements to sort + // Put pivot element in the middle of the sort range to the side (to position 'left') ... + swapi(k,left,(left+right)/2); + last=left; + // ... and swap all elements i SMALLER than the pivot + // with an element that is LARGER than the pivot (element last+1): + if (up==1) + { + for (i=left+1; i<=right; i++) + if (v[k[i]]<v[k[left]]) swapi(k,++last,i); + } + else + for (i=left+1; i<=right; i++) + if (v[k[i]]>v[k[left]]) swapi(k,++last,i); + + // Put the pivot to the right of the elements which are SMALLER, left to elements which are LARGER + swapi(k,left,last); + + // Sort the elements left from the pivot and right from the pivot + QSortInt(v,k,left,last-1,up); + QSortInt(v,k,last+1,right,up); +} + +// QSort sorting routine. time complexity of O(N ln(N)) on average +// Sorts the index array k between elements i='left' and i='right' in such a way that afterwards +// v[k[i]] is sorted downwards (up=-1) or upwards (up=+1) +void QSortFloat(float v[], int k[], int left, int right, int up=+1) +{ + int i; + int last; // last element to have been swapped + void swapi(int k[], int i, int j); + + if (left>=right) return; // do nothing if less then 2 elements to sort + // Put pivot element in the middle of the sort range to the side (to position 'left') ... + swapi(k,left,(left+right)/2); + last=left; + // ... and swap all elements i SMALLER than the pivot + // with an element that is LARGER than the pivot (element last+1): + if (up==1) + { + for (i=left+1; i<=right; i++) + if (v[k[i]]<v[k[left]]) swapi(k,++last,i); + } + else + for (i=left+1; i<=right; i++) + if (v[k[i]]>v[k[left]]) swapi(k,++last,i); + + // Put the pivot to the right of the elements which are SMALLER, left to elements which are LARGER + swapi(k,left,last); + + // Sort the elements left from the pivot and right from the pivot + QSortFloat(v,k,left,last-1,up); + QSortFloat(v,k,last+1,right,up); +} + +/** + * @brief comparison function for qsort, + * sorts floating point numbers ascendingly + * + * @param cv1 ponter to 1st entry to be sorted + * @param cv2 ponter to 2nd entry to be sorted + * + * @return 0 if entries are equal, + * +/-1 if 1st greater/smaller than 2nd + */ +int CompFltAsc(const void *cv1, const void *cv2){ + + float f1 = *(float *)cv1; + float f2 = *(float *)cv2; + + if (f1 > f2) { return +1; } + else if (f1 < f2) { return -1; } + else { return 0; } + +} /* this is the end of CompFltAsc() */ + +//Return random number in the range [0,1] +inline float frand() { return rand()/(RAND_MAX+1.0); } + + +///////////////////////////////////////////////////////////////////////////////////// +//// Execute system command +///////////////////////////////////////////////////////////////////////////////////// +void runSystem(std::string cmd, int v = 2) +{ + if (v>2) + cout << "Command: " << cmd << "!\n"; + int res = system(cmd.c_str()); + if (res!=0) + { + cerr << endl << "ERROR when executing: " << cmd << "!\n"; + exit(1); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/kmpp/KMeans.cpp Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,214 @@ +// See KMeans.h +// +// Author: David Arthur (darthur@gmail.com), 2009 + +// Includes + +#ifdef CLUSTALO +/* previously in KMeans.h */ +#include "KmUtils.h" +#include <iostream> +#include <stdio.h> + +// Sets preferences for how much logging is done and where it is outputted, when k-means is run. +void ClearKMeansLogging(); +void AddKMeansLogging(std::ostream *out, bool verbose); + +/* +// Runs k-means++ on the given set of points. Set RunKMeans for info on the parameters. +*/ +Scalar +RunKMeansPlusPlus(int n, int k, int d, Scalar *points, int attempts, + Scalar *centers, int *assignments); + +Scalar +RunKMeans(int n, int k, int d, Scalar *points, int attempts, + Scalar *centers, int *assignments); +#else +#include "KMeans.h" +#endif +#include "KmTree.h" +#include <sstream> +#include <time.h> +#include <vector> + +#ifdef CLUSTALO +extern "C" double +KMeans(int n, int k, int d, Scalar *points, int attempts, int use_lloyds_method, + double *centers, int *assignments) +{ + if (use_lloyds_method) { + /*fprintf(stderr, "FIXME using LLoyd's method\n");*/ + return RunKMeans(n, k, d, points, attempts, + centers, assignments); + } else { + /*fprintf(stderr, "FIXME using KMeansPP method\n");*/ + return RunKMeansPlusPlus(n, k, d, points, attempts, + centers, assignments); + } +} +#endif + +using namespace std; + +// Logging +static vector<ostream*> gLogOutputs; +static vector<ostream*> gVerboseLogOutputs; +#define LOG(verbose, text) { \ + vector<ostream*> &outputs = (verbose? gVerboseLogOutputs : gLogOutputs); \ + if (outputs.size() > 0) { \ + ostringstream string_stream; \ + string_stream << text; \ + for (int i = 0; i < (int)outputs.size(); i++) \ + *(outputs[i]) << string_stream.str(); \ + } \ +} +void AddKMeansLogging(std::ostream *out, bool verbose) { + if (verbose) + gVerboseLogOutputs.push_back(out); + gLogOutputs.push_back(out); +} +void ClearKMeansLogging() { + gLogOutputs.clear(); + gVerboseLogOutputs.clear(); +} + +// Returns the number of seconds since the program began execution. +static double GetSeconds() { + return double(clock()) / CLOCKS_PER_SEC; +} + +// See KMeans.h +// Performs one full execution of k-means, logging any relevant information, and tracking meta +// statistics for the run. If min or max values are negative, they are treated as unset. +// best_centers and best_assignment can be 0, in which case they are not set. +static void RunKMeansOnce(const KmTree &tree, int n, int k, int d, Scalar *points, Scalar *centers, + Scalar *min_cost, Scalar *max_cost, Scalar *total_cost, + double start_time, double *min_time, double *max_time, + double *total_time, Scalar *best_centers, int *best_assignment) { + const Scalar kEpsilon = Scalar(1e-8); // Used to determine when to terminate k-means + + // Do iterations of k-means until the cost stabilizes + Scalar old_cost = 0; + bool is_done = false; + for (int iteration = 0; !is_done; iteration++) { + Scalar new_cost = tree.DoKMeansStep(k, centers, 0); + is_done = (iteration > 0 && new_cost >= (1 - kEpsilon) * old_cost); + old_cost = new_cost; + LOG(true, "Completed iteration #" << (iteration+1) << ", cost=" << new_cost << "..." << endl); + } + double this_time = GetSeconds() - start_time; + + // Log the clustering we found + LOG(false, "Completed run: cost=" << old_cost << " (" << this_time << " seconds)" << endl); + + // Handle a new min cost, updating best_centers and best_assignment as appropriate + if (*min_cost < 0 || old_cost < *min_cost) { + *min_cost = old_cost; + if (best_assignment != 0) + tree.DoKMeansStep(k, centers, best_assignment); + if (best_centers != 0) + memcpy(best_centers, centers, sizeof(Scalar)*k*d); + } + + // Update all other aggregate stats + if (*max_cost < old_cost) *max_cost = old_cost; + *total_cost += old_cost; + if (*min_time < 0 || *min_time > this_time) + *min_time = this_time; + if (*max_time < this_time) *max_time = this_time; + *total_time += this_time; +} + +// Outputs all meta-stats for a set of k-means or k-means++ runs. +void LogMetaStats(Scalar min_cost, Scalar max_cost, Scalar total_cost, + double min_time, double max_time, double total_time, int num_attempts) { + LOG(false, "Aggregate info over " << num_attempts << " runs:" << endl); + LOG(false, " Cost: min=" << min_cost << " average=" << (total_cost / num_attempts) + << " max=" << max_cost << endl); + LOG(false, " Time: min=" << min_time << " average=" << (total_time / num_attempts) + << " max=" << max_time << endl << endl); +} + +// See KMeans.h +Scalar RunKMeans(int n, int k, int d, Scalar *points, int attempts, + Scalar *ret_centers, int *ret_assignment) { + KM_ASSERT(k >= 1); + + // Create the tree and log + LOG(false, "Running k-means..." << endl); + KmTree tree(n, d, points); + LOG(false, "Done preprocessing..." << endl); + + // Initialization + Scalar *centers = (Scalar*)malloc(sizeof(Scalar)*k*d); + int *unused_centers = (int*)malloc(sizeof(int)*n); + KM_ASSERT(centers != 0 && unused_centers != 0); + Scalar min_cost = -1, max_cost = -1, total_cost = 0; + double min_time = -1, max_time = -1, total_time = 0; + + // Handle k > n + if (k > n) { + memset(centers + n*d, -1, (k-d)*sizeof(Scalar)); + k = n; + } + + // Run all the attempts + for (int attempt = 0; attempt < attempts; attempt++) { + double start_time = GetSeconds(); + + // Choose centers uniformly at random + for (int i = 0; i < n; i++) + unused_centers[i] = i; + int num_unused_centers = n; + for (int i = 0; i < k; i++) { + int j = GetRandom(num_unused_centers--); + memcpy(centers + i*d, points + unused_centers[j]*d, d*sizeof(Scalar)); + unused_centers[j] = unused_centers[num_unused_centers]; + } + + // Run k-means + RunKMeansOnce(tree, n, k, d, points, centers, &min_cost, &max_cost, &total_cost, start_time, + &min_time, &max_time, &total_time, ret_centers, ret_assignment); + } + LogMetaStats(min_cost, max_cost, total_cost, min_time, max_time, total_time, attempts); + + // Clean up and return + free(unused_centers); + free(centers); + return min_cost; +} + +// See KMeans.h +Scalar RunKMeansPlusPlus(int n, int k, int d, Scalar *points, int attempts, + Scalar *ret_centers, int *ret_assignment) { + KM_ASSERT(k >= 1); + + // Create the tree and log + LOG(false, "Running k-means++..." << endl); + KmTree tree(n, d, points); + LOG(false, "Done preprocessing..." << endl); + + // Initialization + Scalar *centers = (Scalar*)malloc(sizeof(Scalar)*k*d); + KM_ASSERT(centers != 0); + Scalar min_cost = -1, max_cost = -1, total_cost = 0; + double min_time = -1, max_time = -1, total_time = 0; + + // Run all the attempts + for (int attempt = 0; attempt < attempts; attempt++) { + double start_time = GetSeconds(); + + // Choose centers using k-means++ seeding + tree.SeedKMeansPlusPlus(k, centers); + + // Run k-means + RunKMeansOnce(tree, n, k, d, points, centers, &min_cost, &max_cost, &total_cost, start_time, + &min_time, &max_time, &total_time, ret_centers, ret_assignment); + } + LogMetaStats(min_cost, max_cost, total_cost, min_time, max_time, total_time, attempts); + + // Clean up and return + free(centers); + return min_cost; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/kmpp/KMeans.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,56 @@ +#ifndef CLUSTALO +// BEWARE: BETA VERSION +// -------------------- +// +// The main set of utilities for runnning k-means and k-means++ on arbitrary data sets. +// +// Author: David Arthur (darthur@gmail.com), 2009 +#endif + +#ifndef KMEANS_H__ +#define KMEANS_H__ + +#ifndef CLUSTALO +// Includes +#include "KmUtils.h" +#include <iostream> + +// Sets preferences for how much logging is done and where it is outputted, when k-means is run. +void ClearKMeansLogging(); +void AddKMeansLogging(std::ostream *out, bool verbose); + +// Runs k-means on the given set of points. +// - n: The number of points in the data set +// - k: The number of clusters to look for +// - d: The number of dimensions that the data set lives in +// - points: An array of size n*d where points[d*i + j] gives coordinate j of point i +// - attempts: The number of times to independently run k-means with different starting centers. +// The best result is always returned (as measured by the cost function). +// - centers: This can either be null or an array of size k*d. In the latter case, it will be +// filled with the locations of all final cluster centers. Specifically +// centers[d*i + j] will give coordinate j of center i. If the cluster is unused, it +// will contain NaN instead. +// - assignments: This can either be null or an array of size n. In the latter case, it will be +// filled with the cluster that each point is assigned to (an integer between 0 +// and k-1 inclusive). +// The final cost of the clustering is also returned. +// The final cost of the clustering is also returned. +Scalar RunKMeans(int n, int k, int d, Scalar *points, int attempts, + Scalar *centers, int *assignments); + +// Runs k-means++ on the given set of points. Set RunKMeans for info on the parameters. +Scalar RunKMeansPlusPlus(int n, int k, int d, Scalar *points, int attempts, + Scalar *centers, int *assignments); + +#else + +/* CLUSTALO PATCH: + * same as above, with one addition: if use_lloyds_method is false, kmpp will be used + * otherwise the 'classical' i.e. Looyd's method will be used + */ +extern double +KMeans(int n, int k, int d, double *points, int attempts, int use_lloyds_method, + double *centers, int *assignments); + +#endif +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/kmpp/KmTree.cpp Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,363 @@ +// See KmTree.cpp +// +// Author: David Arthur (darthur@gmail.com), 2009 + +// Includes +#include "KmTree.h" +#include <iostream> +#include <stdlib.h> +#include <stdio.h> +using namespace std; + +KmTree::KmTree(int n, int d, Scalar *points): n_(n), d_(d), points_(points) { + // Initialize memory + // DD: need to cast to long otherwise malloc will fail + // if we need more than 2 gigabytes or so + int node_size = sizeof(Node) + d_ * 3 * sizeof(Scalar); + node_data_ = (char*)malloc((2*(long unsigned int)n-1) * node_size); + point_indices_ = (int*)malloc(n * sizeof(int)); + for (int i = 0; i < n; i++) + point_indices_[i] = i; + KM_ASSERT(node_data_ != 0 && point_indices_ != 0); + + // Calculate the bounding box for the points + Scalar *bound_v1 = PointAllocate(d_); + Scalar *bound_v2 = PointAllocate(d_); + KM_ASSERT(bound_v1 != 0 && bound_v2 != 0); + PointCopy(bound_v1, points, d_); + PointCopy(bound_v2, points, d_); + for (int i = 1; i < n; i++) + for (int j = 0; j < d; j++) { + if (bound_v1[j] > points[i*d_ + j]) bound_v1[j] = points[i*d_ + j]; + if (bound_v2[j] < points[i*d_ + j]) bound_v1[j] = points[i*d_ + j]; + } + + // Build the tree + char *temp_node_data = node_data_; + top_node_ = BuildNodes(points, 0, n-1, &temp_node_data); + + // Cleanup + PointFree(bound_v1); + PointFree(bound_v2); +} + +KmTree::~KmTree() { + free(point_indices_); + free(node_data_); +} + +Scalar KmTree::DoKMeansStep(int k, Scalar *centers, int *assignment) const { + // Create an invalid center for comparison purposes + Scalar *bad_center = PointAllocate(d_); + KM_ASSERT(bad_center != 0); + memset(bad_center, 0xff, d_ * sizeof(Scalar)); + + // Allocate data + Scalar *sums = (Scalar*)calloc(k * d_, sizeof(Scalar)); + int *counts = (int*)calloc(k, sizeof(int)); + int num_candidates = 0; + int *candidates = (int*)malloc(k * sizeof(int)); + KM_ASSERT(sums != 0 && counts != 0 && candidates != 0); + for (int i = 0; i < k; i++) + if (memcmp(centers + i*d_, bad_center, d_ * sizeof(Scalar)) != 0) + candidates[num_candidates++] = i; + + // Find nodes + Scalar result = DoKMeansStepAtNode(top_node_, num_candidates, candidates, centers, sums, + counts, assignment); + + // Set the new centers + for (int i = 0; i < k; i++) { + if (counts[i] > 0) { + PointScale(sums + i*d_, Scalar(1) / counts[i], d_); + PointCopy(centers + i*d_, sums + i*d_, d_); + } else { + memcpy(centers + i*d_, bad_center, d_ * sizeof(Scalar)); + } + } + + // Cleanup memory + PointFree(bad_center); + free(candidates); + free(counts); + free(sums); + return result; +} + +// Helper functions for constructor +// ================================ + +// Build a kd tree from the given set of points +KmTree::Node *KmTree::BuildNodes(Scalar *points, int first_index, int last_index, + char **next_node_data) { + // Allocate the node + Node *node = (Node*)(*next_node_data); + (*next_node_data) += sizeof(Node); + node->sum = (Scalar*)(*next_node_data); + (*next_node_data) += sizeof(Scalar) * d_; + node->median = (Scalar*)(*next_node_data); + (*next_node_data) += sizeof(Scalar) * d_; + node->radius = (Scalar*)(*next_node_data); + (*next_node_data) += sizeof(Scalar) * d_; + + // Fill in basic info + node->num_points = (last_index - first_index + 1); + node->first_point_index = first_index; + + // Calculate the bounding box + Scalar *first_point = points + point_indices_[first_index] * d_; + Scalar *bound_p1 = PointAllocate(d_); + Scalar *bound_p2 = PointAllocate(d_); + KM_ASSERT(bound_p1 != 0 && bound_p2 != 0); + PointCopy(bound_p1, first_point, d_); + PointCopy(bound_p2, first_point, d_); + for (int i = first_index+1; i <= last_index; i++) + for (int j = 0; j < d_; j++) { + Scalar c = points[point_indices_[i]*d_ + j]; + if (bound_p1[j] > c) bound_p1[j] = c; + if (bound_p2[j] < c) bound_p2[j] = c; + } + + // Calculate bounding box stats and delete the bounding box memory + Scalar max_radius = -1; + int split_d = -1; + for (int j = 0; j < d_; j++) { + node->median[j] = (bound_p1[j] + bound_p2[j]) / 2; + node->radius[j] = (bound_p2[j] - bound_p1[j]) / 2; + if (node->radius[j] > max_radius) { + max_radius = node->radius[j]; + split_d = j; + } + } + PointFree(bound_p2); + PointFree(bound_p1); + + // If the max spread is 0, make this a leaf node + if (max_radius == 0) { + node->lower_node = node->upper_node = 0; + PointCopy(node->sum, first_point, d_); + if (last_index != first_index) + PointScale(node->sum, Scalar(last_index - first_index + 1), d_); + node->opt_cost = 0; + return node; + } + + // Partition the points around the midpoint in this dimension. The partitioning is done in-place + // by iterating from left-to-right and right-to-left in the same way that partioning is done for + // quicksort. + Scalar split_pos = node->median[split_d]; + int i1 = first_index, i2 = last_index, size1 = 0; + while (i1 <= i2) { + bool is_i1_good = (points[point_indices_[i1]*d_ + split_d] < split_pos); + bool is_i2_good = (points[point_indices_[i2]*d_ + split_d] >= split_pos); + if (!is_i1_good && !is_i2_good) { + int temp = point_indices_[i1]; + point_indices_[i1] = point_indices_[i2]; + point_indices_[i2] = temp; + is_i1_good = is_i2_good = true; + } + if (is_i1_good) { + i1++; + size1++; + } + if (is_i2_good) { + i2--; + } + } + + // Create the child nodes + KM_ASSERT(size1 >= 1 && size1 <= last_index - first_index); + node->lower_node = BuildNodes(points, first_index, first_index + size1 - 1, next_node_data); + node->upper_node = BuildNodes(points, first_index + size1, last_index, next_node_data); + + // Calculate the new sum and opt cost + PointCopy(node->sum, node->lower_node->sum, d_); + PointAdd(node->sum, node->upper_node->sum, d_); + Scalar *center = PointAllocate(d_); + KM_ASSERT(center != 0); + PointCopy(center, node->sum, d_); + PointScale(center, Scalar(1) / node->num_points, d_); + node->opt_cost = GetNodeCost(node->lower_node, center) + GetNodeCost(node->upper_node, center); + PointFree(center); + return node; +} + +// Returns the total contribution of all points in the given kd-tree node, assuming they are all +// assigned to a center at the given location. We need to return: +// +// sum_{x \in node} ||x - center||^2. +// +// If c denotes the center of mass of the points in this node and n denotes the number of points in +// it, then this quantity is given by +// +// n * ||c - center||^2 + sum_{x \in node} ||x - c||^2 +// +// The sum is precomputed for each node as opt_cost. This formula follows from expanding both sides +// as dot products. See Kanungo/Mount for more info. +Scalar KmTree::GetNodeCost(const Node *node, Scalar *center) const { + Scalar dist_sq = 0; + for (int i = 0; i < d_; i++) { + Scalar x = (node->sum[i] / node->num_points) - center[i]; + dist_sq += x*x; + } + return node->opt_cost + node->num_points * dist_sq; +} + +// Helper functions for DoKMeans step +// ================================== + +// A recursive version of DoKMeansStep. This determines which clusters all points that are rooted +// node will be assigned to, and updates sums, counts and assignment (if not null) accordingly. +// candidates maintains the set of cluster indices which could possibly be the closest clusters +// for points in this subtree. +Scalar KmTree::DoKMeansStepAtNode(const Node *node, int k, int *candidates, Scalar *centers, + Scalar *sums, int *counts, int *assignment) const { + // Determine which center the node center is closest to + Scalar min_dist_sq = PointDistSq(node->median, centers + candidates[0]*d_, d_); + int closest_i = candidates[0]; + for (int i = 1; i < k; i++) { + Scalar dist_sq = PointDistSq(node->median, centers + candidates[i]*d_, d_); + if (dist_sq < min_dist_sq) { + min_dist_sq = dist_sq; + closest_i = candidates[i]; + } + } + + // If this is a non-leaf node, recurse if necessary + if (node->lower_node != 0) { + // Build the new list of candidates + int new_k = 0; + int *new_candidates = (int*)malloc(k * sizeof(int)); + KM_ASSERT(new_candidates != 0); + for (int i = 0; i < k; i++) + if (!ShouldBePruned(node->median, node->radius, centers, closest_i, candidates[i])) + new_candidates[new_k++] = candidates[i]; + + // Recurse if there's at least two + if (new_k > 1) { + Scalar result = DoKMeansStepAtNode(node->lower_node, new_k, new_candidates, centers, + sums, counts, assignment) + + DoKMeansStepAtNode(node->upper_node, new_k, new_candidates, centers, + sums, counts, assignment); + free(new_candidates); + return result; + } else { + free(new_candidates); + } + } + + // Assigns all points within this node to a single center + PointAdd(sums + closest_i*d_, node->sum, d_); + counts[closest_i] += node->num_points; + if (assignment != 0) { + for (int i = node->first_point_index; i < node->first_point_index + node->num_points; i++) + assignment[point_indices_[i]] = closest_i; + } + return GetNodeCost(node, centers + closest_i*d_); +} + +// Determines whether every point in the box is closer to centers[best_index] than to +// centers[test_index]. +// +// If x is a point, c_0 = centers[best_index], c = centers[test_index], then: +// (x-c).(x-c) < (x-c_0).(x-c_0) +// <=> (c-c_0).(c-c_0) < 2(x-c_0).(c-c_0) +// +// The right-hand side is maximized for a vertex of the box where for each dimension, we choose +// the low or high value based on the sign of x-c_0 in that dimension. +bool KmTree::ShouldBePruned(Scalar *box_median, Scalar *box_radius, Scalar *centers, + int best_index, int test_index) const { + if (best_index == test_index) + return false; + + Scalar *best = centers + best_index*d_; + Scalar *test = centers + test_index*d_; + Scalar lhs = 0, rhs = 0; + for (int i = 0; i < d_; i++) { + Scalar component = test[i] - best[i]; + lhs += component * component; + if (component > 0) + rhs += (box_median[i] + box_radius[i] - best[i]) * component; + else + rhs += (box_median[i] - box_radius[i] - best[i]) * component; + } + return (lhs >= 2*rhs); +} + +Scalar KmTree::SeedKMeansPlusPlus(int k, Scalar *centers) const { + Scalar *dist_sq = (Scalar*)malloc(n_ * sizeof(Scalar)); + KM_ASSERT(dist_sq != 0); + + // Choose an initial center uniformly at random + SeedKmppSetClusterIndex(top_node_, 0); + int i = GetRandom(n_); + memcpy(centers, points_ + point_indices_[i]*d_, d_*sizeof(Scalar)); + Scalar total_cost = 0; + for (int j = 0; j < n_; j++) { + dist_sq[j] = PointDistSq(points_ + point_indices_[j]*d_, centers, d_); + total_cost += dist_sq[j]; + } + + // Repeatedly choose more centers + for (int new_cluster = 1; new_cluster < k; new_cluster++) { + while (1) { + Scalar cutoff = (rand() / Scalar(RAND_MAX)) * total_cost; + Scalar cur_cost = 0; + for (i = 0; i < n_; i++) { + cur_cost += dist_sq[i]; + if (cur_cost >= cutoff) + break; + } + if (i < n_) + break; + } + memcpy(centers + new_cluster*d_, points_ + point_indices_[i]*d_, d_*sizeof(Scalar)); + total_cost = SeedKmppUpdateAssignment(top_node_, new_cluster, centers, dist_sq); + } + + // Clean up and return + free(dist_sq); + return total_cost; +} + +// Helper functions for SeedKMeansPlusPlus +// ======================================= + +// Sets kmpp_cluster_index to 0 for all nodes +void KmTree::SeedKmppSetClusterIndex(const Node *node, int value) const { + node->kmpp_cluster_index = value; + if (node->lower_node != 0) { + SeedKmppSetClusterIndex(node->lower_node, value); + SeedKmppSetClusterIndex(node->upper_node, value); + } +} + +Scalar KmTree::SeedKmppUpdateAssignment(const Node *node, int new_cluster, Scalar *centers, + Scalar *dist_sq) const { + // See if we can assign all points in this node to one cluster + if (node->kmpp_cluster_index >= 0) { + if (ShouldBePruned(node->median, node->radius, centers, node->kmpp_cluster_index, new_cluster)) + return GetNodeCost(node, centers + node->kmpp_cluster_index*d_); + if (ShouldBePruned(node->median, node->radius, centers, new_cluster, + node->kmpp_cluster_index)) { + SeedKmppSetClusterIndex(node, new_cluster); + for (int i = node->first_point_index; i < node->first_point_index + node->num_points; i++) + dist_sq[i] = PointDistSq(points_ + point_indices_[i]*d_, centers + new_cluster*d_, d_); + return GetNodeCost(node, centers + new_cluster*d_); + } + + // It may be that the a leaf-node point is equidistant from the new center or old + if (node->lower_node == 0) + return GetNodeCost(node, centers + node->kmpp_cluster_index*d_); + } + + // Recurse + Scalar cost = SeedKmppUpdateAssignment(node->lower_node, new_cluster, centers, dist_sq) + + SeedKmppUpdateAssignment(node->upper_node, new_cluster, centers, dist_sq); + int i1 = node->lower_node->kmpp_cluster_index, i2 = node->upper_node->kmpp_cluster_index; + if (i1 == i2 && i1 != -1) + node->kmpp_cluster_index = i1; + else + node->kmpp_cluster_index = -1; + return cost; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/kmpp/KmTree.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,77 @@ +// BEWARE: BETA VERSION +// -------------------- +// +// A k-d tree that vastly speeds up an iteration of k-means (in any number of dimensions). The main +// idea for this data structure is from Kanungo/Mount. This is used internally by Kmeans.cpp, and +// will most likely not need to be used directly. +// +// The stucture works as follows: +// - All data points are placed into a tree where we choose child nodes by partitioning all data +// points along a plane parallel to the axis. +// - We maintain for each node, the bounding box of all data points stored at that node. +// - To do a k-means iteration, we need to assign points to clusters and calculate the sum and +// the number of points assigned to each cluster. For each node in the tree, we can rule out +// some cluster centers as being too far away from every single point in that bounding box. +// Once only one cluster is left, all points in the node can be assigned to that cluster in +// batch. +// +// Author: David Arthur (darthur@gmail.com), 2009 + +#ifndef KM_TREE_H__ +#define KM_TREE_H__ + +// Includes +#include "KmUtils.h" + +// KmTree class definition +class KmTree { + public: + // Constructs a tree out of the given n data points living in R^d. + KmTree(int n, int d, Scalar *points); + ~KmTree(); + + // Given k cluster centers, this runs a full k-means iterations, choosing the next set of + // centers and returning the cost function for this set of centers. If assignment is not null, + // it should be an array of size n that will be filled with the index of the cluster (0 - k-1) + // that each data point is assigned to. The new center values will overwrite the old ones. + Scalar DoKMeansStep(int k, Scalar *centers, int *assignment) const; + + // Choose k initial centers for k-means using the kmeans++ seeding procedure. The resulting + // centers are returned via the centers variable, which should be pre-allocated to size k*d. + // The cost of the initial clustering is returned. + Scalar SeedKMeansPlusPlus(int k, Scalar *centers) const; + + private: + struct Node { + int num_points; // Number of points stored in this node + int first_point_index; // The smallest point index stored in this node + Scalar *median, *radius; // Bounding box center and half side-lengths + Scalar *sum; // Sum of the points stored in this node + Scalar opt_cost; // Min cost for putting all points in this node in 1 cluster + Node *lower_node, *upper_node; // Child nodes + mutable int kmpp_cluster_index; // The cluster these points are assigned to or -1 if variable + }; + + // Helper functions for constructor + Node *BuildNodes(Scalar *points, int first_index, int last_index, char **next_node_data); + Scalar GetNodeCost(const Node *node, Scalar *center) const; + + // Helper functions for DoKMeans step + Scalar DoKMeansStepAtNode(const Node *node, int k, int *candidates, Scalar *centers, + Scalar *sums, int *counts, int *assignment) const; + bool ShouldBePruned(Scalar *box_median, Scalar *box_radius, Scalar *centers, int best_index, + int test_index) const; + + // Helper functions for SeedKMeansPlusPlus + void SeedKmppSetClusterIndex(const Node *node, int index) const; + Scalar SeedKmppUpdateAssignment(const Node *node, int new_cluster, Scalar *centers, + Scalar *dist_sq) const; + + int n_, d_; + Scalar *points_; + Node *top_node_; + char *node_data_; + int *point_indices_; +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/kmpp/KmUtils.cpp Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,13 @@ +// See KmUtils.h +// +// Author: David Arthur (darthur@gmail.com), 2009 + +#include "KmUtils.h" +#include <iostream> +using namespace std; + +int __KMeansAssertionFailure(const char *file, int line, const char *expression) { + cout << "ASSERTION FAILURE, " << file << " line " << line << ":" << endl; + cout << " " << expression << endl; + exit(-1); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/kmpp/KmUtils.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,85 @@ +// BEWARE: BETA VERSION +// -------------------- +// +// Utilities for arbitrary dimensional points in space. All points are treated as simple value +// arrays. This is done for two reasons: +// - Using value arrays instead of a point class makes all point operations very explicit, which +// makes their usage easier to optimize. +// - A value array is about as universal a format as possible, which makes it easier for +// people to use the k-means code in any project. +// Also contains assertion code that can be disabled if desired. +// +// Author: David Arthur (darthur@gmail.com), 2009 + +#ifndef KM_UTILS_H__ +#define KM_UTILS_H__ + +// Includes +#ifndef CLUSTALO +#include <malloc.h> +#endif +#include <memory.h> +#include <stdlib.h> + +// The data-type used for a single coordinate for points +typedef double Scalar; + +// Point utilities +// =============== + +// Point creation and deletion +inline Scalar *PointAllocate(int d) { + return (Scalar*)malloc(d * sizeof(Scalar)); +} + +inline void PointFree(Scalar *p) { + free(p); +} + +inline void PointCopy(Scalar *p1, const Scalar *p2, int d) { + memcpy(p1, p2, d * sizeof(Scalar)); +} + +// Point vector tools +inline void PointAdd(Scalar *p1, const Scalar *p2, int d) { + for (int i = 0; i < d; i++) + p1[i] += p2[i]; +} + +inline void PointScale(Scalar *p, Scalar scale, int d) { + for (int i = 0; i < d; i++) + p[i] *= scale; +} + +inline Scalar PointDistSq(const Scalar *p1, const Scalar *p2, int d) { + Scalar result = 0; + for (int i = 0; i < d; i++) + result += (p1[i] - p2[i]) * (p1[i] - p2[i]); + return result; +} + +// Assertions +// ========== + +// Comment out ENABLE_KMEANS_ASSERTS to turn off ASSERTS for added speed. +#define ENABLE_KMEANS_ASSERTS +#ifdef ENABLE_KMEANS_ASSERTS +int __KMeansAssertionFailure(const char *file, int line, const char *expression); +#define KM_ASSERT(expression) \ + (void)((expression) != 0? 0 : __KMeansAssertionFailure(__FILE__, __LINE__, #expression)) +#else +#define KM_ASSERT(expression) +#endif + +// Miscellaneous utilities +// ======================= + +// Returns a random integer chosen uniformly from the range [0, n-1]. Note that RAND_MAX could be +// less than n. On Visual Studio, it is only 32767. For larger values of RAND_MAX, we need to be +// careful of overflow. +inline int GetRandom(int n) { + int u = rand() * RAND_MAX + rand(); + return ((u % n) + n) % n; +} + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/kmpp/Makefile.am Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,18 @@ +# Replaces squids own automake files +# +# Some useful automake documentation: +# http://www.openismus.com/documents/linux/automake/automake.shtml +# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html + +#SUBDIRS = +#EXTRA_DIST = +#LDADD = + +# need DCLUSTALO here to enable Clustal specific squid patches +AM_CXXFLAGS = -DCLUSTALO @AM_CXXFLAGS@ + +noinst_LTLIBRARIES = libkmpp.la + +libkmpp_la_SOURCES = KMeans.cpp KMeans.h \ + KmTree.cpp KmTree.h \ + KmUtils.cpp KmUtils.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/kmpp/Makefile.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,504 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# Replaces squids own automake files +# +# Some useful automake documentation: +# http://www.openismus.com/documents/linux/automake/automake.shtml +# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html + +#SUBDIRS = +#EXTRA_DIST = +#LDADD = + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/kmpp +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/ax_openmp.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libkmpp_la_LIBADD = +am_libkmpp_la_OBJECTS = KMeans.lo KmTree.lo KmUtils.lo +libkmpp_la_OBJECTS = $(am_libkmpp_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libkmpp_la_SOURCES) +DIST_SOURCES = $(libkmpp_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ + +# need DCLUSTALO here to enable Clustal specific squid patches +AM_CXXFLAGS = -DCLUSTALO @AM_CXXFLAGS@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CODENAME = @PACKAGE_CODENAME@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_LTLIBRARIES = libkmpp.la +libkmpp_la_SOURCES = KMeans.cpp KMeans.h \ + KmTree.cpp KmTree.h \ + KmUtils.cpp KmUtils.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/kmpp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/kmpp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libkmpp.la: $(libkmpp_la_OBJECTS) $(libkmpp_la_DEPENDENCIES) + $(CXXLINK) $(libkmpp_la_OBJECTS) $(libkmpp_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/KMeans.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/KmTree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/KmUtils.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/main.cpp Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,477 @@ +/********************************************************************* + * Clustal Omage - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: main.cpp 234 2011-04-13 05:26:16Z andreas $ + */ + +/* + * We are using a mix of C and C++, which means that linking has to be + * done with a C++ compiler. By using this "fake" main c++ function, + * automake is convinced to use a C++ compiler for linking. + * + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +extern "C" { +#include "mymain.h" +#include "clustal/util.h" +#include "squid/squid.h" +} + + +/** + * @brief Convert an old Clustal command line parameter in the form of + * [-/]param[=value] to new parameter if possible + * + * @param[out] iNewArgC_p + * "argc" which will be incremented for each successfully converted option + * @param[out] ppcNewArgV_p + * "argv" to which each successfully converted options will be added + * (caller has to free) + * @param[in] pcOldArg + * The old parameter and value command line option + * + */ +void +ConvertOldCmdLineArg(int *iNewArgC_p, char ***ppcNewArgV_p, char *pcOldArg) +{ + char *pcOldParam, *pcOldValue, *pcOldArgCopy; + char zcNotImplementedMsg[] = "WARNING: Invalid old command line option"; + + pcOldArgCopy = CkStrdup(pcOldArg); + pcOldParam = strtok(pcOldArgCopy, "="); + pcOldValue = strtok(NULL, "="); + + + /* go through all options in order of appearance in clustalw2 -help + * + */ + + /* data + * + */ + if (STR_NC_EQ("INFILE", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-i"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + } else if (STR_NC_EQ("PROFILE1", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("--profile1"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + } else if (STR_NC_EQ("PROFILE2", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("--profile2"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + /* verbs + * + */ + + /* missing: + * OPTIONS + */ + + } else if (STR_NC_EQ("HELP", &pcOldParam[1]) + || STR_NC_EQ("CHECK", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-h"); + + } else if (STR_NC_EQ("FULLHELP", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-h"); + + } else if (STR_NC_EQ("ALIGN", &pcOldParam[1])) { + char msg[] = "WARNING: The ALIGN option is default in Clustal Omega"; + fprintf(stderr, "%s\n", msg); + + /* missing: + * TREE + * PIM + * BOOTSTRAP + * CONVERT + */ + + /* parameters + * + */ + } else if (STR_NC_EQ("INTERACTIVE", &pcOldParam[1])) { + char msg[] = "WARNING: There is no interactive command-line menu in Clustal Omega"; + fprintf(stderr, "%s\n", msg); + /* trigger help */ + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-h"); + + } else if (STR_NC_EQ("QUICKTREE", &pcOldParam[1])) { + char msg[] = "WARNING: The QUICKTREE (i.e. k-tuple distance) option is default in Clustal Omega"; + fprintf(stderr, "%s\n", msg); + + } else if (STR_NC_EQ("TYPE", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-t"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + /* NEGATIVE */ + + } else if (STR_NC_EQ("OUTFILE", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-o"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + + } else if (STR_NC_EQ("OUTPUT", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("--outfmt"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + /* missing: + * OUTORDER + * CASE + * SEQNOS + * SEQNO_RANGE + * RANGE + */ + + } else if (STR_NC_EQ("MAXSEQLEN", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("--maxseqlen"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + } else if (STR_NC_EQ("QUIET", &pcOldParam[1])) { + char msg[] = "WARNING: The QUIET option is default in Clustal Omega"; + fprintf(stderr, "%s\n", msg); + + /* missing: + * STATS + */ + + /* fast pariwise alignment + * + */ + + /* missing: + * KTUPLE + * TOPDIAGS + * WINDOW + * PAIRGAP + * SCORE + */ + + /* slow pairwise alignments + * + */ + + /* missing: + * PWMATRIX + * PWDNAMATRIX + * PWGAPOPEN + * PWGAPEXT + */ + + /* multiple alignments + * + */ + } else if (STR_NC_EQ("NEWTREE", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("--guidetree-out"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + } else if (STR_NC_EQ("USETREE", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("--guidetree-in"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); + + /* missing: + * MATRIX + * DNAMATRIX + * GAPOPEN + * GAPEXT + * ENDGAPS + * GAPDIST + * NOGAP + * NOHGAP + * HGAPRESIDUES + * MAXDIV + * TYPE already handled above + * TRANSWEIGHT + * ITERATION + * NUMITER + * NOWEIGHTS + */ + + /* profile alignments + * + */ + + /* missing: + * PROFILE + * NEWTREE1 + * NEWTREE2 + * USETREE1 + * USETREE2 + */ + + /* sequence to profile alignments + * + */ + } else if (STR_NC_EQ("SEQUENCES", &pcOldParam[1])) { + fprintf(stderr, "WARNING: %s: %s\n", zcNotImplementedMsg, pcOldArg); + + /* SEQUENCES and NEWTREE already handled above */ + + /* structure alignments + * + */ + + /* missing: + * NOSECSTR1 + * NOSECSTR2 + * SECSTROUT + * HELIXGAP + * STRANDGAP + * LOOPGAP + * TERMINALGAP + * HELIXENDIN + * HELIXENDOUT + * STRANDENDIN + * STRANDENDOUT + */ + + /* trees + * + */ + + /* missing: + * OUTPUTTREE + * SEED + * KIMURA + * TOSSGAPS + * BOOTLABELS + */ +#if 0 + } else if (STR_NC_EQ("CLUSTERING", &pcOldParam[1])) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-c"); + if (NULL != pcOldValue) + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(pcOldValue); +#endif + + } else { + fprintf(stderr, + "WARNING: Unsupported old command line option '%s' will be ignored\n", + pcOldArg); + } + + /* FIXME: if not outfile was given, than the old default was to create a + * filename based on the input filename but with its extension replaced by + * aln. If the input already had the extension aln then the input was + * overwritten. What to do here? Strictly mimic the old behaviour? + */ + + free(pcOldArgCopy); +} +/* end ConvertOldCmdLineArg */ + + + +/** + * @brief Convert old command line usage to new one. Mix of old and + * new style will be tolerated + * + * @param[out] iNewArgC_p + * The updated "argc" + * @param[out] ppcNewArgV_p + * The updated "argv". Caller has to free. + * @param[in] argc + * Original "argc" + * @param[in] argv + * Original argv + * + * @note old style parameters look like this: + * [/-]param[=value] + * new style parameters: + * -p [value] + * --param [value] + * + */ +void +ConvertOldCmdline(int *iNewArgC_p, char ***ppcNewArgV_p, int argc, char **argv) +{ + bool bOldCmdlineDetected = false; + int i; /* aux */ + + /* we can have at most 2*argc converted arguments, plus the few + * that we set by default (.e.g --force) + */ + (*ppcNewArgV_p) = (char **) CKCALLOC(argc*2+10, sizeof(char*)); + + /* copy first arg which is program name */ + (*ppcNewArgV_p)[0] = CkStrdup(argv[0]); + *iNewArgC_p = 1; + + for (i=1; i<argc; i++) { + bool bNewStyle = false; + + if (strlen(argv[i])<=2) { + /* e.g. -i (param) or just numbers (value) */ + bNewStyle = true; + + } else if (strlen(argv[i])>2) { + if (argv[i][0] == '-' && argv[i][1] == '-') { + /* new style long opts */ + bNewStyle = true; + + } else if (argv[i][0]=='/' && (NULL!=strchr(&argv[i][1], '/'))) { + /* Slash used to be a valid replacement for dash in + * Clustal<=2, but could also be file in new style. If + * we find at least two slashes, one at the beginning, + * it should be a filename and therefore new style */ + bNewStyle = true; + + } else if (argv[i][0] != '/' && argv[i][0] != '-') { + /* old style opts always start with slash or dash */ + bNewStyle = true; + + } + } + + /* copy and continue if new style arg or attempt to convert + * old style arg + */ + if (bNewStyle) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup(argv[i]); + } else { + ConvertOldCmdLineArg(iNewArgC_p, ppcNewArgV_p, argv[i]); + /*LOG_DEBUG("old command line arg: %s", argv[i]);*/ + bOldCmdlineDetected = true; + } + } + + if (bOldCmdlineDetected) { + bool bOutfileOptSet = FALSE; + bool bOutFormatOptSet = FALSE; + + + /* old clustal used to write to a file called in.aln by + * default. set if not + * explicitely requested otherwisee + */ + for (i=0; i<*iNewArgC_p; i++) { + const char *pcOpt = "-o"; + if (strlen(pcOpt) <= strlen((*ppcNewArgV_p)[i])) { + if (0 == strncmp((*ppcNewArgV_p)[i], pcOpt, strlen(pcOpt))) { + bOutfileOptSet = TRUE; + break; + } + } + } + if (FALSE == bOutfileOptSet) { +#ifdef TOO_LAZY_TO_IMPLEMENT_JUST_USING_DEFAULT_NAME_INSTEAD + char *pcDotPos = NULL; + char *pcInfileOpt = NULL; + + /* get infile arg and find last dot in it. if found replace + * everything after with "aln", otherwise just add "aln" + */ + for (i=0; i<*iNewArgC_p; i++) { + const char *pcOpt = "-i"; + if (strlen(pcOpt) <= strlen((*ppcNewArgV_p)[i])) { + if (0 == strncmp((*ppcNewArgV_p)[i], pcOpt, strlen(pcOpt))) { + if (*iNewArgC_p<= i+1) { + fprintf(stderr, + "Oups...error while trying to convert old commandline (%s).\n", + "No more arguments left after -i"); + exit(1); + } + pcInfileOpt = (*ppcNewArgV_p)[i+1]; + break; + } + } + } + if (NULL == pcInfileOpt) { + fprintf(stderr, + "Oups...error while trying to convert old commandline (%s)\n", + "No infile opt found"); + exit(1); + } + + fprintf(stderr, "FIXME: unfinished\n"); + exit(1); +#endif + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-o"); + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("clustal.aln"); + } + + + /* old clustal used the clustal format by default. set if not + * explicitely requested otherwisee + */ + for (i=0; i<*iNewArgC_p; i++) { + const char *pcOpt = "--outfmt"; + if (strlen(pcOpt) <= strlen((*ppcNewArgV_p)[i])) { + if (0 == strncmp((*ppcNewArgV_p)[i], pcOpt, strlen(pcOpt))) { + bOutFormatOptSet = TRUE; + break; + } + } + } + if (FALSE == bOutFormatOptSet) { + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("--outfmt=clustal"); + } + + + /* old clustal was verbose by default + */ + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("-v"); + + /* old clustal used to overwrite files by default + */ + (*ppcNewArgV_p)[(*iNewArgC_p)++] = CkStrdup("--force"); + + fprintf(stderr, + "WARNING: Your old-style command-line options were converted to: "); + for (i=0; i<*iNewArgC_p; i++) { + fprintf(stderr, " %s", (*ppcNewArgV_p)[i]); + } + fprintf(stderr, "\n"); + } + +} +/* end ConvertOldCmdline */ + + + +int +main(int argc, char **argv) +{ + int new_argc = 0; + char **new_argv = NULL; + int i; /* aux */ + + ConvertOldCmdline(&new_argc, &new_argv, argc, argv); + + MyMain(new_argc, new_argv); + + for (i=0; i<new_argc; i++) { + free(new_argv[i]); + } + free(new_argv); + + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/mymain.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,998 @@ +/* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ + +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: mymain.c 242 2011-05-27 14:04:21Z andreas $ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include <unistd.h> +#include <argtable2.h> +#include <ctype.h> +#include <limits.h> +#include <libgen.h> /* for basename only */ + +/* clustal */ +#include "clustal-omega.h" + +#include "mymain.h" + +/* hhalign (parameters) */ +#include "hhalign/general.h" + +typedef struct { + + /* Sequence input + */ + /** sequence type (from cmdline arg) */ + int iSeqType; + /** sequence input file. not directly used by Align() */ + char *pcSeqInfile; + /** Dealign sequences on input. Otherwise we use the alignment + * info for background-HMM creation */ + bool bDealignInputSeqs; + + /* profiles: : pre-aligned sequences, whose alignment will not be changed + */ + /** profile 1: pre-aligned sequence input. not directly used by Align() */ + char *pcProfile1Infile ; + /** profile 2: pre-aligned sequence input. not directly used by Align() */ + char *pcProfile2Infile; + + /** Input limitations + */ + /** maximum allowed number of input sequences */ + int iMaxNumSeq; + /** maximum allowed input sequence length */ + int iMaxSeqLen; + + /* Alignment output + */ + /** alignment output file */ + char *pcAlnOutfile; + /** alignment output format */ + int iAlnOutFormat; + /** force overwriting of files */ + bool bForceFileOverwrite; + + /* multithreading + */ + /** number of threads */ + int iThreads; + + /* logging + */ + char *pcLogFile; + + opts_t aln_opts; + + /* changes here will have to be reflected in SetDefaultUserOpts(), + * FreeUserOpts(), PrintUserOpts() and UserOptsLogicCheck() etc + */ +} cmdline_opts_t; + + + +/* log-file used for non-essential logging in prLog */ +FILE *prLogFile = NULL; + + + +/** + * @brief Sets default user/commandline options + * + * @param[out] opts + * The option structure to initialise + * + */ +void +SetDefaultUserOpts(cmdline_opts_t *opts) +{ + + assert(NULL != opts); + + opts->iSeqType = SEQTYPE_UNKNOWN; + opts->pcSeqInfile = NULL; + opts->bDealignInputSeqs = FALSE; + opts->pcProfile1Infile = NULL; + opts->pcProfile2Infile = NULL; + + opts->iMaxNumSeq = INT_MAX; + opts->iMaxSeqLen = INT_MAX; + + opts->pcAlnOutfile = NULL; + opts->iAlnOutFormat = MSAFILE_A2M; + opts->bForceFileOverwrite = FALSE; + +#ifdef HAVE_OPENMP + /* defaults to # of CPUs */ + opts->iThreads = omp_get_max_threads(); +#else + opts->iThreads = 1; +#endif + + opts->pcLogFile = NULL; + + SetDefaultAlnOpts(& opts->aln_opts); +} +/* end of SetDefaultAlnOpts() */ + + + + +/** + * @brief FIXME add doc + * + */ +void +PrintUserOpts(FILE *prFile, cmdline_opts_t *opts) { + + /* keep in same order as in struct. FIXME could this be derived from argtable? + */ + /* we only allow protein anyway: fprintf(prFile, "seq-type = %s\n", SeqTypeToStr(opts->iSeqType)); */ + fprintf(prFile, "option: seq-in = %s\n", + NULL != opts->pcSeqInfile? opts->pcSeqInfile: "(null)"); + fprintf(prFile, "option: dealign = %d\n", opts->bDealignInputSeqs); + fprintf(prFile, "option: profile1 = %s\n", + NULL != opts->pcProfile1Infile? opts->pcProfile1Infile: "(null)"); + fprintf(prFile, "option: profile2 = %s\n", + NULL != opts->pcProfile2Infile? opts->pcProfile2Infile: "(null)"); + fprintf(prFile, "option: max-num-seq = %d\n", opts->iMaxNumSeq); + fprintf(prFile, "option: max-seq-len = %d\n", opts->iMaxSeqLen); + fprintf(prFile, "option: aln-out-file = %s\n", + NULL != opts->pcAlnOutfile? opts->pcAlnOutfile: "(null)"); + fprintf(prFile, "option: aln-out-format = %s\n", SeqfileFormat2String(opts->iAlnOutFormat)); + fprintf(prFile, "option: force-file-overwrite = %d\n", opts->bForceFileOverwrite); + fprintf(prFile, "option: threads = %d\n", opts->iThreads); + fprintf(prFile, "option: logFile = %s\n", opts->pcLogFile); +} +/* end of PrintUserOpts */ + + + +/** + * @brief Frees user opt members allocated during parsing + * + * @param[out] user_opts + * user options whose members are to free + * + * @see ParseCommandLine() + * + */ +void +FreeUserOpts(cmdline_opts_t *user_opts) +{ + + if (NULL != user_opts->pcSeqInfile) { + CKFREE(user_opts->pcSeqInfile); + } + if (NULL != user_opts->pcProfile1Infile) { + CKFREE(user_opts->pcProfile1Infile); + } + if (NULL != user_opts->pcProfile2Infile) { + CKFREE(user_opts->pcProfile2Infile); + } + if (NULL != user_opts->pcAlnOutfile) { + CKFREE(user_opts->pcAlnOutfile); + } + if (NULL != user_opts->pcLogFile) { + CKFREE(user_opts->pcLogFile); + } + + FreeAlnOpts(& user_opts->aln_opts); + + return; +} +/* end of FreeUserOpts() */ + + + + +/** + * @brief Do quick&dirty logic check of used options and call Log(&rLog, LOG_FATAL, ) in case + * of any inconsistencies + * + * @param[in] opts + * option structure to check + * + */ +void +UserOptsLogicCheck(cmdline_opts_t *opts) +{ + /* sequence input + * + */ + if (NULL == opts->pcSeqInfile) { + if (NULL == opts->pcProfile1Infile && NULL == opts->pcProfile2Infile) { + Log(&rLog, LOG_FATAL, "No sequence input was provided. For more information try: --help"); + } + } else { + if (NULL != opts->pcProfile1Infile && NULL != opts->pcProfile2Infile) { + Log(&rLog, LOG_FATAL, "Can't align two profile alignments AND a 'normal' sequence file"); + } + } + /* if a profile was given it should always be no 1, not 2 */ + if (NULL == opts->pcProfile1Infile && NULL != opts->pcProfile2Infile) { + Log(&rLog, LOG_FATAL, "Got a second profile, but no first one."); + } + + /* alignment output + */ + if (rLog.iLogLevelEnabled < LOG_WARN && NULL==opts->pcAlnOutfile && NULL==opts->pcLogFile) { + Log(&rLog, LOG_FATAL, "%s %s", + "You requested alignment output to stdout and verbose logging.", + " Alignment and log messages would get mixed up."); + } +} +/* end of UserOptsLogicCheck */ + + + +/** + * @brief Parse command line parameters. Will exit if help/usage etc + * are called or or call Log(&rLog, LOG_FATAL, ) if an error was detected. + * + * @param[out] user_opts + * User parameter struct, with defaults already set. + * @param[in] argc + * mains argc + * @param[in] argv + * mains argv + * + */ +void +ParseCommandLine(cmdline_opts_t *user_opts, int argc, char **argv) +{ + + /* argtable command line parsing: + * see + * http://argtable.sourceforge.net/doc/argtable2-intro.html + * + * basic structure is: arg_xxxN: + * xxx can be int, lit, db1, str, rex, file or date + * If N = 0, arguments may appear zero-or-once; N = 1 means + * exactly once, N = n means up to maxcount times + * + * + * @note: changes here, might also affect main.cpp:ConvertOldCmdLine() + * + */ + + struct arg_rem *rem_seq_input = arg_rem(NULL, "\nSequence Input:"); + struct arg_file *opt_seqin = arg_file0("i", "in,infile", + "{<file>,-}", + "Multiple sequence input file (- for stdin)"); + struct arg_file *opt_hmm_in = arg_filen(NULL, "hmm-in", "<file>", + /*min*/ 0, /*max*/ 128, + "HMM input files"); + struct arg_lit *opt_dealign = arg_lit0(NULL, "dealign", + "Dealign input sequences"); + struct arg_str *opt_seqtype = arg_str0("t", "seqtype", + "{Protein,RNA,DNA}", + "Force a sequence type (default: auto)"); + struct arg_file *opt_profile1 = arg_file0(NULL, "profile1,p1", + "<file>", + "Pre-aligned multiple sequence file (aligned columns will be kept fix)"); + struct arg_file *opt_profile2 = arg_file0(NULL, "profile2,p2", + "<file>", + "Pre-aligned multiple sequence file (aligned columns will be kept fix)"); + + + struct arg_rem *rem_guidetree = arg_rem(NULL, "\nClustering:"); + struct arg_str *opt_pairdist = arg_str0("p", "pairdist", + "{ktuple}", + "Pairwise alignment distance measure"); + struct arg_file *opt_distmat_in = arg_file0(NULL, "distmat-in", + "<file>", + "Pairwise distance matrix input file (skips distance computation)"); + struct arg_file *opt_distmat_out = arg_file0(NULL, "distmat-out", + "<file>", + "Pairwise distance matrix output file"); + struct arg_file *opt_guidetree_in = arg_file0(NULL, "guidetree-in", + "<file>", + "Guide tree input file (skips distance computation and guide-tree clustering step)"); + struct arg_file *opt_guidetree_out = arg_file0(NULL, "guidetree-out", + "<file>", + "Guide tree output file"); + struct arg_lit *opt_mbed = arg_lit0(NULL, "mbed", + "Fast, Mbed-like clustering for guide-tree calculation"); + struct arg_lit *opt_mbed_iter = arg_lit0(NULL, "mbed-iter", + "Use Mbed-like clustering also during iteration"); + struct arg_str *opt_clustering = arg_str0("c", "clustering", + "{UPGMA}", + "Clustering method for guide tree"); + + + struct arg_rem *rem_aln_output = arg_rem(NULL, "\nAlignment Output:"); + struct arg_file *opt_outfile = arg_file0("o", "out,outfile", + "{file,-}", + "Multiple sequence alignment output file (default: stdout)"); + struct arg_str *opt_outfmt = arg_str0(NULL, "outfmt", + "{a2m=fa[sta],clu[stal],msf,phy[lip],selex,st[ockholm],vie[nna]}", + "MSA output file format (default: fasta)"); + + + struct arg_rem *rem_iteration = arg_rem(NULL, "\nIteration:"); + struct arg_str *opt_num_iterations = arg_str0(NULL, "iterations,iter", + /* FIXME "{<n>,auto}", "Number of combined guide-tree/HMM iterations"); */ + "<n>", "Number of (combined guide-tree/HMM) iterations"); + struct arg_int *opt_max_guidetree_iterations = arg_int0(NULL, "max-guidetree-iterations", + "<n>", "Maximum number guidetree iterations"); + struct arg_int *opt_max_hmm_iterations = arg_int0(NULL, "max-hmm-iterations", + "<n>", "Maximum number of HMM iterations"); + + + struct arg_rem *rem_limits = arg_rem(NULL, "\nLimits (will exit early, if exceeded):"); + struct arg_int *opt_max_seq = arg_int0(NULL, "maxnumseq", "<n>", + "Maximum allowed number of sequences"); + struct arg_int *opt_max_seqlen = arg_int0(NULL, "maxseqlen", "<l>", + "Maximum allowed sequence length"); + + + struct arg_rem *rem_misc = arg_rem(NULL, "\nMiscellaneous:"); + + struct arg_lit *opt_autooptions = arg_lit0(NULL, "auto", + "Set options automatically (might overwrite some of your options)"); + struct arg_int *opt_threads = arg_int0(NULL, "threads", "<n>", + "Number of processors to use"); + struct arg_file *opt_logfile = arg_file0("l", "log", + "<file>", + "Log all non-essential output to this file"); + struct arg_lit *opt_help = arg_lit0("h", "help", + "Print this help and exit"); + struct arg_lit *opt_version = arg_lit0(NULL, "version", + "Print version information and exit"); + struct arg_lit *opt_long_version = arg_lit0(NULL, "long-version", + "Print long version information and exit"); + struct arg_lit *opt_verbose = arg_litn("v", "verbose", + 0, 3, + "Verbose output (increases if given multiple times)"); + struct arg_lit *opt_force = arg_lit0(NULL, "force", + "Force file overwriting"); + struct arg_int *opt_macram = arg_int0(NULL, "MAC-RAM", "<n>", /* keep this quiet for the moment, FS r240 -> */ + NULL/*"maximum amount of RAM to use for MAC algorithm (in MB)"*/); + + + struct arg_end *opt_end = arg_end(10); /* maximum number of errors + * to store */ + + void *argtable[] = {rem_seq_input, + opt_seqin, + opt_hmm_in, + opt_dealign, +#if 0 + /* unused since we only support protein for now */ + opt_seqtype, +#endif + opt_profile1, + opt_profile2, + + rem_guidetree, +#if 0 + /* no other options then default available or not implemented */ + opt_pairdist, +#endif + opt_distmat_in, + opt_distmat_out, + opt_guidetree_in, + opt_guidetree_out, + opt_mbed, + opt_mbed_iter, +#if 0 + /* no other options then default available */ + opt_clustering, +#endif + rem_aln_output, + opt_outfile, + opt_outfmt, + + rem_iteration, + opt_num_iterations, + opt_max_guidetree_iterations, + opt_max_hmm_iterations, + + rem_limits, + opt_max_seq, + opt_max_seqlen, + + rem_misc, + opt_autooptions, + opt_threads, + opt_logfile, + opt_help, + opt_verbose, + opt_version, + opt_long_version, + opt_force, + opt_macram, /* FS, r240 -> r241 */ + + opt_end}; + int nerrors; + + + /* Verify the argtable[] entries were allocated sucessfully + */ + if (arg_nullcheck(argtable)) { + Log(&rLog, LOG_FATAL, "insufficient memory (for argtable allocation)"); + } + + /* Parse the command line as defined by argtable[] + */ + nerrors = arg_parse(argc, argv, argtable); + + /* Special case: '--help' takes precedence over error reporting + */ + if (opt_help->count > 0) { + printf("%s - %s (%s)\n", PACKAGE_NAME, PACKAGE_VERSION, PACKAGE_CODENAME); + + printf("\n"); + printf("Check http://www.clustal.org for more information and updates.\n"); + + /*printf("\n"); + printf("FIXME more info e.g. how it works, pointers to references etc...\n"); + FIXME which paper to cite etc + */ + + + printf("\n"); + printf("Usage: %s", basename(argv[0])); + arg_print_syntax(stdout,argtable, "\n"); + + printf("\n"); + printf("A typical invocation would be: %s -i my-in-seqs.fa -o my-out-seqs.fa -v\n", + basename(argv[0])); + printf("See below for a list of all options.\n"); + + arg_print_glossary(stdout, argtable, " %-25s %s\n"); + arg_freetable(argtable, sizeof(argtable)/sizeof(argtable[0])); + exit(EXIT_SUCCESS); + } + + /* Special case: '--version' takes precedence over error reporting + */ + if (opt_version->count > 0) { + printf("%s\n", PACKAGE_VERSION); + arg_freetable(argtable,sizeof(argtable)/sizeof(argtable[0])); + exit(EXIT_SUCCESS); + } + + /* Special case: '--long-version' takes precedence over error reporting + */ + if (opt_long_version->count > 0) { + char zcLongVersion[1024]; + PrintLongVersion(zcLongVersion, sizeof(zcLongVersion)); + printf("%s\n", zcLongVersion); + arg_freetable(argtable,sizeof(argtable)/sizeof(argtable[0])); + exit(EXIT_SUCCESS); + } + + /* If the parser returned any errors then display them and exit + */ + if (nerrors > 0) { + /* Display the error details contained in the arg_end struct.*/ + arg_print_errors(stdout, opt_end, PACKAGE); + fprintf(stderr, "For more information try: %s --help\n", argv[0]); + arg_freetable(argtable,sizeof(argtable)/sizeof(argtable[0])); + exit(EXIT_FAILURE); + } + + + /* ------------------------------------------------------------ + * + * Command line successfully parsed. Now transfer values to + * user_opts. While doing so, make sure that given input files + * exist and given output files are writable do not exist, or if + * they do, should be overwritten. + * + * No logic checks here! They are done in a different function + * + * ------------------------------------------------------------*/ + + + /* not part of user_opts because it declared in src/util.h */ + if (0 == opt_verbose->count) { + rLog.iLogLevelEnabled = LOG_WARN; + } else if (1 == opt_verbose->count) { + rLog.iLogLevelEnabled = LOG_INFO; + } else if (2 == opt_verbose->count) { + rLog.iLogLevelEnabled = LOG_VERBOSE; + } else if (3 == opt_verbose->count) { + rLog.iLogLevelEnabled = LOG_DEBUG; + } + + user_opts->aln_opts.bAutoOptions = opt_autooptions->count; + + user_opts->bDealignInputSeqs = opt_dealign->count; + + user_opts->aln_opts.bUseMbed = opt_mbed->count; + + user_opts->aln_opts.bUseMbedForIteration = opt_mbed_iter->count; + + user_opts->bForceFileOverwrite = opt_force->count; + + + + /* log-file + */ + if (opt_logfile->count > 0) { + user_opts->pcLogFile = CkStrdup(opt_logfile->filename[0]); + + /* warn if already exists or not writable */ + if (FileExists(user_opts->pcLogFile) && ! user_opts->bForceFileOverwrite) { + Log(&rLog, LOG_FATAL, "%s '%s'. %s", + "Cowardly refusing to overwrite already existing file", + user_opts->pcLogFile, + "Use --force to force overwriting."); + } + if (! FileIsWritable(user_opts->pcLogFile)) { + Log(&rLog, LOG_FATAL, "Sorry, I do not have permission to write to file '%s'.", + user_opts->pcLogFile); + } + } + + + /* normal sequence input (no profile) + */ + if (opt_seqin->count > 0) { + user_opts->pcSeqInfile = CkStrdup(opt_seqin->filename[0]); + } + + /* Input limitations + */ + /* maximum number of sequences */ + if (opt_max_seq->count > 0) { + user_opts->iMaxNumSeq = opt_max_seq->ival[0]; + } + + /* maximum sequence length */ + if (opt_max_seqlen->count > 0) { + user_opts->iMaxSeqLen = opt_max_seqlen->ival[0]; + } + + /* Sequence type + */ + if (opt_seqtype->count > 0) { + if (STR_NC_EQ(opt_seqtype->sval[0], "protein")) { + user_opts->iSeqType = SEQTYPE_PROTEIN; + } else if (STR_NC_EQ(opt_seqtype->sval[0], "rna")) { + user_opts->iSeqType = SEQTYPE_RNA; + } else if (STR_NC_EQ(opt_seqtype->sval[0], "dna")) { + user_opts->iSeqType = SEQTYPE_DNA; + } else { + Log(&rLog, LOG_FATAL, "Unknown sequence type '%s'", opt_seqtype->sval[0]); + } + } + + /* Profile input + */ + if (opt_profile1->count > 0) { + user_opts->pcProfile1Infile = CkStrdup(opt_profile1->filename[0]); + if (! FileExists(user_opts->pcProfile1Infile)) { + Log(&rLog, LOG_FATAL, "File '%s' does not exist.", user_opts->pcProfile1Infile); + } + } + + if (opt_profile2->count > 0) { + user_opts->pcProfile2Infile = CkStrdup(opt_profile2->filename[0]); + if (! FileExists(user_opts->pcProfile2Infile)) { + Log(&rLog, LOG_FATAL, "File '%s' does not exist.", user_opts->pcProfile2Infile); + } + } + + + /* HMM input + */ + user_opts->aln_opts.iHMMInputFiles = 0; + user_opts->aln_opts.ppcHMMInput = NULL; + if (opt_hmm_in->count>0) { + int iAux; + user_opts->aln_opts.iHMMInputFiles = opt_hmm_in->count; + user_opts->aln_opts.ppcHMMInput = (char **) CKMALLOC( + user_opts->aln_opts.iHMMInputFiles * sizeof(char*)); + for (iAux=0; iAux<opt_hmm_in->count; iAux++) { + user_opts->aln_opts.ppcHMMInput[iAux] = CkStrdup(opt_hmm_in->filename[iAux]); + if (! FileExists(user_opts->aln_opts.ppcHMMInput[iAux])) { + Log(&rLog, LOG_FATAL, "File '%s' does not exist.", user_opts->aln_opts.ppcHMMInput[iAux]); + } + } + } + + + /* Pair distance method + */ + if (opt_pairdist->count > 0) { + if (STR_NC_EQ(opt_pairdist->sval[0], "ktuple")) { + user_opts->aln_opts.iPairDistType = PAIRDIST_KTUPLE; + } else { + Log(&rLog, LOG_FATAL, "Unknown pairdist method '%s'", opt_pairdist->sval[0]); + } + } + + + /* Distance matrix input + */ + if (opt_distmat_in->count > 0) { + user_opts->aln_opts.pcDistmatInfile = CkStrdup(opt_distmat_in->filename[0]); + if (! FileExists(user_opts->aln_opts.pcDistmatInfile)) { + Log(&rLog, LOG_FATAL, "File '%s' does not exist.", user_opts->aln_opts.pcDistmatInfile); + } + } + + + /* Distance matrix output + */ + if (opt_distmat_out->count > 0) { + user_opts->aln_opts.pcDistmatOutfile = CkStrdup(opt_distmat_out->filename[0]); + + /* warn if already exists or not writable */ + if (FileExists(user_opts->aln_opts.pcDistmatOutfile) && ! user_opts->bForceFileOverwrite) { + Log(&rLog, LOG_FATAL, "%s '%s'. %s", + "Cowardly refusing to overwrite already existing file", + user_opts->aln_opts.pcDistmatOutfile, + "Use --force to force overwriting."); + } + if (! FileIsWritable(user_opts->aln_opts.pcDistmatOutfile)) { + Log(&rLog, LOG_FATAL, "Sorry, I do not have permission to write to file '%s'.", + user_opts->aln_opts.pcDistmatOutfile); + } + } + + + /* Clustering + * + */ + if (opt_clustering->count > 0) { + if (STR_NC_EQ(opt_clustering->sval[0], "upgma")) { + user_opts->aln_opts.iClusteringType = CLUSTERING_UPGMA; + } else { + Log(&rLog, LOG_FATAL, "Unknown guide-tree clustering method '%s'", opt_clustering->sval[0]); + } + } + + + /* Guidetree input + */ + if (opt_guidetree_in->count > 0) { + user_opts->aln_opts.pcGuidetreeInfile = CkStrdup(opt_guidetree_in->filename[0]); + if (! FileExists(user_opts->aln_opts.pcGuidetreeInfile)) { + Log(&rLog, LOG_FATAL, "File '%s' does not exist.", user_opts->aln_opts.pcGuidetreeInfile); + } + } + + + /* Guidetree output + */ + if (opt_guidetree_out->count > 0) { + user_opts->aln_opts.pcGuidetreeOutfile = CkStrdup(opt_guidetree_out->filename[0]); + + /* warn if already exists or not writable */ + if (FileExists(user_opts->aln_opts.pcGuidetreeOutfile) && ! user_opts->bForceFileOverwrite) { + Log(&rLog, LOG_FATAL, "%s '%s'. %s", + "Cowardly refusing to overwrite already existing file", + user_opts->aln_opts.pcGuidetreeOutfile, + "Use --force to force overwriting."); + } + if (! FileIsWritable(user_opts->aln_opts.pcGuidetreeOutfile)) { + Log(&rLog, LOG_FATAL, "Sorry, I do not have permission to write to file '%s'.", + user_opts->aln_opts.pcGuidetreeOutfile); + } + } + + + /* max guidetree iterations + */ + if (opt_max_guidetree_iterations->count > 0) { + user_opts->aln_opts.iMaxGuidetreeIterations = opt_max_guidetree_iterations->ival[0]; + } + + + /* max guidetree iterations + */ + if (opt_max_hmm_iterations->count > 0) { + user_opts->aln_opts.iMaxHMMIterations = opt_max_hmm_iterations->ival[0]; + } + + /* number of iterations + */ + if (opt_num_iterations->count > 0) { + if (STR_NC_EQ(opt_num_iterations->sval[0], "auto")) { + Log(&rLog, LOG_FATAL, "Automatic iteration not supported at the moment."); + user_opts->aln_opts.bIterationsAuto = TRUE; + + } else { + int iAux; + user_opts->aln_opts.bIterationsAuto = FALSE; + for (iAux=0; iAux<(int)strlen(opt_num_iterations->sval[0]); iAux++) { + if (! isdigit(opt_num_iterations->sval[0][iAux])) { + Log(&rLog, LOG_FATAL, "Couldn't iteration parameter: %s", + opt_num_iterations->sval[0]); + } + } + user_opts->aln_opts.iNumIterations = atoi(opt_num_iterations->sval[0]); + } + } + + + /* Alignment output + */ + if (opt_outfile->count > 0) { + user_opts->pcAlnOutfile = CkStrdup(opt_outfile->filename[0]); + + /* warn if already exists or not writable */ + if (FileExists(user_opts->pcAlnOutfile) && ! user_opts->bForceFileOverwrite) { + Log(&rLog, LOG_FATAL, "%s '%s'. %s", + "Cowardly refusing to overwrite already existing file", + user_opts->pcAlnOutfile, + "Use --force to force overwriting."); + } + if (! FileIsWritable(user_opts->pcAlnOutfile)) { + Log(&rLog, LOG_FATAL, "Sorry, I do not have permission to write to file '%s'.", + user_opts->pcAlnOutfile); + } + } + + + /* Output format + */ + if (opt_outfmt->count > 0) { + /* avoid gcc warning about discarded qualifier */ + char *tmp = (char *)opt_outfmt->sval[0]; + user_opts->iAlnOutFormat = String2SeqfileFormat(tmp); + if (SQFILE_UNKNOWN == user_opts->iAlnOutFormat) { + Log(&rLog, LOG_FATAL, "Unknown output format '%s'", opt_outfmt->sval[0]); + } + } + + /* Number of threads + */ +#ifdef HAVE_OPENMP + if (opt_threads->count > 0) { + if (opt_threads->ival[0] <= 0) { + Log(&rLog, LOG_FATAL, "Changing number of threads to %d doesn't make sense.", + opt_threads->ival[0]); + } + user_opts->iThreads = opt_threads->ival[0]; + } + +#else + if (opt_threads->count > 0) { + if (opt_threads->ival[0] > 1) { + Log(&rLog, LOG_FATAL, "Cannot change number of threads to %d. %s was build without OpenMP support.", + opt_threads->ival[0], PACKAGE_NAME); + } + } +#endif + + + /* max MAC RAM (maximum amount of RAM set aside for MAC algorithm) + */ + if (opt_macram->count > 0) { /* FS, r240 -> r241 */ + user_opts->aln_opts.iMacRam = opt_macram->ival[0]; + } + + + + arg_freetable(argtable,sizeof(argtable)/sizeof(argtable[0])); + + UserOptsLogicCheck(user_opts); + + return; +} +/* end of ParseCommandLine() */ + + + + +/** + * + * @brief the 'real' main function + * + */ +int +MyMain(int argc, char **argv) +{ + mseq_t *prMSeq = NULL; + mseq_t *prMSeqProfile1 = NULL; + mseq_t *prMSeqProfile2 = NULL; + cmdline_opts_t cmdline_opts; + hhalign_para rHhalignPara = {0}; + + /* Must happen first: setup logger */ + LogDefaultSetup(&rLog); + + /*Log(&rLog, LOG_WARN, "This is a non-public realase of %s. Please do not distribute.", PACKAGE_NAME);*/ + Log(&rLog, LOG_WARN, "This is a beta version of %s, for protein only.", PACKAGE_NAME); /* FS, r237 -> 238 */ + + SetDefaultUserOpts(&(cmdline_opts)); + + ParseCommandLine(&cmdline_opts, argc, argv); + + if (NULL != cmdline_opts.pcLogFile) { + prLogFile = fopen(cmdline_opts.pcLogFile, "w"); + LogSetFP(&rLog, LOG_INFO, prLogFile); + LogSetFP(&rLog, LOG_VERBOSE, prLogFile); + LogSetFP(&rLog, LOG_DEBUG, prLogFile); + } + + InitClustalOmega(cmdline_opts.iThreads); + + if (rLog.iLogLevelEnabled < LOG_INFO) { + PrintUserOpts(LogGetFP(&rLog, LOG_INFO), & cmdline_opts); + PrintAlnOpts(LogGetFP(&rLog, LOG_INFO), & (cmdline_opts.aln_opts)); + } + /* write relevant command-line options for hhalign + * + */ + rHhalignPara.iMacRamMB = cmdline_opts.aln_opts.iMacRam; + + /* Read sequence file + * + */ + if (NULL != cmdline_opts.pcSeqInfile) { + NewMSeq(&prMSeq); + if (ReadSequences(prMSeq, cmdline_opts.pcSeqInfile, + cmdline_opts.iSeqType, + cmdline_opts.iMaxNumSeq, cmdline_opts.iMaxSeqLen)) { + Log(&rLog, LOG_FATAL, "Reading sequence file '%s' failed", cmdline_opts.pcSeqInfile); + } +#if TRACE + { + int iAux; + for (iAux=0; iAux<prMSeq->nseqs; iAux++) { + Log(&rLog, LOG_FORCED_DEBUG, "seq no %d: seq = %s", iAux, prMSeq->seq[iAux]); + LogSqInfo(&prMSeq->sqinfo[iAux]); + } + } +#endif + } + /* k-tuple pairwise distance calculation seg-faults if + * only one sequence, simply exit early. + * note that for profile/profile alignment prMSeq is NULL + * FS, r222->r223 */ + if (prMSeq && (prMSeq->nseqs <= 1)){ + Log(&rLog, LOG_FATAL, "File '%s' contains %d sequence%s, nothing to align", + cmdline_opts.pcSeqInfile, prMSeq->nseqs, 1==prMSeq->nseqs?"":"s"); + } + + /* Dealign if requested and neccessary + */ + if (NULL != prMSeq) { + if (TRUE == prMSeq->aligned && cmdline_opts.bDealignInputSeqs) { + Log(&rLog, LOG_INFO, "Dealigning already aligned input sequences as requested."); + DealignMSeq(prMSeq); + } + } + + + /* Read profile1 + * + */ + if (NULL != cmdline_opts.pcProfile1Infile) { + NewMSeq(&prMSeqProfile1); + if (ReadSequences(prMSeqProfile1, cmdline_opts.pcProfile1Infile, + cmdline_opts.iSeqType, + cmdline_opts.iMaxNumSeq, cmdline_opts.iMaxSeqLen)) { + Log(&rLog, LOG_FATAL, "Reading sequences from profile file '%s' failed", + cmdline_opts.pcProfile1Infile); + } + /* FIXME: commented out. FS, r240 -> r241 + * for explanation see below */ + /*if (1==prMSeqProfile1->nseqs) { + Log(&rLog, LOG_FATAL, "'%s' contains only one sequence and can therefore not be used as a profile", + cmdline_opts.pcProfile1Infile); + }*/ + if (FALSE == prMSeqProfile1->aligned) { + Log(&rLog, LOG_FATAL, "Sequences in '%s' are not aligned, i.e. this is not a profile", + cmdline_opts.pcProfile1Infile); + } + } + + + + /* Read profile2 + * + */ + if (NULL != cmdline_opts.pcProfile2Infile) { + NewMSeq(&prMSeqProfile2); + if (ReadSequences(prMSeqProfile2, cmdline_opts.pcProfile2Infile, + cmdline_opts.iSeqType, + cmdline_opts.iMaxNumSeq, cmdline_opts.iMaxSeqLen)) { + Log(&rLog, LOG_FATAL, "Reading sequences from profile file '%s' failed", + cmdline_opts.pcProfile2Infile); + } + /* FIXME: there is no (clean) way to align a single sequence to a profile. + * if we go down the -i route, it causes a seg-fault in the pair-wise + * k-tuple distance calculation. However, single sequences can be + * understood as 1-profiles. Therefore we have to allow for 1-profiles. + * FS, r240 -> r241 + */ + /*if (1==prMSeqProfile2->nseqs) { + Log(&rLog, LOG_FATAL, "'%s' contains only one sequence and can therefore not be used as a profile", + cmdline_opts.pcProfile2Infile); + }*/ + if (FALSE == prMSeqProfile1->aligned) { + Log(&rLog, LOG_FATAL, "Sequences in '%s' are not aligned, i.e. this is not a profile", + cmdline_opts.pcProfile2Infile); + } + } + + + /* Depending on the input we got perform + * + * (i) normal alignment: seq + optional profile + * or + * (ii) profile profile alignment + * + */ + if (NULL != prMSeq) { + if (Align(prMSeq, prMSeqProfile1, & cmdline_opts.aln_opts, rHhalignPara)) { + Log(&rLog, LOG_FATAL, "An error occured during the alignment"); + } + + if (WriteAlignment(prMSeq, cmdline_opts.pcAlnOutfile, + cmdline_opts.iAlnOutFormat)) { + Log(&rLog, LOG_FATAL, "Could not save alignment to %s", cmdline_opts.pcAlnOutfile); + } +#if 0 + { + bool bSampling = FALSE; /* better set to TRUE for many sequences */ + bool bReportAll = TRUE; + AliStat(prMSeq, bSampling, bReportAll); + } +#endif + + + } else if (NULL != prMSeqProfile1 && NULL != prMSeqProfile2) { + if (AlignProfiles(prMSeqProfile1, prMSeqProfile2, rHhalignPara)) { + Log(&rLog, LOG_FATAL, "An error occured during the alignment"); + } + if (WriteAlignment(prMSeqProfile1, cmdline_opts.pcAlnOutfile, + cmdline_opts.iAlnOutFormat)) { + Log(&rLog, LOG_FATAL, "Could not save alignment to %s", cmdline_opts.pcAlnOutfile); + } + } + + + /* cleanup + */ + if (NULL != prMSeq) { + FreeMSeq(&prMSeq); + } + if (NULL != prMSeqProfile1) { + FreeMSeq(&prMSeqProfile1); + } + if (NULL != prMSeqProfile2) { + FreeMSeq(&prMSeqProfile2); + } + + FreeUserOpts(&cmdline_opts); + + Log(&rLog, LOG_DEBUG, "Successful program exit"); + + if (NULL != cmdline_opts.pcLogFile) { + fclose(prLogFile); + } + return EXIT_SUCCESS; +} +/* end of MyMain() */ + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/mymain.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,23 @@ +/********************************************************************* + * Clustal Omega - Multiple sequence alignment + * + * Copyright (C) 2010 University College Dublin + * + * Clustal-Omega 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 file is part of Clustal-Omega. + * + ********************************************************************/ + +/* + * RCS $Id: mymain.h 97 2010-07-12 15:30:26Z andreas $ + */ + + +extern int +MyMain(int argc, char **argv); + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/00README Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,39 @@ +SQUID - library of functions for biological sequence analysis +Copyright (C) 1992-2002 Washington University School of Medicine + +SQUID is a freely redistributable library of C code functions for +sequence analysis. SQUID also includes a number of small utility +programs. + +To install squid, see the file: + INSTALL -- instructions for installing the programs + +If you have any questions about redistributing squid or using +squid code in your own work, see the files: + COPYRIGHT -- copyright notice, and information on my distribution policy + LICENSE -- version 2 of the GNU Public License (see COPYRIGHT) + +For a web page with more information on squid, see: + http://www.genetics.wustl.edu/eddy/software/#squid + +You can always download the latest stable release of squid from: + ftp://ftp.genetics.wustl.edu/pub/eddy/software/squid.tar.gz + +The development codebase is available by anonymous CVS: + cvs -d :pserver:anonymous@skynet.wustl.edu:/repository/sre login + (password "anonymous") + cvs -d :pserver:anonymous@skynet.wustl.edu:/repository/sre checkout squid + +If you encounter any bugs in this library, or you have any questions +or comments, please e-mail me at the address below. Due to limited +personal time, I may not respond, but I do read all my mail. + + Sean Eddy + eddy@genetics.wustl.edu + + HHMI/Dept. of Genetics + Washington University School of Medicine + 660 South Euclid Box 8232 + Saint Louis Missouri 63110 + USA +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/COPYRIGHT Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,41 @@ +SQUID - a library of functions for biological sequence analysis +Copyright (C) 1992-2002 Washington University School of Medicine +All Rights Reserved + +This suite of programs is free software. You can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +In other words, you are free to modify, copy, or redistribute this +source code and its documentation in any way you like, but you must +distribute all derivative versions as free software under the same +terms that I've provided my code to you (i.e. the GNU General Public +License). This precludes any use of the code in proprietary or +commercial software unless your source code is made freely available. + +If you wish to use SQUID code under a different Open Source license +that's not compatible with the GPL (like the Artistic License, BSD +license, or the Netscape Public License), please contact me +(eddy@genetics.wustl.edu) for permission. + +Incorporation into commercial software under non-GPL terms is +possible, by arranging a license with the Washington University School +of Medicine Center for Technology Management (CTM). For this purpose, +the CTM is authorized to negotiate on behalf of the Howard Hughes +Medical Institute, the other copyright holder on the code. Certain +third party code modules may have to be removed from a non-GPL +distribution. Contact Jack Pincus (jhpincus@cris.com) to arrange +non-GPL licensing terms. + +This software is distributed in the hope that 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 HMMER release, in the file LICENSE; if not, write to +the Free Software Foundation, Inc., 675 Mass. Ave, Cambridge, MA 02139 +USA. + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/LICENSE Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,339 @@ + 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 + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/Makefile.am Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,43 @@ +# Replaces squids own automake files +# +# Some useful automake documentation: +# http://www.openismus.com/documents/linux/automake/automake.shtml +# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html + +#SUBDIRS = +EXTRA_DIST = COPYRIGHT LICENSE 00README clustalo.README squid-1.9g.tar.gz +#LDADD = + +# need DCLUSTALO here to enable Clustal specific squid patches +# CLUSTALO is also defined in ../config.h which is included by squid.h +# but some files do not include squid.h +AM_CFLAGS = -DCLUSTALO -DSRE_STRICT_ANSI @AM_CFLAGS@ + +noinst_LTLIBRARIES = libsquid.la + +libsquid_la_SOURCES = a2m.c aligneval.c alignio.c \ + clustal.c cluster.c \ + dayhoff.c \ + eps.c \ + file.c \ + getopt.c gki.c gki.h gsi.c gsi.h gsi64.c gsi64.h \ + hsregex.c \ + iupac.c \ + msa.c msa.h msf.c \ + phylip.c \ + revcomp.c rk.c rk.h \ + selex.c seqencode.c shuffle.c sqerror.c sqfuncs.h sqio.c squid.h squidcore.c \ + sre_ctype.c sre_math.c sre_random.c sre_random.h sre_string.c \ + ssi.c ssi.h stack.c stockholm.c stockholm.h stopwatch.c stopwatch.h \ + translate.c types.c vectorops.c \ + vectorops.h version.h \ + weight.c + +library_includedir=$(includedir)/clustalo/squid + +library_include_HEADERS = gki.h gsi64.h msa.h rk.h \ + squid.h stopwatch.h sqfuncs.h \ + sre_random.h ssi.h stockholm.h \ + vectorops.h version.h + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/Makefile.in Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,606 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# Replaces squids own automake files +# +# Some useful automake documentation: +# http://www.openismus.com/documents/linux/automake/automake.shtml +# http://www.bioinf.uni-freiburg.de/~mmann/HowTo/automake.html + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/squid +DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_prefix_config_h.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/ax_openmp.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsquid_la_LIBADD = +am_libsquid_la_OBJECTS = a2m.lo aligneval.lo alignio.lo clustal.lo \ + cluster.lo dayhoff.lo eps.lo file.lo getopt.lo gki.lo gsi.lo \ + gsi64.lo hsregex.lo iupac.lo msa.lo msf.lo phylip.lo \ + revcomp.lo rk.lo selex.lo seqencode.lo shuffle.lo sqerror.lo \ + sqio.lo squidcore.lo sre_ctype.lo sre_math.lo sre_random.lo \ + sre_string.lo ssi.lo stack.lo stockholm.lo stopwatch.lo \ + translate.lo types.lo vectorops.lo weight.lo +libsquid_la_OBJECTS = $(am_libsquid_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libsquid_la_SOURCES) +DIST_SOURCES = $(libsquid_la_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(library_includedir)" +HEADERS = $(library_include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +#LDADD = + +# need DCLUSTALO here to enable Clustal specific squid patches +# CLUSTALO is also defined in ../config.h which is included by squid.h +# but some files do not include squid.h +AM_CFLAGS = -DCLUSTALO -DSRE_STRICT_ANSI @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_LDFLAGS = @AM_LDFLAGS@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_CODENAME = @PACKAGE_CODENAME@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#SUBDIRS = +EXTRA_DIST = COPYRIGHT LICENSE 00README clustalo.README squid-1.9g.tar.gz +noinst_LTLIBRARIES = libsquid.la +libsquid_la_SOURCES = a2m.c aligneval.c alignio.c \ + clustal.c cluster.c \ + dayhoff.c \ + eps.c \ + file.c \ + getopt.c gki.c gki.h gsi.c gsi.h gsi64.c gsi64.h \ + hsregex.c \ + iupac.c \ + msa.c msa.h msf.c \ + phylip.c \ + revcomp.c rk.c rk.h \ + selex.c seqencode.c shuffle.c sqerror.c sqfuncs.h sqio.c squid.h squidcore.c \ + sre_ctype.c sre_math.c sre_random.c sre_random.h sre_string.c \ + ssi.c ssi.h stack.c stockholm.c stockholm.h stopwatch.c stopwatch.h \ + translate.c types.c vectorops.c \ + vectorops.h version.h \ + weight.c + +library_includedir = $(includedir)/clustalo/squid +library_include_HEADERS = gki.h gsi64.h msa.h rk.h \ + squid.h stopwatch.h sqfuncs.h \ + sre_random.h ssi.h stockholm.h \ + vectorops.h version.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/squid/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/squid/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libsquid.la: $(libsquid_la_OBJECTS) $(libsquid_la_DEPENDENCIES) + $(LINK) $(libsquid_la_OBJECTS) $(libsquid_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/a2m.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aligneval.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alignio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clustal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cluster.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dayhoff.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eps.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gki.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsi64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hsregex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iupac.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msa.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/phylip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/revcomp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rk.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/seqencode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shuffle.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sqerror.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sqio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/squidcore.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sre_ctype.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sre_math.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sre_random.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sre_string.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stockholm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stopwatch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/translate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/types.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vectorops.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weight.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-library_includeHEADERS: $(library_include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(library_includedir)" || $(MKDIR_P) "$(DESTDIR)$(library_includedir)" + @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(library_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(library_includedir)" || exit $$?; \ + done + +uninstall-library_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(library_includedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(library_includedir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(library_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-library_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-library_includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-library_includeHEADERS install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-library_includeHEADERS + + +# 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:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/a2m.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,134 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* a2m.c + * + * reading/writing A2M (aligned FASTA) files. + * + * RCS $Id: a2m.c 242 2011-05-27 14:04:21Z andreas $ (Original squid RCS Id: a2m.c,v 1.1 1999/07/15 22:26:40 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "squid.h" +#include "msa.h" + +/* Function: ReadA2M() + * Date: SRE, Sun Jun 6 17:11:29 1999 [bus from Madison 1999 worm mtg] + * + * Purpose: Parse an alignment read from an open A2M format + * alignment file. A2M is a single alignment format. + * Return the alignment, or NULL if we've already + * read the alignment. + * + * Args: afp - open alignment file + * + * Returns: MSA * - an alignment object. + * Caller responsible for an MSAFree() + */ +MSA * +ReadA2M(MSAFILE *afp) +{ + MSA *msa; + char *buf; + char *name; + char *desc; + char *seq; + int idx; + int len1, len2; + + if (feof(afp->f)) return NULL; + + name = NULL; + msa = MSAAlloc(10, 0); + idx = 0; + while ((buf = MSAFileGetLine(afp)) != NULL) + { + if (*buf == '>') + { + buf++; /* skip the '>' */ + if ((name = sre_strtok(&buf, WHITESPACE, &len1)) == NULL) + Die("Blank name in A2M file %s (line %d)\n", afp->fname, afp->linenumber); + desc = sre_strtok(&buf, "\n", &len2); + + idx = GKIStoreKey(msa->index, name); + if (idx >= msa->nseqalloc) MSAExpand(msa); + + msa->sqname[idx] = sre_strdup(name, len1); + if (desc != NULL) MSASetSeqDescription(msa, idx, desc); + msa->nseq++; + } + else if (name != NULL) + { + if ((seq = sre_strtok(&buf, WHITESPACE, &len1)) == NULL) continue; + msa->sqlen[idx] = sre_strcat(&(msa->aseq[idx]), msa->sqlen[idx], seq, len1); + } + } + if (name == NULL) { MSAFree(msa); return NULL; } + + MSAVerifyParse(msa); + return msa; +} + + +/* Function: WriteA2M() + * Date: SRE, Sun Jun 6 17:40:35 1999 [bus from Madison, 1999 worm mtg] + * + * Purpose: Write an "aligned FASTA" (aka a2m, to UCSC) formatted + * alignment. + * + * Args: fp - open FILE to write to. + * msa - alignment to write + * + * Returns: void + */ +void +#ifdef CLUSTALO +WriteA2M(FILE *fp, MSA *msa, int vienna) +#else +WriteA2M(FILE *fp, MSA *msa) +#endif +{ + int idx; /* sequence index */ + int pos; /* position in sequence */ + char buf[64]; /* buffer for individual lines */ + int cpl = 60; /* char per line; must be < 64 unless buf is bigger */ + + buf[cpl] = '\0'; + for (idx = 0; idx < msa->nseq; idx++) + { +#ifdef CLUSTALO + /* most fasta sequences don't have a description, which + * leads to a trailing white space in the original code + */ + fprintf(fp, ">%s", msa->sqname[idx]); + + if (msa->sqdesc != NULL && msa->sqdesc[idx] != NULL && !vienna) { + fprintf(fp, " %s", msa->sqdesc[idx]); + } + fprintf(fp, "\n"); +#else + fprintf(fp, ">%s %s\n", + msa->sqname[idx], + (msa->sqdesc != NULL && msa->sqdesc[idx] != NULL) ? msa->sqdesc[idx] : ""); +#endif + for (pos = 0; pos < msa->alen; pos+=cpl) + { + strncpy(buf, &(msa->aseq[idx][pos]), cpl); + if (vienna) + fprintf(fp, "%s", buf); + else + fprintf(fp, "%s\n", buf); + } + if (vienna) + fprintf(fp, "\n"); + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/aligneval.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,527 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* aligneval.c + * + * Comparison of multiple alignments. Three functions are + * provided, using subtly different scoring schemes: + * CompareMultAlignments() - basic scoring scheme + * CompareRefMultAlignments() - only certain "canonical" columns + * are scored + * + * The similarity measure is a fractional alignment identity averaged + * over all sequence pairs. The score for all pairs is: + * (identically aligned symbols) / (total aligned columns in + * known alignment) + * + * A column c is identically aligned for sequences i, j if: + * 1) both i,j have a symbol aligned in column c, and the + * same pair of symbols is aligned somewhere in the test + * alignment + * 2) S[i][c] is aligned to a gap in sequence j, and that symbol + * is aligned to a gap in the test alignment + * 3) converse of 2) + * + * + * The algorithm is as follows: + * 1) For each known/test aligned pair of sequences (k1,k2 and t1,t2) + * construct a list for each sequence, in which for every + * counted symbol we record the raw index of the symbol in + * the other sequence that it aligns to, or -1 if it aligns + * to a gap or uncounted symbol. + * + * 2) Compare the list for k1 to the list for t1 and count an identity + * for each correct alignment. + * + * 3) Repeat 2) for comparing k2 to t2. Note that this means correct sym/sym + * alignments count for 2; correct sym/gap alignments count for 1. + * + * 4) The score is (identities from 2 + identities from 3) / + * (totals from 2 + totals from 3). + * + * Written originally for koala's ss2 pairwise alignment package. + * + * Sean Eddy, Sun Nov 1 12:45:11 1992 + * SRE, Thu Jul 29 16:47:18 1993: major revision: all functions replaced by new algorithm + * CVS $Id: aligneval.c,v 1.7 2002/10/09 14:26:09 eddy Exp) + */ + + +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" +#include "sre_random.h" + +static int make_alilist(char *s1, char *s2, int **ret_s1_list, int *ret_listlen); +static int make_ref_alilist(int *refcoords, char *k1, char *k2, char *s1, char *s2, + int **ret_s1_list, int *ret_listlen); +static int compare_lists(int *k1, int *k2, int *t1, int *t2, int len1, int len2, float *ret_sc); + + +/* Function: ComparePairAlignments + * + * Purpose: Calculate and return a number representing how well two different alignments + * of a pair of sequences compare. The number is, roughly speaking, + * the fraction of columns which are identically aligned. + * + * For all columns c in which either known1[c] or known2[c] + * is a non-gap, count an identity if those same symbols are + * aligned somewhere in calc1/calc2. The score is identities/total + * columns examined. (i.e. fully gapped columns don't count) + * + * more explicitly, identities come from: + * both known and test aligned pairs have the same symbol in the first sequence aligned to + * a gap in the second sequence; + * both known and test aligned pairs have the same symbol in the second sequence + * aligned to a gap in the first sequence; + * the known alignment has symbols aligned at this column, and the test + * alignment aligns the same two symbols. + * + * Args: known1, known2: trusted alignment of two sequences + * calc1, calc2: test alignment of two sequences + * + * Return: Returns -1.0 on internal failure. + */ +float +ComparePairAlignments(char *known1, char *known2, char *calc1, char *calc2) +{ + int *klist1; + int *klist2; + int *tlist1; + int *tlist2; + int len1, len2; + float score; + + if (! make_alilist(calc1, calc2, &tlist1, &len1)) return -1.0; + if (! make_alilist(calc2, calc1, &tlist2, &len2)) return -1.0; + if (! make_alilist(known1, known2, &klist1, &len1)) return -1.0; + if (! make_alilist(known2, known1, &klist2, &len2)) return -1.0; + if (! compare_lists(klist1, klist2, tlist1, tlist2, len1, len2, &score)) return -1.0; + + free(klist1); + free(klist2); + free(tlist1); + free(tlist2); + return score; +} + + + +/* Function: CompareRefPairAlignments() + * + * Same as above, but the only columns that count are the ones + * with indices in *refcoord. *refcoord and the known1, known2 + * pair must be in sync with each other (come from the same + * multiple sequence alignment) + * + * Args: ref - 0..alen-1 array of 1 or 0 + * known1,known2 - trusted alignment + * calc1, calc2 - test alignment + * + * Return: the fractional alignment identity on success, -1.0 on failure. + */ +float +CompareRefPairAlignments(int *ref, char *known1, char *known2, char *calc1, char *calc2) +{ + int *klist1; + int *klist2; + int *tlist1; + int *tlist2; + int len1, len2; + float score; + + if (! make_ref_alilist(ref, known1, known2, calc1, calc2, &tlist1, &len1)) return -1.0; + if (! make_ref_alilist(ref, known2, known1, calc2, calc1, &tlist2, &len2)) return -1.0; + if (! make_ref_alilist(ref, known1, known2, known1, known2, &klist1, &len1)) return -1.0; + if (! make_ref_alilist(ref, known2, known1, known2, known1, &klist2, &len2)) return -1.0; + if (! compare_lists(klist1, klist2, tlist1, tlist2, len1, len2, &score)) return -1.0; + + free(klist1); + free(klist2); + free(tlist1); + free(tlist2); + return score; +} + +/* Function: make_alilist() + * + * Purpose: Construct a list (array) mapping the raw symbols of s1 + * onto the indexes of the aligned symbols in s2 (or -1 + * for gaps in s2). The list (s1_list) will be of the + * length of s1's raw sequence. + * + * Args: s1 - sequence to construct the list for + * s2 - sequence s1 is aligned to + * ret_s1_list - RETURN: the constructed list (caller must free) + * ret_listlen - RETURN: length of the list + * + * Returns: 1 on success, 0 on failure + */ +static int +make_alilist(char *s1, char *s2, int **ret_s1_list, int *ret_listlen) +{ + int *s1_list; + int col; /* column position in alignment */ + int r1, r2; /* raw symbol index at current col in s1, s2 */ + + /* Malloc for s1_list. It can't be longer than s1 itself; we just malloc + * for that (and waste a wee bit of space) + */ + s1_list = (int *) MallocOrDie (sizeof(int) * strlen(s1)); + r1 = r2 = 0; + for (col = 0; s1[col] != '\0'; col++) + { + /* symbol in s1? Record what it's aligned to, and bump + * the r1 counter. + */ + if (! isgap(s1[col])) + { + s1_list[r1] = isgap(s2[col]) ? -1 : r2; + r1++; + } + + /* symbol in s2? bump the r2 counter + */ + if (! isgap(s2[col])) + r2++; + } + + *ret_listlen = r1; + *ret_s1_list = s1_list; + return 1; +} + + + +/* Function: make_ref_alilist() + * + * Purpose: Construct a list (array) mapping the raw symbols of s1 + * which are under canonical columns of the ref alignment + * onto the indexes of the aligned symbols in s2 (or -1 + * for gaps in s2 or noncanonical symbols in s2). + * + * Args: ref: - array of indices of canonical coords (1 canonical, 0 non) + * k1 - s1's known alignment (w/ respect to refcoords) + * k2 - s2's known alignment (w/ respect to refcoords) + * s1 - sequence to construct the list for + * s2 - sequence s1 is aligned to + * ret_s1_list - RETURN: the constructed list (caller must free) + * ret_listlen - RETURN: length of the list + * + * Returns: 1 on success, 0 on failure + */ +/*ARGSUSED*/ +static int +make_ref_alilist(int *ref, char *k1, char *k2, + char *s1, char *s2, int **ret_s1_list, int *ret_listlen) +{ + int *s1_list; + int col; /* column position in alignment */ + int r1, r2; /* raw symbol index at current col in s1, s2 */ + int *canons1; /* flag array, 1 if position i in s1 raw seq is canonical */ + int lpos; /* position in list */ + + /* Allocations. No arrays can exceed the length of their + * appropriate parent (s1 or s2) + */ + s1_list = (int *) MallocOrDie (sizeof(int) * strlen(s1)); + canons1 = (int *) MallocOrDie (sizeof(int) * strlen(s1)); + + /* First we use refcoords and k1,k2 to construct an array of 1's + * and 0's, telling us whether s1's raw symbol number i is countable. + * It's countable simply if it's under a canonical column. + */ + r1 = 0; + for (col = 0; k1[col] != '\0'; col++) + { + if (! isgap(k1[col])) + { + canons1[r1] = ref[col] ? 1 : 0; + r1++; + } + } + + /* Now we can construct the list. We don't count pairs if the sym in s1 + * is non-canonical. + * We have to keep separate track of our position in the list (lpos) + * from our positions in the raw sequences (r1,r2) + */ + r1 = r2 = lpos = 0; + for (col = 0; s1[col] != '\0'; col++) + { + if (! isgap(s1[col]) && canons1[r1]) + { + s1_list[lpos] = isgap(s2[col]) ? -1 : r2; + lpos++; + } + + if (! isgap(s1[col])) + r1++; + if (! isgap(s2[col])) + r2++; + } + + free(canons1); + *ret_listlen = lpos; + *ret_s1_list = s1_list; + return 1; +} + +/* Function: compare_lists() + * + * Purpose: Given four alignment lists (k1,k2, t1,t2), calculate the + * alignment score. + * + * Args: k1 - list of k1's alignment to k2 + * k2 - list of k2's alignment to k1 + * t1 - list of t1's alignment to t2 + * t2 - list of t2's alignment to t2 + * len1 - length of k1, t1 lists (same by definition) + * len2 - length of k2, t2 lists (same by definition) + * ret_sc - RETURN: identity score of alignment + * + * Return: 1 on success, 0 on failure. + */ +static int +compare_lists(int *k1, int *k2, int *t1, int *t2, int len1, int len2, float *ret_sc) +{ + float id; + float tot; + int i; + + id = tot = 0.0; + for (i = 0; i < len1; i++) + { + tot += 1.0; + if (t1[i] == k1[i]) id += 1.0; + } + + for ( i = 0; i < len2; i++) + { + tot += 1.0; + if (k2[i] == t2[i]) id += 1.0; + } + + *ret_sc = id / tot; + return 1; +} + + +/* Function: CompareMultAlignments + * + * Purpose: Invokes pairwise alignment comparison for every possible pair, + * and returns the average score over all N(N-1) of them or -1.0 + * on an internal failure. + * + * Can be slow for large N, since it's quadratic. + * + * Args: kseqs - trusted multiple alignment + * tseqs - test multiple alignment + * N - number of sequences + * + * Return: average identity score, or -1.0 on failure. + */ +float +CompareMultAlignments(char **kseqs, char **tseqs, int N) +{ + int i, j; /* counters for sequences */ + float score; + float tot_score = 0.0; + /* do all pairwise comparisons */ + for (i = 0; i < N; i++) + for (j = i+1; j < N; j++) + { + score = ComparePairAlignments(kseqs[i], kseqs[j], tseqs[i], tseqs[j]); + if (score < 0.0) return -1.0; + tot_score += score; + } + return ((tot_score * 2.0) / ((float) N * ((float) N - 1.0))); +} + + + +/* Function: CompareRefMultAlignments() + * + * Purpose: Same as above, except an array of reference coords for + * the canonical positions of the known alignment is also + * provided. + * + * Args: ref : 0..alen-1 array of 1/0 flags, 1 if canon + * kseqs : trusted alignment + * tseqs : test alignment + * N : number of sequences + * + * Return: average identity score, or -1.0 on failure + */ +float +CompareRefMultAlignments(int *ref, char **kseqs, char **tseqs, int N) +{ + int i, j; /* counters for sequences */ + float score; + float tot_score = 0.0; + + /* do all pairwise comparisons */ + for (i = 0; i < N; i++) + for (j = i+1; j < N; j++) + { + score = CompareRefPairAlignments(ref, kseqs[i], kseqs[j], tseqs[i], tseqs[j]); + if (score < 0.0) return -1.0; + tot_score += score; + } + return ((tot_score * 2.0)/ ((float) N * ((float) N - 1.0))); +} + +/* Function: PairwiseIdentity() + * + * Purpose: Calculate the pairwise fractional identity between + * two aligned sequences s1 and s2. This is simply + * (idents / MIN(len1, len2)). + * + * Note how many ways there are to calculate pairwise identity, + * because of the variety of choices for the denominator: + * idents/(idents+mismat) has the disadvantage that artifactual + * gappy alignments would have high "identities". + * idents/(AVG|MAX)(len1,len2) both have the disadvantage that + * alignments of fragments to longer sequences would have + * artifactually low "identities". + * + * Original Case sensitive; also, watch out in nucleic acid alignments; + * U/T RNA/DNA alignments will be counted as mismatches! + * + * Clustal Omega patch: Case insensitive and T and U are treated the same + */ +float +PairwiseIdentity(char *s1, char *s2) +{ + int idents; /* total identical positions */ + int len1, len2; /* lengths of seqs */ + int x; /* position in aligned seqs */ + + idents = len1 = len2 = 0; + for (x = 0; s1[x] != '\0' && s2[x] != '\0'; x++) + { +#ifdef CLUSTALO + char c1 = toupper(s1[x]); + char c2 = toupper(s2[x]); + if (c1=='U') + c1 = 'T'; + if (c2=='U') + c2 = 'T'; + + if (!isgap(c1)) { + len1++; + if (c1 == c2) + idents++; + } + if (!isgap(c2)) + len2++; +#else + if (!isgap(s1[x])) { + len1++; + if (s1[x] == s2[x]) idents++; + } + if (!isgap(s2[x])) len2++; +#endif + } + if (len2 < len1) len1 = len2; + return (len1 == 0 ? 0.0 : (float) idents / (float) len1); +} + + + +/* Function: AlignmentIdentityBySampling() + * Date: SRE, Mon Oct 19 14:29:01 1998 [St. Louis] + * + * Purpose: Estimate and return the average pairwise + * fractional identity of an alignment, + * using sampling. + * + * For use when there's so many sequences that + * an all vs. all rigorous calculation will + * take too long. + * + * Case sensitive! + * + * Args: aseq - aligned sequences + * L - length of alignment + * N - number of seqs in alignment + * nsample - number of samples + * + * Returns: average fractional identity, 0..1. + */ +float +AlignmentIdentityBySampling(char **aseq, int L, int N, int nsample) +{ + int x, i, j; /* counters */ + float sum; + + if (N < 2) return 1.0; + + sum = 0.; + for (x = 0; x < nsample; x++) + { + i = CHOOSE(N); + do { j = CHOOSE(N); } while (j == i); /* make sure j != i */ + sum += PairwiseIdentity(aseq[i], aseq[j]); + } + return sum / (float) nsample; +} + +/* Function: MajorityRuleConsensus() + * Date: SRE, Tue Mar 7 15:30:30 2000 [St. Louis] + * + * Purpose: Given a set of aligned sequences, produce a + * majority rule consensus sequence. If >50% nonalphabetic + * (usually meaning gaps) in the column, ignore the column. + * + * Args: aseq - aligned sequences, [0..nseq-1][0..alen-1] + * nseq - number of sequences + * alen - length of alignment + * + * Returns: ptr to allocated consensus sequence. + * Caller is responsible for free'ing this. + */ +char * +MajorityRuleConsensus(char **aseq, int nseq, int alen) +{ + char *cs; /* RETURN: consensus sequence */ + int count[27]; /* counts for a..z and gaps in a column */ + int idx,apos; /* counters for seq, column */ + int spos; /* position in cs */ + int x; /* counter for characters */ + int sym; + int max, bestx; + + cs = MallocOrDie(sizeof(char) * (alen+1)); + + for (spos=0,apos=0; apos < alen; apos++) + { + for (x = 0; x < 27; x++) count[x] = 0; + + for (idx = 0; idx < nseq; idx++) + { + if (isalpha(aseq[idx][apos])) { + sym = toupper(aseq[idx][apos]); + count[sym-'A']++; + } else { + count[26]++; + } + } + + if ((float) count[26] / (float) nseq <= 0.5) { + max = bestx = -1; + for (x = 0; x < 26; x++) + if (count[x] > max) { max = count[x]; bestx = x; } + cs[spos++] = (char) ('A' + bestx); + } + } + cs[spos] = '\0'; + return cs; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/alignio.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,639 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* alignio.c + * SRE, Mon Jul 12 11:57:37 1993 + * RCS $Id: alignio.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: alignio.c,v 1.11 2002/10/09 14:26:09 eddy Exp) + * + * Input/output of sequence alignments. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" +#include "sre_random.h" + +/* Function: AllocAlignment() + * + * Purpose: Allocate space for an alignment, given the number + * of sequences and the alignment length in columns. + * + * Args: nseq - number of sequences + * alen - width of alignment + * ret_aseq - RETURN: alignment itself + * ainfo - RETURN: other info associated with alignment + * + * Return: (void) + * aseq, ainfo free'd by caller: FreeAlignment(aseq, &ainfo). + * note that ainfo itself is alloc'ed in caller, usually + * just by a "AINFO ainfo" definition. + */ +void +AllocAlignment(int nseq, int alen, char ***ret_aseq, AINFO *ainfo) +{ + char **aseq; + int idx; + + InitAinfo(ainfo); + + aseq = (char **) MallocOrDie (sizeof(char *) * nseq); + for (idx = 0; idx < nseq; idx++) + aseq[idx] = (char *) MallocOrDie (sizeof(char) * (alen+1)); + + ainfo->alen = alen; + ainfo->nseq = nseq; + + ainfo->wgt = (float *) MallocOrDie (sizeof(float) * nseq); + FSet(ainfo->wgt, nseq, 1.0); + + ainfo->sqinfo = (SQINFO *) MallocOrDie (sizeof(SQINFO) * nseq); + for (idx = 0; idx < nseq; idx++) + ainfo->sqinfo[idx].flags = 0; + + *ret_aseq = aseq; +} + + +/* Function: InitAinfo() + * Date: SRE, Tue Jan 19 10:16:02 1999 [St. Louis] + * + * Purpose: Initialize the fields in ainfo structure to + * default (null) values. Does nothing with + * fields that are dependent on nseq or alen. + * + * Args: ainfo - optional info structure for an alignment + * + * Returns: (void). ainfo is modified. + */ +void +InitAinfo(AINFO *ainfo) +{ + ainfo->name = NULL; + ainfo->desc = NULL; + ainfo->cs = NULL; + ainfo->rf = NULL; + ainfo->acc = NULL; + ainfo->au = NULL; + ainfo->flags = 0; + + ainfo->tc1 = ainfo->tc2 = 0.0; + ainfo->nc1 = ainfo->nc2 = 0.0; + ainfo->ga1 = ainfo->ga2 = 0.0; +} + + +/* Function: FreeAlignment() + * + * Purpose: Free the space allocated to alignment, names, and optional + * information. + * + * Args: aseqs - sequence alignment + * ainfo - associated alignment data. + */ +void +FreeAlignment(char **aseqs, AINFO *ainfo) +{ + int i; + + for (i = 0; i < ainfo->nseq; i++) + { + if (ainfo->sqinfo[i].flags & SQINFO_SS) free(ainfo->sqinfo[i].ss); + if (ainfo->sqinfo[i].flags & SQINFO_SA) free(ainfo->sqinfo[i].sa); + } + if (ainfo->cs != NULL) free(ainfo->cs); + if (ainfo->rf != NULL) free(ainfo->rf); + if (ainfo->name != NULL) free(ainfo->name); + if (ainfo->desc != NULL) free(ainfo->desc); + if (ainfo->acc != NULL) free(ainfo->acc); + if (ainfo->au != NULL) free(ainfo->au); + + free(ainfo->sqinfo); + free(ainfo->wgt); + Free2DArray((void **) aseqs, ainfo->nseq); +} + + + +/* Function: SAMizeAlignment() + * Date: SRE, Tue Jun 30 09:49:40 1998 [St. Louis] + * + * Purpose: Make a "best effort" attempt to convert an alignment + * to SAM gap format: - in delete col, . in insert col. + * Only works if alignment adheres to SAM's upper/lower + * case convention, which is true for instance of old + * HMMER alignments. + * + * Args: aseq - alignment to convert + * nseq - number of seqs in alignment + * alen - length of alignment + * + * Returns: (void) + */ +void +SAMizeAlignment(char **aseq, int nseq, int alen) +{ + int col; /* counter for aligned columns */ + int i; /* counter for seqs */ + int sawlower, sawupper, sawgap; + char gapchar; + + for (col = 0; col < alen; col++) + { + sawlower = sawupper = sawgap = 0; + /* pass 1: do we see only upper or lower? */ + for (i = 0; i < nseq; i++) + { + if (isgap(aseq[i][col])) { sawgap = 1; continue; } + if (isupper((int) aseq[i][col])) { sawupper = 1; continue; } + if (islower((int) aseq[i][col])) sawlower = 1; + } + /* select gap character for column */ + gapchar = '-'; /* default */ + if (sawlower && ! sawupper) gapchar = '.'; + + /* pass 2: set gap char */ + for (i = 0; i < nseq; i++) + if (isgap(aseq[i][col])) aseq[i][col] = gapchar; + } +} + + +/* Function: SAMizeAlignmentByGapFrac() + * Date: SRE, Tue Jun 30 10:58:38 1998 [St. Louis] + * + * Purpose: Convert an alignment to SAM's gap and case + * conventions, using gap fraction in a column + * to choose match versus insert columns. In match columns, + * residues are upper case and gaps are '-'. + * In insert columns, residues are lower case and + * gaps are '.' + * + * Args: aseq - aligned sequences + * nseq - number of sequences + * alen - length of alignment + * maxgap - if more gaps than this fraction, column is insert. + * + * Returns: (void) Characters in aseq may be altered. + */ +void +SAMizeAlignmentByGapFrac(char **aseq, int nseq, int alen, float maxgap) +{ + int apos; /* counter over columns */ + int idx; /* counter over sequences */ + int ngap; /* number of gaps seen */ + + for (apos = 0; apos < alen; apos++) + { + /* count gaps */ + ngap = 0; + for (idx = 0; idx < nseq; idx++) + if (isgap(aseq[idx][apos])) ngap++; + + /* convert to SAM conventions */ + if ((float) ngap / (float) nseq > maxgap) + { /* insert column */ + for (idx = 0; idx < nseq; idx++) + if (isgap(aseq[idx][apos])) aseq[idx][apos] = '.'; + else aseq[idx][apos] = (char) tolower((int) aseq[idx][apos]); + } + else + { /* match column */ + for (idx = 0; idx < nseq; idx++) + if (isgap(aseq[idx][apos])) aseq[idx][apos] = '-'; + else aseq[idx][apos] = (char) toupper((int) aseq[idx][apos]); + } + } +} + + + + +/* Function: MakeAlignedString() + * + * Purpose: Given a raw string of some type (secondary structure, say), + * align it to a given aseq by putting gaps wherever the + * aseq has gaps. + * + * Args: aseq: template for alignment + * alen: length of aseq + * ss: raw string to align to aseq + * ret_s: RETURN: aligned ss + * + * Return: 1 on success, 0 on failure (and squid_errno is set.) + * ret_ss is malloc'ed here and must be free'd by caller. + */ +int +MakeAlignedString(char *aseq, int alen, char *ss, char **ret_s) +{ + char *new; + int apos, rpos; + + new = (char *) MallocOrDie ((alen+1) * sizeof(char)); + for (apos = rpos = 0; apos < alen; apos++) + if (! isgap(aseq[apos])) + { + new[apos] = ss[rpos]; + rpos++; + } + else + new[apos] = '.'; + new[apos] = '\0'; + + if (rpos != strlen(ss)) + { squid_errno = SQERR_PARAMETER; free(new); return 0; } + *ret_s = new; + return 1; +} + + +/* Function: MakeDealignedString() + * + * Purpose: Given an aligned string of some type (either sequence or + * secondary structure, for instance), dealign it relative + * to a given aseq. Return a ptr to the new string. + * + * Args: aseq : template alignment + * alen : length of aseq + * ss: : string to make dealigned copy of; same length as aseq + * ret_s : RETURN: dealigned copy of ss + * + * Return: 1 on success, 0 on failure (and squid_errno is set) + * ret_s is alloc'ed here and must be freed by caller + */ +int +MakeDealignedString(char *aseq, int alen, char *ss, char **ret_s) +{ + char *new; + int apos, rpos; + + new = (char *) MallocOrDie ((alen+1) * sizeof(char)); + for (apos = rpos = 0; apos < alen; apos++) + if (! isgap(aseq[apos])) + { + new[rpos] = ss[apos]; + rpos++; + } + new[rpos] = '\0'; + if (alen != strlen(ss)) + { squid_errno = SQERR_PARAMETER; free(new); return 0; } + *ret_s = new; + return 1; +} + + +/* Function: DealignedLength() + * + * Purpose: Count the number of non-gap symbols in seq. + * (i.e. find the length of the unaligned sequence) + * + * Args: aseq - aligned sequence to count symbols in, \0 terminated + * + * Return: raw length of seq. + */ +int +DealignedLength(char *aseq) +{ + int rlen; + for (rlen = 0; *aseq; aseq++) + if (! isgap(*aseq)) rlen++; + return rlen; +} + + +/* Function: WritePairwiseAlignment() + * + * Purpose: Write a nice formatted pairwise alignment out, + * with a BLAST-style middle line showing identities + * as themselves (single letter) and conservative + * changes as '+'. + * + * Args: ofp - open fp to write to (stdout, perhaps) + * aseq1, aseq2 - alignments to write (not necessarily + * flushed right with gaps) + * name1, name2 - names of sequences + * spos1, spos2 - starting position in each (raw) sequence + * pam - PAM matrix; positive values define + * conservative changes + * indent - how many extra spaces to print on left + * + * Return: 1 on success, 0 on failure + */ +int +WritePairwiseAlignment(FILE *ofp, + char *aseq1, char *name1, int spos1, + char *aseq2, char *name2, int spos2, + int **pam, int indent) +{ + char sname1[11]; /* shortened name */ + char sname2[11]; + int still_going; /* True if writing another block */ + char buf1[61]; /* buffer for writing seq1; CPL+1*/ + char bufmid[61]; /* buffer for writing consensus */ + char buf2[61]; + char *s1, *s2; /* ptrs into each sequence */ + int count1, count2; /* number of symbols we're writing */ + int rpos1, rpos2; /* position in raw seqs */ + int rawcount1, rawcount2; /* number of nongap symbols written */ + int apos; + + strncpy(sname1, name1, 10); + sname1[10] = '\0'; + strtok(sname1, WHITESPACE); + + strncpy(sname2, name2, 10); + sname2[10] = '\0'; + strtok(sname2, WHITESPACE); + + s1 = aseq1; + s2 = aseq2; + rpos1 = spos1; + rpos2 = spos2; + + still_going = TRUE; + while (still_going) + { + still_going = FALSE; + + /* get next line's worth from both */ + strncpy(buf1, s1, 60); buf1[60] = '\0'; + strncpy(buf2, s2, 60); buf2[60] = '\0'; + count1 = strlen(buf1); + count2 = strlen(buf2); + + /* is there still more to go? */ + if ((count1 == 60 && s1[60] != '\0') || + (count2 == 60 && s2[60] != '\0')) + still_going = TRUE; + + /* shift seq ptrs by a line */ + s1 += count1; + s2 += count2; + + /* assemble the consensus line */ + for (apos = 0; apos < count1 && apos < count2; apos++) + { + if (!isgap(buf1[apos]) && !isgap(buf2[apos])) + { + if (buf1[apos] == buf2[apos]) + bufmid[apos] = buf1[apos]; + else if (pam[buf1[apos] - 'A'][buf2[apos] - 'A'] > 0) + bufmid[apos] = '+'; + else + bufmid[apos] = ' '; + } + else + bufmid[apos] = ' '; + } + bufmid[apos] = '\0'; + + rawcount1 = 0; + for (apos = 0; apos < count1; apos++) + if (!isgap(buf1[apos])) rawcount1++; + + rawcount2 = 0; + for (apos = 0; apos < count2; apos++) + if (!isgap(buf2[apos])) rawcount2++; + + (void) fprintf(ofp, "%*s%-10.10s %5d %s %5d\n", indent, "", + sname1, rpos1, buf1, rpos1 + rawcount1 -1); + (void) fprintf(ofp, "%*s %s\n", indent, "", + bufmid); + (void) fprintf(ofp, "%*s%-10.10s %5d %s %5d\n", indent, "", + sname2, rpos2, buf2, rpos2 + rawcount2 -1); + (void) fprintf(ofp, "\n"); + + rpos1 += rawcount1; + rpos2 += rawcount2; + } + + return 1; +} + + +/* Function: MingapAlignment() + * + * Purpose: Remove all-gap columns from a multiple sequence alignment + * and its associated data. The alignment is assumed to be + * flushed (all aseqs the same length). + */ +int +MingapAlignment(char **aseqs, AINFO *ainfo) +{ + int apos; /* position in original alignment */ + int mpos; /* position in new alignment */ + int idx; + + /* We overwrite aseqs, using its allocated memory. + */ + for (apos = 0, mpos = 0; aseqs[0][apos] != '\0'; apos++) + { + /* check for all-gap in column */ + for (idx = 0; idx < ainfo->nseq; idx++) + if (! isgap(aseqs[idx][apos])) + break; + if (idx == ainfo->nseq) continue; + + /* shift alignment and ainfo */ + if (mpos != apos) + { + for (idx = 0; idx < ainfo->nseq; idx++) + aseqs[idx][mpos] = aseqs[idx][apos]; + + if (ainfo->cs != NULL) ainfo->cs[mpos] = ainfo->cs[apos]; + if (ainfo->rf != NULL) ainfo->rf[mpos] = ainfo->rf[apos]; + } + mpos++; + } + /* null terminate everything */ + for (idx = 0; idx < ainfo->nseq; idx++) + aseqs[idx][mpos] = '\0'; + ainfo->alen = mpos; /* set new length */ + if (ainfo->cs != NULL) ainfo->cs[mpos] = '\0'; + if (ainfo->rf != NULL) ainfo->rf[mpos] = '\0'; + return 1; +} + + + +/* Function: RandomAlignment() + * + * Purpose: Create a random alignment from raw sequences. + * + * Ideally, we would like to sample an alignment from the + * space of possible alignments according to its probability, + * given a prior probability distribution for alignments. + * I don't see how to describe such a distribution, let alone + * sample it. + * + * This is a rough approximation that tries to capture some + * desired properties. We assume the alignment is generated + * by a simple HMM composed of match and insert states. + * Given parameters (pop, pex) for the probability of opening + * and extending an insertion, we can find the expected number + * of match states, M, in the underlying model for each sequence. + * We use an average M taken over all the sequences (this is + * an approximation. The expectation of M given all the sequence + * lengths is a nasty-looking summation.) + * + * M = len / ( 1 + pop ( 1 + 1/ (1-pex) ) ) + * + * Then, we assign positions in each raw sequence onto the M match + * states and M+1 insert states of this "HMM", by rolling random + * numbers and inserting the (rlen-M) inserted positions randomly + * into the insert slots, taking into account the relative probability + * of open vs. extend. + * + * The resulting alignment has two desired properties: insertions + * tend to follow the HMM-like exponential distribution, and + * the "sparseness" of the alignment is controllable through + * pop and pex. + * + * Args: rseqs - raw sequences to "align", 0..nseq-1 + * sqinfo - array of 0..nseq-1 info structures for the sequences + * nseq - number of sequences + * pop - probability to open insertion (0<pop<1) + * pex - probability to extend insertion (0<pex<1) + * ret_aseqs - RETURN: alignment (flushed) + * ainfo - fill in: alignment info + * + * Return: 1 on success, 0 on failure. Sets squid_errno to indicate cause + * of failure. + */ +int +RandomAlignment(char **rseqs, SQINFO *sqinfo, int nseq, float pop, float pex, + char ***ret_aseqs, AINFO *ainfo) +{ + char **aseqs; /* RETURN: alignment */ + int alen; /* length of alignment */ + int *rlen; /* lengths of each raw sequence */ + int M; /* length of "model" */ + int **ins; /* insertion counts, 0..nseq-1 by 0..M */ + int *master_ins; /* max insertion counts, 0..M */ + int apos, rpos, idx; + int statepos; + int count; + int minlen; + + /* calculate expected length of model, M + */ + rlen = (int *) MallocOrDie (sizeof(int) * nseq); + M = 0; + minlen = 9999999; + for (idx = 0; idx < nseq; idx++) + { + rlen[idx] = strlen(rseqs[idx]); + M += rlen[idx]; + minlen = (rlen[idx] < minlen) ? rlen[idx] : minlen; + } + M = (int) ((float) M / (1.0 + pop * (1.0 + 1.0 / (1.0 - pex)))); + M /= nseq; + if (M > minlen) M = minlen; + + /* make arrays that count insertions in M+1 possible insert states + */ + ins = (int **) MallocOrDie (sizeof(int *) * nseq); + master_ins = (int *) MallocOrDie (sizeof(int) * (M+1)); + for (idx = 0; idx < nseq; idx++) + { + ins[idx] = (int *) MallocOrDie (sizeof(int) * (M+1)); + for (rpos = 0; rpos <= M; rpos++) + ins[idx][rpos] = 0; + } + /* normalize */ + pop = pop / (pop+pex); + pex = 1.0 - pop; + /* make insertions for individual sequences */ + for (idx = 0; idx < nseq; idx++) + { + apos = -1; + for (rpos = 0; rpos < rlen[idx]-M; rpos++) + { + if (sre_random() < pop || apos == -1) /* open insertion */ + apos = CHOOSE(M+1); /* choose 0..M */ + ins[idx][apos]++; + } + } + /* calculate master_ins, max inserts */ + alen = M; + for (apos = 0; apos <= M; apos++) + { + master_ins[apos] = 0; + for (idx = 0; idx < nseq; idx++) + if (ins[idx][apos] > master_ins[apos]) + master_ins[apos] = ins[idx][apos]; + alen += master_ins[apos]; + } + + + /* Now, construct alignment + */ + aseqs = (char **) MallocOrDie (sizeof (char *) * nseq); + for (idx = 0; idx < nseq; idx++) + aseqs[idx] = (char *) MallocOrDie (sizeof(char) * (alen+1)); + for (idx = 0; idx < nseq; idx++) + { + apos = rpos = 0; + + for (statepos = 0; statepos <= M; statepos++) + { + for (count = 0; count < ins[idx][statepos]; count++) + aseqs[idx][apos++] = rseqs[idx][rpos++]; + for (; count < master_ins[statepos]; count++) + aseqs[idx][apos++] = ' '; + + if (statepos != M) + aseqs[idx][apos++] = rseqs[idx][rpos++]; + } + aseqs[idx][alen] = '\0'; + } + ainfo->flags = 0; + ainfo->alen = alen; + ainfo->nseq = nseq; + ainfo->sqinfo = (SQINFO *) MallocOrDie (sizeof(SQINFO) * nseq); + for (idx = 0; idx < nseq; idx++) + SeqinfoCopy(&(ainfo->sqinfo[idx]), &(sqinfo[idx])); + + free(rlen); + free(master_ins); + Free2DArray((void **) ins, nseq); + *ret_aseqs = aseqs; + return 1; +} + +/* Function: AlignmentHomogenousGapsym() + * Date: SRE, Sun Mar 19 19:37:12 2000 [wren, St. Louis] + * + * Purpose: Sometimes we've got to convert alignments to + * a lowest common denominator, and we need + * a single specific gap character -- for example, + * PSI-BLAST blastpgp -B takes a very simplistic + * alignment input format which appears to only + * allow '-' as a gap symbol. + * + * Anything matching the isgap() macro is + * converted. + * + * Args: aseq - aligned character strings, [0..nseq-1][0..alen-1] + * nseq - number of aligned strings + * alen - length of alignment + * gapsym - character to use for gaps. + * + * Returns: void ("never fails") + */ +void +AlignmentHomogenousGapsym(char **aseq, int nseq, int alen, char gapsym) +{ + int i, apos; + + for (i = 0; i < nseq; i++) + for (apos = 0; apos < alen; apos++) + if (isgap(aseq[i][apos])) aseq[i][apos] = gapsym; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/clustal.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,329 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* clustal.c + * SRE, Sun Jun 6 17:50:45 1999 [bus from Madison, 1999 worm mtg] + * + * Import/export of ClustalV/W multiple sequence alignment + * formatted files. Derivative of msf.c; MSF is a pretty + * generic interleaved format. + * + * RCS $Id: clustal.c 228 2011-03-29 14:05:27Z dave $ (Original squid RCS Id: clustal.c,v 1.1 1999/07/15 22:26:53 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" +#include "msa.h" + +#ifdef CLUSTALO +/* needed for PACKAGE_VERSION */ +#include "../config.h" + +#ifndef min + #define min( a, b ) ( ((a) < (b)) ? (a) : (b) ) +#endif + +/*These are all the positively scoring groups that occur in the Gonnet Pam250 +matrix. There are strong and weak groups, defined as strong score >0.5 and +weak score =<0.5. Strong matching columns to be assigned ':' and weak matches +assigned '.' in the clustal output format. +amino_strong = res_cat1 +amino_weak = res_cat2 +*/ + +char *amino_strong[] = {"STA", "NEQK", "NHQK", "NDEQ", "QHRK", "MILV", + "MILF", "HY", "FYW", NULL}; + +char *amino_weak[] = {"CSA", "ATV", "SAG", "STNK", "STPA", "SGND", + "SNDEQK", "NDEQHK", "NEQHRK", "FVLIM", "HFY", NULL}; + +#endif + +#ifdef TESTDRIVE_CLUSTAL +/***************************************************************** + * msf.c test driver: + * cc -DTESTDRIVE_CLUSTAL -g -O2 -Wall -o test clustal.c msa.c gki.c sqerror.c sre_string.c file.c hsregex.c sre_math.c sre_ctype.c -lm + * + */ +int +main(int argc, char **argv) +{ + MSAFILE *afp; + MSA *msa; + char *file; + + file = argv[1]; + + if ((afp = MSAFileOpen(file, MSAFILE_CLUSTAL, NULL)) == NULL) + Die("Couldn't open %s\n", file); + + while ((msa = ReadClustal(afp)) != NULL) + { + WriteClustal(stdout, msa); + MSAFree(msa); + } + + MSAFileClose(afp); + exit(0); +} +/******************************************************************/ +#endif /* testdrive_clustal */ + + +/* Function: ReadClustal() + * Date: SRE, Sun Jun 6 17:53:49 1999 [bus from Madison, 1999 worm mtg] + * + * Purpose: Parse an alignment read from an open Clustal format + * alignment file. Clustal is a single-alignment format. + * Return the alignment, or NULL if we have no data. + * + * Args: afp - open alignment file + * + * Returns: MSA * - an alignment object + * caller responsible for an MSAFree() + * NULL if no more alignments + * + * Diagnostics: + * Will Die() here with a (potentially) useful message + * if a parsing error occurs. + */ +MSA * +ReadClustal(MSAFILE *afp) +{ + MSA *msa; + char *s; + int slen; + int sqidx; + char *name; + char *seq; + char *s2; + + if (feof(afp->f)) return NULL; + + /* Skip until we see the CLUSTAL header + */ + while ((s = MSAFileGetLine(afp)) != NULL) + { + if (strncmp(s, "CLUSTAL", 7) == 0 && + strstr(s, "multiple sequence alignment") != NULL) + break; + } + if (s == NULL) return NULL; + + msa = MSAAlloc(10, 0); + + /* Now we're in the sequence section. + * As discussed above, if we haven't seen a sequence name, then we + * don't include the sequence in the alignment. + * Watch out for conservation markup lines that contain *.: chars + */ + while ((s = MSAFileGetLine(afp)) != NULL) + { + if ((name = sre_strtok(&s, WHITESPACE, NULL)) == NULL) continue; + if ((seq = sre_strtok(&s, WHITESPACE, &slen)) == NULL) continue; + s2 = sre_strtok(&s, "\n", NULL); + + /* The test for a conservation markup line + */ + if (strpbrk(name, ".*:") != NULL && strpbrk(seq, ".*:") != NULL) + continue; + if (s2 != NULL) + Die("Parse failed at line %d, file %s: possibly using spaces as gaps", + afp->linenumber, afp->fname); + + /* It's not blank, and it's not a coord line: must be sequence + */ + sqidx = MSAGetSeqidx(msa, name, msa->lastidx+1); + msa->lastidx = sqidx; + msa->sqlen[sqidx] = sre_strcat(&(msa->aseq[sqidx]), msa->sqlen[sqidx], seq, slen); + } + + MSAVerifyParse(msa); /* verifies, and also sets alen and wgt. */ + return msa; +} + + +/* Function: WriteClustal() + * Date: SRE, Sun Jun 6 18:12:47 1999 [bus from Madison, worm mtg 1999] + * + * Purpose: Write an alignment in Clustal format to an open file. + * + * Args: fp - file that's open for writing. + * msa - alignment to write. + * + * Returns: (void) + */ +void +WriteClustal(FILE *fp, MSA *msa) +{ + int idx; /* counter for sequences */ + int len; /* tmp variable for name lengths */ + int namelen; /* maximum name length used */ + int pos; /* position counter */ + char buf[80]; /* buffer for writing seq */ + int cpl = 60; /* char per line (< 64) */ + + /* consensus line stuff */ + int subpos; + char first; + int bail; + int strong_bins[9]; + int weak_bins[11]; + int cons; + int bin; + + /* calculate max namelen used */ + namelen = 0; + for (idx = 0; idx < msa->nseq; idx++) + if ((len = strlen(msa->sqname[idx])) > namelen) + namelen = len; + +#ifdef CLUSTALO + fprintf(fp, "CLUSTAL O(%s) multiple sequence alignment\n", PACKAGE_VERSION); +#else + fprintf(fp, "CLUSTAL W(1.5) multiple sequence alignment\n"); +#endif + + /***************************************************** + * Write the sequences + *****************************************************/ + +#ifdef CLUSTALO + fprintf(fp, "\n"); /* original had two blank lines */ +#endif + + for (pos = 0; pos < msa->alen; pos += cpl) + { + fprintf(fp, "\n"); /* Blank line between sequence blocks */ + for (idx = 0; idx < msa->nseq; idx++) + { + strncpy(buf, msa->aseq[idx] + pos, cpl); + buf[cpl] = '\0'; +#ifdef CLUSTALO + fprintf(fp, "%-*s %s\n", namelen+5, msa->sqname[idx], buf); +#else + fprintf(fp, "%*s %s\n", namelen, msa->sqname[idx], buf); +#endif + } +#ifdef CLUSTALO + /* do consensus dots */ + + /* print namelen+5 spaces */ + for(subpos = 0; subpos <= namelen+5; subpos++) + fprintf(fp, " "); + + for(subpos = pos; subpos < min(pos + cpl, msa->alen); subpos++) + { + /* see if 100% conservation */ + first = msa->aseq[0][subpos]; + bail = 0; + for (idx = 1; idx < msa->nseq; idx++) + { + if(msa->aseq[idx][subpos] != first) + { + bail = 1; + break; + } + } + if(!bail) + fprintf(fp, "*"); + else + { + /* if not then check strong */ + for(bin = 0; bin < 9; bin++) + strong_bins[bin] = 0; /* clear the bins */ + + for(idx = 0; idx < msa->nseq; idx++) + { + switch(msa->aseq[idx][subpos]) + { + case 'S': strong_bins[0]++; break; + case 'T': strong_bins[0]++; break; + case 'A': strong_bins[0]++; break; + case 'N': strong_bins[1]++; strong_bins[2]++; strong_bins[3]++; break; + case 'E': strong_bins[1]++; strong_bins[3]++; break; + case 'Q': strong_bins[1]++; strong_bins[2]++; strong_bins[3]++; strong_bins[4]++; break; + case 'K': strong_bins[1]++; strong_bins[2]++; strong_bins[4]++; break; + case 'D': strong_bins[3]++; break; + case 'R': strong_bins[4]++; break; + case 'H': strong_bins[4]++; strong_bins[7]++; break; + case 'M': strong_bins[5]++; strong_bins[6]++; break; + case 'I': strong_bins[5]++; strong_bins[6]++; break; + case 'L': strong_bins[5]++; strong_bins[6]++; break; + case 'V': strong_bins[5]++; break; + case 'F': strong_bins[6]++; strong_bins[8]++; break; + case 'Y': strong_bins[7]++; strong_bins[8]++; break; + case 'W': strong_bins[8]++; break; + } + } + bail = 0; + for(bin = 0; bin < 9; bin++) + if(strong_bins[bin] == msa->nseq) + { + bail = 1; + break; + } + if(bail) + fprintf(fp, ":"); + else + { + /* check weak */ + for(bin = 0; bin < 11; bin++) + weak_bins[bin] = 0; /* clear the bins */ + + for(idx = 0; idx < msa->nseq; idx++) + { + switch(msa->aseq[idx][subpos]) + { + case 'C': weak_bins[0]++; break; + case 'S': weak_bins[0]++; weak_bins[2]++; weak_bins[3]++; weak_bins[4]++; weak_bins[5]++; weak_bins[6]++; break; + case 'A': weak_bins[0]++; weak_bins[1]++; weak_bins[2]++; weak_bins[4]++; break; + case 'T': weak_bins[1]++; weak_bins[3]++; weak_bins[4]++; break; + case 'V': weak_bins[1]++; weak_bins[9]++; break; + case 'G': weak_bins[2]++; break; + case 'N': weak_bins[3]++; weak_bins[5]++; weak_bins[6]++; weak_bins[7]++; weak_bins[8]++; break; + case 'K': weak_bins[3]++; weak_bins[6]++; weak_bins[7]++; weak_bins[8]++; break; + case 'D': weak_bins[5]++; weak_bins[6]++; weak_bins[7]++; break; + case 'E': weak_bins[6]++; weak_bins[7]++; weak_bins[8]++; break; + case 'Q': weak_bins[6]++; weak_bins[7]++; weak_bins[8]++; break; + case 'H': weak_bins[7]++; weak_bins[8]++; weak_bins[10]++; break; + case 'R': weak_bins[8]++; break; + case 'F': weak_bins[9]++; weak_bins[10]++; break; + case 'L': weak_bins[9]++; break; + case 'I': weak_bins[9]++; break; + case 'M': weak_bins[9]++; break; + case 'Y': weak_bins[10]++; break; + } + } + bail = 0; + for(bin = 0; bin < 11; bin++) + if(weak_bins[bin] == msa->nseq) + { + bail = 1; + break; + } + if(bail) + fprintf(fp, "."); + else + fprintf(fp, " "); + } + } + } + fprintf(fp,"\n"); +#endif + } + + return; +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/clustalo.README Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,9 @@ +This is a trimmed down and patched version of Sean Eddy's squid library version 1.9 +See squid-1.9g.tar.gz for the original files. +Downloaded from ftp://selab.janelia.org/pub/software/squid/ + +changes in source code are all done via #ifdef CLUSTALO, which is set via Makefile + +We use our own config header instead of squidconf (see squid.h) + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/cluster.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,543 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* cluster.c + * SRE, Sun Jul 18 09:49:47 1993 + * moved to squid Thu Mar 3 08:42:57 1994 + * RCS $Id: cluster.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: cluster.c,v 1.3 1999/07/15 22:32:16 eddy Exp) + * + * almost identical to bord.c, from fd + * also now contains routines for constructing difference matrices + * from alignments + * + * "branch ordering": Input a symmetric or upper-right-diagonal + * NxN difference matrix (usually constructed by pairwise alignment + * and similarity calculations for N sequences). Use the simple + * cluster analysis part of the Fitch/Margoliash tree-building algorithm + * (as described by Fitch and Margoliash 1967 as well as Feng + * and Doolittle 1987) to calculate the topology of an "evolutionary + * tree" consistent with the difference matrix. Returns an array + * which represents the tree. + * + * The input difference matrix is just an NxN matrix of floats. + * A good match is a small difference score (the algorithm is going + * to search for minima among the difference scores). The original difference + * matrix remains unchanged by the calculations. + * + * The output requires some explanation. A phylogenetic + * tree is a binary tree, with N "leaves" and N-1 "nodes". The + * topology of the tree may be completely described by N-1 structures + * containing two pointers; each pointer points to either a leaf + * or another node. Here, this is implemented with integer indices + * rather than pointers. An array of N-1 pairs of ints is returned. + * If the index is in the range (0..N-1), it is a "leaf" -- the + * number of one of the sequences. If the index is in the range + * (N..2N-2), it is another "node" -- (index-N) is the index + * of the node in the returned array. + * + * If both indices of a member of the returned array point to + * nodes, the tree is "compound": composed of more than one + * cluster of related sequences. + * + * The higher-numbered elements of the returned array were the + * first constructed, and hence represent the distal tips + * of the tree -- the most similar sequences. The root + * is node 0. + ****************************************************************** + * + * Algorithm + * + * INITIALIZATIONS: + * - copy the difference matrix (otherwise the caller's copy would + * get destroyed by the operations of this algorithm). If + * it's asymmetric, make it symmetric. + * - make a (0..N-1) array of ints to keep track of the indices in + * the difference matrix as they get swapped around. Initialize + * this matrix to 0..N-1. + * - make a (0..N-2) array of int[2] to store the results (the tree + * topology). Doesn't need to be initialized. + * - keep track of a "N'", the current size of the difference + * matrix being operated on. + * + * PROCESSING THE DIFFERENCE MATRIX: + * - for N' = N down to N' = 2 (N-1 steps): + * - in the half-diagonal N'xN' matrix, find the indices i,j at which + * there's the minimum difference score + * + * Store the results: + * - at position N'-2 of the result array, store coords[i] and + * coords[j]. + * + * Move i,j rows, cols to the outside edges of the matrix: + * - swap row i and row N'-2 + * - swap row j and row N'-1 + * - swap column i and column N'-2 + * - swap column j and column N'-1 + * - swap indices i, N'-2 in the index array + * - swap indices j, N'-1 in the index array + * + * Build a average difference score for differences to i,j: + * - for all columns, find avg difference between rows i and j and store in row i: + * row[i][col] = (row[i][col] + row[j][col]) / 2.0 + * - copy the contents of row i to column i (it's a symmetric + * matrix, no need to recalculate) + * - store an index N'+N-2 at position N'-2 of the index array: means + * that this row/column is now a node rather than a leaf, and + * contains minimum values + * + * Continue: + * - go to the next N' + * + * GARBAGE COLLECTION & RETURN. + * + ********************************************************************** + * + * References: + * + * Feng D-F and R.F. Doolittle. "Progressive sequence alignment as a + * prerequisite to correct phylogenetic trees." J. Mol. Evol. + * 25:351-360, 1987. + * + * Fitch W.M. and Margoliash E. "Construction of phylogenetic trees." + * Science 155:279-284, 1967. + * + ********************************************************************** + * + * SRE, 18 March 1992 (bord.c) + * SRE, Sun Jul 18 09:52:14 1993 (cluster.c) + * added to squid Thu Mar 3 09:13:56 1994 + ********************************************************************** + * Mon May 4 09:47:02 1992: keep track of difference scores at each node + */ + + +#include <stdio.h> +#include <string.h> +#include <math.h> + +#include "squid.h" +#include "sqfuncs.h" + +#ifdef MEMDEBUG +#include "dbmalloc.h" +#endif + +/* Function: Cluster() + * + * Purpose: Cluster analysis on a distance matrix. Constructs a + * phylogenetic tree which contains the topology + * and info for each node: branch lengths, how many + * sequences are included under the node, and which + * sequences are included under the node. + * + * Args: dmx - the NxN distance matrix ( >= 0.0, larger means more diverged) + * N - size of mx (number of sequences) + * mode - CLUSTER_MEAN, CLUSTER_MAX, or CLUSTER_MIN + * ret_tree- RETURN: the tree + * + * Return: 1 on success, 0 on failure. + * The caller is responsible for freeing the tree's memory, + * by calling FreePhylo(tree, N). + */ +int +Cluster(float **dmx, int N, enum clust_strategy mode, struct phylo_s **ret_tree) +{ + struct phylo_s *tree; /* (0..N-2) phylogenetic tree */ + float **mx; /* copy of difference matrix */ + int *coord; /* (0..N-1), indices for matrix coords */ + int i, j; /* coords of minimum difference */ + int idx; /* counter over seqs */ + int Np; /* N', a working copy of N */ + int row, col; /* loop variables */ + float min; /* best minimum score found */ + float *trow; /* tmp pointer for swapping rows */ + float tcol; /* tmp storage for swapping cols */ + float *diff; /* (0..N-2) difference scores at nodes */ + int swapfoo; /* for SWAP() macro */ + + /************************** + * Initializations. + **************************/ + /* We destroy the matrix we work on, so make a copy of dmx. + */ + mx = MallocOrDie (sizeof(float *) * N); + for (i = 0; i < N; i++) + { + mx[i] = MallocOrDie (sizeof(float) * N); + for (j = 0; j < N; j++) + mx[i][j] = dmx[i][j]; + } + /* coord array alloc, (0..N-1) */ + coord = MallocOrDie (N * sizeof(int)); + diff = MallocOrDie ((N-1) * sizeof(float)); + /* init the coord array to 0..N-1 */ + for (col = 0; col < N; col++) coord[col] = col; + for (i = 0; i < N-1; i++) diff[i] = 0.0; + + /* tree array alloc, (0..N-2) */ + if ((tree = AllocPhylo(N)) == NULL) Die("AllocPhylo() failed"); + + /********************************* + * Process the difference matrix + *********************************/ + + /* N-prime, for an NxN down to a 2x2 diffmx */ + j= 0; /* just to silence gcc uninit warnings */ + for (Np = N; Np >= 2; Np--) + { + /* find a minimum on the N'xN' matrix*/ + min = 999999.; + for (row = 0; row < Np; row++) + for (col = row+1; col < Np; col++) + if (mx[row][col] < min) + { + min = mx[row][col]; + i = row; + j = col; + } + + /* We're clustering row i with col j. write necessary + * data into a node on the tree + */ + /* topology info */ + tree[Np-2].left = coord[i]; + tree[Np-2].right = coord[j]; + if (coord[i] >= N) tree[coord[i]-N].parent = N + Np - 2; + if (coord[j] >= N) tree[coord[j]-N].parent = N + Np - 2; + + /* keep score info */ + diff[Np-2] = tree[Np-2].diff = min; + + /* way-simple branch length estimation */ + tree[Np-2].lblen = tree[Np-2].rblen = min; + if (coord[i] >= N) tree[Np-2].lblen -= diff[coord[i]-N]; + if (coord[j] >= N) tree[Np-2].rblen -= diff[coord[j]-N]; + + /* number seqs included at node */ + if (coord[i] < N) + { + tree[Np-2].incnum ++; + tree[Np-2].is_in[coord[i]] = 1; + } + else + { + tree[Np-2].incnum += tree[coord[i]-N].incnum; + for (idx = 0; idx < N; idx++) + tree[Np-2].is_in[idx] |= tree[coord[i]-N].is_in[idx]; + } + + if (coord[j] < N) + { + tree[Np-2].incnum ++; + tree[Np-2].is_in[coord[j]] = 1; + } + else + { + tree[Np-2].incnum += tree[coord[j]-N].incnum; + for (idx = 0; idx < N; idx++) + tree[Np-2].is_in[idx] |= tree[coord[j]-N].is_in[idx]; + } + + + /* Now build a new matrix, by merging row i with row j and + * column i with column j; see Fitch and Margoliash + */ + /* Row and column swapping. */ + /* watch out for swapping i, j away: */ + if (i == Np-1 || j == Np-2) + SWAP(i,j); + + if (i != Np-2) + { + /* swap row i, row N'-2 */ + trow = mx[Np-2]; mx[Np-2] = mx[i]; mx[i] = trow; + /* swap col i, col N'-2 */ + for (row = 0; row < Np; row++) + { + tcol = mx[row][Np-2]; + mx[row][Np-2] = mx[row][i]; + mx[row][i] = tcol; + } + /* swap coord i, coord N'-2 */ + SWAP(coord[i], coord[Np-2]); + } + + if (j != Np-1) + { + /* swap row j, row N'-1 */ + trow = mx[Np-1]; mx[Np-1] = mx[j]; mx[j] = trow; + /* swap col j, col N'-1 */ + for (row = 0; row < Np; row++) + { + tcol = mx[row][Np-1]; + mx[row][Np-1] = mx[row][j]; + mx[row][j] = tcol; + } + /* swap coord j, coord N'-1 */ + SWAP(coord[j], coord[Np-1]); + } + + /* average i and j together; they're now + at Np-2 and Np-1 though */ + i = Np-2; + j = Np-1; + /* merge by saving avg of cols of row i and row j */ + for (col = 0; col < Np; col++) + { + switch (mode) { + case CLUSTER_MEAN: mx[i][col] =(mx[i][col]+ mx[j][col]) / 2.0; break; + case CLUSTER_MIN: mx[i][col] = MIN(mx[i][col], mx[j][col]); break; + case CLUSTER_MAX: mx[i][col] = MAX(mx[i][col], mx[j][col]); break; + default: mx[i][col] =(mx[i][col]+ mx[j][col]) / 2.0; break; + } + } + /* copy those rows to columns */ + for (col = 0; col < Np; col++) + mx[col][i] = mx[i][col]; + /* store the node index in coords */ + coord[Np-2] = Np+N-2; + } + + /************************** + * Garbage collection and return + **************************/ + Free2DArray((void **) mx, N); + free(coord); + free(diff); + *ret_tree = tree; + return 1; +} + +/* Function: AllocPhylo() + * + * Purpose: Allocate space for a phylo_s array. N-1 structures + * are allocated, one for each node; in each node, a 0..N + * is_in flag array is also allocated and initialized to + * all zeros. + * + * Args: N - size; number of sequences being clustered + * + * Return: pointer to the allocated array + * + */ +struct phylo_s * +AllocPhylo(int N) +{ + struct phylo_s *tree; + int i; + + if ((tree = (struct phylo_s *) malloc ((N-1) * sizeof(struct phylo_s))) == NULL) + return NULL; + + for (i = 0; i < N-1; i++) + { + tree[i].diff = 0.0; + tree[i].lblen = tree[i].rblen = 0.0; + tree[i].left = tree[i].right = tree[i].parent = -1; + tree[i].incnum = 0; + if ((tree[i].is_in = (char *) calloc (N, sizeof(char))) == NULL) + return NULL; + } + return tree; +} + + +/* Function: FreePhylo() + * + * Purpose: Free a clustree array that was built to cluster N sequences. + * + * Args: tree - phylogenetic tree to free + * N - size of clustree; number of sequences it clustered + * + * Return: (void) + */ +void +FreePhylo(struct phylo_s *tree, int N) +{ + int idx; + + for (idx = 0; idx < N-1; idx++) + free(tree[idx].is_in); + free(tree); +} + + +/* Function: MakeDiffMx() + * + * Purpose: Given a set of aligned sequences, construct + * an NxN fractional difference matrix. (i.e. 1.0 is + * completely different, 0.0 is exactly identical). + * + * Args: aseqs - flushed, aligned sequences + * num - number of aseqs + * ret_dmx - RETURN: difference matrix + * + * Return: 1 on success, 0 on failure. + * Caller must free diff matrix with FMX2Free(dmx) + */ +void +MakeDiffMx(char **aseqs, int num, float ***ret_dmx) +{ + float **dmx; /* RETURN: distance matrix */ + int i,j; /* counters over sequences */ + + /* Allocate 2D float matrix + */ + dmx = FMX2Alloc(num, num); + + /* Calculate distances; symmetric matrix + * record difference, not identity (1 - identity) + */ + for (i = 0; i < num; i++) + for (j = i; j < num; j++) + dmx[i][j] = dmx[j][i] = 1.0 - PairwiseIdentity(aseqs[i], aseqs[j]); + + *ret_dmx = dmx; + return; +} + +/* Function: MakeIdentityMx() + * + * Purpose: Given a set of aligned sequences, construct + * an NxN fractional identity matrix. (i.e. 1.0 is + * completely identical, 0.0 is completely different). + * Virtually identical to MakeDiffMx(). It's + * less confusing to have two distinct functions, I find. + * + * Args: aseqs - flushed, aligned sequences + * num - number of aseqs + * ret_imx - RETURN: identity matrix (caller must free) + * + * Return: 1 on success, 0 on failure. + * Caller must free imx using FMX2Free(imx) + */ +void +MakeIdentityMx(char **aseqs, int num, float ***ret_imx) +{ + float **imx; /* RETURN: identity matrix */ + int i,j; /* counters over sequences */ + + /* Allocate 2D float matrix + */ + imx = FMX2Alloc(num, num); + + /* Calculate distances, symmetric matrix + */ + for (i = 0; i < num; i++) + for (j = i; j < num; j++) + imx[i][j] = imx[j][i] = PairwiseIdentity(aseqs[i], aseqs[j]); + + *ret_imx = imx; + return; +} + + + +/* Function: PrintNewHampshireTree() + * + * Purpose: Print out a tree in the "New Hampshire" standard + * format. See PHYLIP's draw.doc for a definition of + * the New Hampshire format. + * + * Like a CFG, we generate the format string left to + * right by a preorder tree traversal. + * + * Args: fp - file to print to + * ainfo- alignment info, including sequence names + * tree - tree to print + * N - number of leaves + * + */ +void +PrintNewHampshireTree(FILE *fp, AINFO *ainfo, struct phylo_s *tree, int N) +{ + struct intstack_s *stack; + int code; + float *blen; + int docomma; + + blen = (float *) MallocOrDie (sizeof(float) * (2*N-1)); + stack = InitIntStack(); + PushIntStack(stack, N); /* push root on stack */ + docomma = FALSE; + + /* node index code: + * 0..N-1 = leaves; indexes of sequences. + * N..2N-2 = interior nodes; node-N = index of node in tree structure. + * code N is the root. + * 2N..3N-2 = special flags for closing interior nodes; node-2N = index in tree + */ + while (PopIntStack(stack, &code)) + { + if (code < N) /* we're a leaf. */ + { + /* 1) print name:branchlength */ + if (docomma) fputs(",", fp); + fprintf(fp, "%s:%.5f", ainfo->sqinfo[code].name, blen[code]); + docomma = TRUE; + } + + else if (code < 2*N) /* we're an interior node */ + { + /* 1) print a '(' */ + if (docomma) fputs(",\n", fp); + fputs("(", fp); + /* 2) push on stack: ), rchild, lchild */ + PushIntStack(stack, code+N); + PushIntStack(stack, tree[code-N].right); + PushIntStack(stack, tree[code-N].left); + /* 3) record branch lengths */ + blen[tree[code-N].right] = tree[code-N].rblen; + blen[tree[code-N].left] = tree[code-N].lblen; + docomma = FALSE; + } + + else /* we're closing an interior node */ + { + /* print a ):branchlength */ + if (code == 2*N) fprintf(fp, ");\n"); + else fprintf(fp, "):%.5f", blen[code-N]); + docomma = TRUE; + } + } + + FreeIntStack(stack); + free(blen); + return; +} + + +/* Function: PrintPhylo() + * + * Purpose: Debugging output of a phylogenetic tree structure. + */ +void +PrintPhylo(FILE *fp, AINFO *ainfo, struct phylo_s *tree, int N) +{ + int idx; + + for (idx = 0; idx < N-1; idx++) + { + fprintf(fp, "Interior node %d (code %d)\n", idx, idx+N); + fprintf(fp, "\tParent: %d (code %d)\n", tree[idx].parent-N, tree[idx].parent); + fprintf(fp, "\tLeft: %d (%s) %f\n", + tree[idx].left < N ? tree[idx].left-N : tree[idx].left, + tree[idx].left < N ? ainfo->sqinfo[tree[idx].left].name : "interior", + tree[idx].lblen); + fprintf(fp, "\tRight: %d (%s) %f\n", + tree[idx].right < N ? tree[idx].right-N : tree[idx].right, + tree[idx].right < N ? ainfo->sqinfo[tree[idx].right].name : "interior", + tree[idx].rblen); + fprintf(fp, "\tHeight: %f\n", tree[idx].diff); + fprintf(fp, "\tIncludes:%d seqs\n", tree[idx].incnum); + } +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/dayhoff.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,174 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* dayhoff.c + * + * Routines for dealing with PAM matrices. + * + * Includes: + * ParsePAMFile() -- read a PAM matrix from disk. + * + * + * SRE - Fri Apr 2 11:23:45 1993 + * RCS $Id: dayhoff.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: dayhoff.c,v 1.5 2002/07/03 15:03:39 eddy Exp) + */ + + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> +#include <ctype.h> +#include "squid.h" + +/* Function: ParsePAMFile() + * + * Purpose: Given a pointer to an open file containing a PAM matrix, + * parse the file and allocate and fill a 2D array of + * floats containing the matrix. The PAM file is + * assumed to be in the format that NCBI distributes + * with BLAST. BLOSUM matrices also work fine, as + * produced by Henikoff's program "MATBLAS". + * + * Parses both old format and new format BLAST matrices. + * Old format just had rows of integers. + * New format includes a leading character on each row. + * + * The PAM matrix is a 27x27 matrix, 0=A..25=Z,26=*. + * Note that it's not a 20x20 matrix as you might expect; + * this is for speed of indexing as well as the ability + * to deal with ambiguous characters. + * + * Args: fp - open PAM file + * ret_pam - RETURN: pam matrix, integers + * ret_scale - RETURN: scale factor for converting + * to real Sij. For instance, PAM120 is + * given in units of ln(2)/2. This may + * be passed as NULL if the caller + * doesn't care. + * + * Returns: 1 on success; 0 on failure and sets squid_errno to + * indicate the cause. ret_pam is allocated here and + * must be freed by the caller (use FreePAM). + */ +int +ParsePAMFile(FILE *fp, int ***ret_pam, float *ret_scale) +{ + int **pam; + char buffer[512]; /* input buffer from fp */ + int order[27]; /* order of fields, obtained from header */ + int nsymbols; /* total number of symbols in matrix */ + char *sptr; + int idx; + int row, col; + float scale; + int gotscale = FALSE; + + scale = 0.0; /* just to silence gcc uninit warnings */ + if (fp == NULL) { squid_errno = SQERR_NODATA; return 0; } + + /* Look at the first non-blank, non-comment line in the file. + * It gives single-letter codes in the order the PAM matrix + * is arrayed in the file. + */ + do { + if (fgets(buffer, 512, fp) == NULL) + { squid_errno = SQERR_NODATA; return 0; } + + /* Get the scale factor from the header. + * For BLOSUM files, we assume the line looks like: + * BLOSUM Clustered Scoring Matrix in 1/2 Bit Units + * and we assume that the fraction is always 1/x; + * + * For PAM files, we assume the line looks like: + * PAM 120 substitution matrix, scale = ln(2)/2 = 0.346574 + * and we assume that the number following the final '=' is our scale + */ + if (strstr(buffer, "BLOSUM Clustered Scoring Matrix") != NULL && + (sptr = strchr(buffer, '/')) != NULL) + { + sptr++; + if (! isdigit((int) (*sptr))) { squid_errno = SQERR_FORMAT; return 0; } + scale = (float) (log(2.0) / atof(sptr)); + gotscale = TRUE; + } + else if (strstr(buffer, "substitution matrix,") != NULL) + { + while ((sptr = strrchr(buffer, '=')) != NULL) { + sptr += 2; + if (IsReal(sptr)) { + scale = atof(sptr); + gotscale = TRUE; + break; + } + } + } + } while ((sptr = strtok(buffer, " \t\n")) == NULL || *sptr == '#'); + + idx = 0; + do { + order[idx] = (int) *sptr - (int) 'A'; + if (order[idx] < 0 || order[idx] > 25) order[idx] = 26; + idx++; + } while ((sptr = strtok(NULL, " \t\n")) != NULL); + nsymbols = idx; + + /* Allocate a pam matrix. For speed of indexing, we use + * a 27x27 matrix so we can do lookups using the ASCII codes + * of amino acid single-letter representations, plus one + * extra field to deal with the "*" (terminators). + */ + if ((pam = (int **) calloc (27, sizeof(int *))) == NULL) + Die("calloc failed"); + for (idx = 0; idx < 27; idx++) + if ((pam[idx] = (int *) calloc (27, sizeof(int))) == NULL) + Die("calloc failed"); + + /* Parse the rest of the file. + */ + for (row = 0; row < nsymbols; row++) + { + if (fgets(buffer, 512, fp) == NULL) + { squid_errno = SQERR_NODATA; return 0; } + + if ((sptr = strtok(buffer, " \t\n")) == NULL) + { squid_errno = SQERR_NODATA; return 0; } + for (col = 0; col < nsymbols; col++) + { + if (sptr == NULL) { squid_errno = SQERR_NODATA; return 0; } + + /* Watch out for new BLAST format, with leading characters + */ + if (*sptr == '*' || isalpha((int) *sptr)) + col--; /* hack hack */ + else + pam [order[row]] [order[col]] = atoi(sptr); + + sptr = strtok(NULL, " \t\n"); + } + } + + /* Return + */ + if (ret_scale != NULL) + { + if (gotscale) *ret_scale = scale; + else + { +#ifdef CLUSTALO + Warning("Failed to parse PAM matrix scale factor. Defaulting to ln(2)/2!"); +#else + Warn("Failed to parse PAM matrix scale factor. Defaulting to ln(2)/2!"); +#endif + *ret_scale = log(2.0) / 2.0; + } + } + *ret_pam = pam; + return 1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/eps.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,115 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* eps.c + * SRE, Thu Jun 21 18:02:31 2001 [St. Louis] + * + * Some crude support for Encapsulated PostScript (EPS) output, + * DSC compliant. + * + * CVS $Id: eps.c,v 1.4 2002/02/24 19:39:27 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "squid.h" +#include "msa.h" + +/* Function: EPSWriteSmallMSA() + * Date: SRE, Thu Jun 21 18:15:21 2001 [St. Louis] + * + * Purpose: Write an alignment in singleblock, Stockholm/SELEX like + * format to an open file. Very crude. + * Currently fails if the alignment is >50 columns long, because + * it doesn't think it will fit on a single page. + * + * Args: fp - open file for writing + * msa - alignment to write + * + * Returns: (void) + */ +void +EPSWriteSmallMSA(FILE *fp, MSA *msa) +{ + int namewidth; /* namewidth in PostScript units */ + int fontwidth; /* width of a character in this font */ + int hspace; /* horizontal space between aligned chars */ + int vspace; /* vertical space between sequences */ + char *font; /* font name, e.g. "Courier" */ + int fontsize; /* font size in pts */ + int i,j; /* counter over sequences, columns */ + int len; /* tmp var holding length of something */ + int width, height; /* width and height of bounding box */ + int xpos, ypos; /* x,y position */ + + /* Set some font characteristics; done here, so it'll + * be easy to change. Magic numbers for Courier 12 determined + * by trial and error. + */ + fontwidth = 8; + hspace = 9; + vspace = 15; + font = sre_strdup("Courier", -1); + fontsize = 12; + + /* Find the width of the longest sequence name in characters. + */ + namewidth = 0; + for (i = 0; i < msa->nseq; i++) + if ((len = (int) strlen(msa->sqname[i])) > namewidth) + namewidth = len; + namewidth += 1; /* add a space to separate name & aligned seq */ + namewidth *= fontwidth; + + /* Determine bounding box + */ + if (msa->alen > 50) Die("No EPS fmt if alignment is >50 columns"); + width = namewidth + hspace*msa->alen; + if (width > 612) Die("Alignment too wide to write in EPS"); + height = vspace*msa->nseq; + if (height > 792) Die("Too many seqs to write in EPS"); + + /* Magic EPS header, bare-bones DSC-compliant. + */ + fprintf(fp, "%%!PS-Adobe-3.0 EPSF-3.0\n"); + fprintf(fp, "%%%%BoundingBox: %d %d %d %d\n", 0, 0, width, height); + fprintf(fp, "%%%%Pages: 1\n"); + fprintf(fp, "%%%%EndComments\n"); + + /* More postscript magic before we start the alignment + */ + fprintf(fp, "/%s findfont\n", font); + fprintf(fp, "%d scalefont\n", fontsize); + fprintf(fp, "setfont\n"); + fprintf(fp, "newpath\n"); + + /* Write the alignment in PostScript in a single block + */ + for (i = 0; i < msa->nseq; i++) + { + ypos = (msa->nseq-i-1)*vspace; + /* name first */ + fprintf(fp, "%d %d moveto\n", 0, ypos); + fprintf(fp, "(%s) show\n", msa->sqname[i]); + /* now seq */ + xpos = namewidth; + for (j = 0; j < msa->alen; j++) + { + fprintf(fp, "%d %d moveto\n", xpos, ypos); + fprintf(fp, "(%c) show\n", msa->aseq[i][j]); + xpos+= hspace; + } + } + + free(font); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/file.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,271 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + + +/* file.c + * SRE, Wed Jun 19 11:19:22 1996 + * + * File operation utilities, dealing with pathnames, directories, + * and environment variables. + * + * The goal is to have these be platform-independent but they + * currently are UNIX-specific: i.e. this file is currently POSIX compliant + * but it is NOT ANSI C compliant. (The sole offender is getenv().) + * + * RCS $Id: file.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: file.c,v 1.8 2002/03/07 03:18:02 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "squid.h" +#include "sqfuncs.h" + +/* + * VMS: #define DIRSLASH ']' + * MacOS: #define DIRSLASH ':' + * DOS: #define DIRSLASH '\\' + * + * The code assumes that '.' is used for file name extensions, + * such as "foo.bar". + */ +#define DIRSLASH '/' /* UNIX directory paths have /foo/bar */ + + + +/* Function: FileDirname() + * + * Purpose: Returns the path from a filename: + * "/foo/bar/baz" -> "/foo/bar" + * "foo/bar" -> "foo" + * "foo" -> "." + * "/" -> "/" + * i.e. the string will be non-NULL; it will + * contain the string up to but not including the + * last '/' character; returns "." if + * there are no '/' characters, and returns "/" + * if the last slash is the first character. + * Modeled on Tcl's "file dirname" command. + * + * Args: file - name of file "/foo/bar/baz". + * + * Return: ptr to malloc'ed string "/foo/bar". + */ +char * +FileDirname(char *file) +{ + char *dirname; + char *lastslash; + int len; + + lastslash = strrchr(file, DIRSLASH); + len = (lastslash == NULL) ? 0 : (int) (lastslash - file); + dirname = (char *) MallocOrDie (sizeof(char) * (len+2)); + if (len > 0) strncpy(dirname, file, len); + else if (*file != DIRSLASH) { *dirname = '.'; len = 1; } + else { *dirname = DIRSLASH; len = 1; } + dirname[len] = '\0'; + return dirname; +} + + +/* Function: FileTail() + * + * Purpose: Return everything after the DIRSLASH: + * "/foo/bar/baz.1" -> "baz.1" + * "foo/bar" -> "bar" + * "foo" -> "foo" + * "/" -> "" + * If noextension is TRUE, removes a trailing ".foo" extension + * too. + * + * Args: file - name of file "/foo/bar/baz.1" + * noextension - TRUE to also remove extensions + * + * Return: ptr to malloc'ed string "baz.1" + */ +char * +FileTail(char *file, int noextension) +{ + char *tail; + char *lastslash; + char *lastdot; + /* remove directory prefix */ + lastslash = strrchr(file, DIRSLASH); + tail = (char *) MallocOrDie (sizeof(char) * (strlen(file)+1)); + if (lastslash == NULL) strcpy(tail, file); + else strcpy(tail, lastslash+1); + /* remove trailing suffix */ + if (noextension) { + if ((lastdot = strrchr(tail, '.')) != NULL) + *lastdot = '\0'; + } + + return tail; +} + + +/* Function: FileSameDirectory() + * Date: SRE, Wed Mar 6 20:03:23 2002 [St. Louis] + * + * Purpose: Given a path to one file, and the + * name of another file in the same directory, + * concat the path from file1 onto file2, and + * return the result. Caller must free the ptr + * that's returned. + * + * Written for SSI - SSI indices contain filenames + * without paths, and we will need to convert that + * to a full path. + * + * Args: file1 - a path to a file, e.g. "/foo/bar/baz.1" + * file2 - a simple filename, e.g. "quux.2" + * + * Returns: path to file2: e.g. "/foo/bar/quux.2" + * Returns NULL if file2 already has a path, and the result + * would be a different place. + */ +char * +FileSameDirectory(char *file1, char *file2) +{ + char *path; + char *tail; + char *result; + int seems_ok = 1; + + path = FileDirname(file1); + tail = FileTail(file2, FALSE); + if (strcmp(file2, tail) != 0) seems_ok = 0; /* ut-oh, file2 *had* a path */ + result = FileConcat(path, tail); + if (! seems_ok && strcmp(result, file2) != 0) { + free(result); result = NULL; + } + free(path); + free(tail); + return result; +} + +/* Function: FileConcat() + * + * Purpose: Concatenate a directory path and a file name, + * returning a pointer to a malloc'ed string with the + * full filename. This isn't just a string concat, + * because we're careful about the dir slash. + */ +char * +FileConcat(char *dir, char *file) +{ + char *full; + + full = (char *) MallocOrDie (sizeof(char) * (strlen(dir)+strlen(file)+2)); + if (*file == DIRSLASH) strcpy(full, file); /* file = "/foo", ignore directory. */ + else sprintf(full, "%s%c%s", dir, DIRSLASH, file); + return full; +} + + +/* Function: FileAddSuffix() + * Date: SRE, Wed Aug 1 11:19:33 2001 [Pasadena] + * + * Purpose: Add a suffix to a filename, return a malloc'ed + * string containing the new filename.sfx name. + * Example: + * FileAddSuffix("genbank", "ssi") + * returns "genbank.ssi". + */ +char * +FileAddSuffix(char *filename, char *sfx) +{ + char *new; + new = MallocOrDie(strlen(filename) + strlen(sfx) + 2); + sprintf(new, "%s.%s", filename, sfx); + return new; +} + +/* Function: EnvFileOpen() + * Date: Sun Feb 12 10:55:29 1995 + * + * Purpose: Open a file, given a file name and an environment + * variable that contains a directory path. Files + * are opened read-only. Does not look at current directory + * unless "." is explicitly in the path specified by env. + * + * For instance: + * fp = EnvFileOpen("BLOSUM45", "BLASTMAT", NULL); + * or: + * fp = EnvFileOpen("swiss", "BLASTDB", NULL); + * + * Environment variables may contain a colon-delimited + * list of more than one path; e.g. + * setenv BLASTDB /nfs/databases/foo:/nfs/databases/bar + * + * Sometimes a group of files may be found in + * one directory; for instance, an index file with a + * database. The caller can EnvFileOpen() the main + * file, and ask to get the name of the + * directory back in ret_dir, so it can construct + * the other auxiliary file names and fopen() them. (If it called + * EnvFileOpen(), it might get confused by + * file name clashes and open files in different + * directories. + * + * Args: fname - name of file to open + * env - name of environment variable containing path + * ret_dir - if non-NULL, RETURN: name of dir that was used. + * + * Return: FILE * to open file, or NULL on failure -- same as fopen() + * Caller must free ret_dir if it passed a non-NULL address. + */ +FILE * +EnvFileOpen(char *fname, char *env, char **ret_dir) +{ + FILE *fp; + char *path; + char *s; /* ptr to indiv element in env list */ + char full[1024]; /* constructed file name */ + + if (env == NULL) return NULL; + if ((path = Strdup(getenv(env))) == NULL) return NULL; + + fp = NULL; + s = strtok(path, ":"); + while (s != NULL) + { + if (((int) strlen(fname) + (int) strlen(s) + 2) > 1024) + { free(path); return NULL; } + sprintf(full, "%s%c%s", s, DIRSLASH, fname); + if ((fp = fopen(full, "r")) != NULL) break; + s = strtok(NULL, ":"); + } + + /* Return the path we used, if caller wants it + */ + if (ret_dir != NULL) *ret_dir = Strdup(s); + free(path); + + return fp; +} + + +/* Function: FileExists() + * + * Purpose: Return TRUE if filename exists. + * Testing fopen() is the only possible platform-independent test + * I'm aware of. + */ +int +FileExists(char *filename) +{ + FILE *fp; + if ((fp = fopen(filename, "r"))) { fclose(fp); return TRUE; } + return FALSE; +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/getopt.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,250 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* RCS $Id: getopt.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: getopt.c,v 1.7 2001/02/21 21:09:10 eddy Exp) + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include "squid.h" + +/* Function: Getopt() + * + * Purpose: Portable command line option parsing with abbreviated + * option switches. Replaces UNIX getopt(). Using UNIX getopt() + * hinders portability to non-UNIX platforms, and getopt() + * is also limited to single letter options. + * + * Getopt() implements a superset of UNIX getopt(). + * All of getopt()'s single-character switch behavior + * is emulated, and "--" by itself terminates the options. + * Additionally, Getopt() provides extended switches + * like "--youroptionhere", and Getopt() type checks + * arguments. + * + * Extended options must start with "--", as in "--option1". + * Normal options must start with "-", as in "-o". + * Normal options may be concatenated, as in "-a -b" == "-ab". + * + * See bottom of this .c file after #fdef GETOPT_TESTDRIVER + * for an example of calling Getopt(). + * + * Args: argc - from main(). number of elems in argv. + * argv - from main(). argv[0] is the name of the command. + * opt - array of opt_s structures, defining option switches + * nopts - number of switches in opt + * usage - a (possibly long) string to print if usage error. + * ret_optind - RETURN: the index in argv[] of the next + * valid command-line token. + * ret_optname- RETURN: ptr to the name of option switch + * seen, or NULL if no option was seen. + * ret_optarg - RETURN: ptr to the optional argument, if any; + * NULL if option takes no argument. + * + * Return: 1 if a valid option was parsed. + * 0 if no option was found, and command-line parsing is complete. + * Die()'s here if an error is detected. + */ +int +Getopt(int argc, char **argv, struct opt_s *opt, int nopts, char *usage, + int *ret_optind, char **ret_optname, char **ret_optarg) +{ + int i; + int arglen; + int nmatch; + static int optind = 1; /* init to 1 on first call */ + static char *optptr = NULL; /* ptr to next valid switch */ + int opti = 0; /* init only to silence gcc uninit warnings */ + + /* Check to see if we've run out of options. + * A '-' by itself is an argument (e.g. "read from stdin") + * not an option. + */ + if (optind >= argc || argv[optind][0] != '-' || strcmp(argv[optind], "-") == 0) + { + *ret_optind = optind; + *ret_optarg = NULL; + *ret_optname = NULL; + return 0; + } + + /* Check to see if we're being told that this is the end + * of the options with the special "--" flag. + */ + if (strcmp(argv[optind], "--") == 0) + { + optind++; + *ret_optind = optind; + *ret_optname = NULL; + *ret_optarg = NULL; + return 0; + } + + /* We have a real option. Find which one it is. + * We handle single letter switches "-o" separately + * from full switches "--option", based on the "-" vs. "--" + * prefix -- single letter switches can be concatenated + * as long as they don't have arguments. + */ + /* full option */ + if (optptr == NULL && strncmp(argv[optind], "--", 2) == 0) + { + /* Use optptr to parse argument in options of form "--foo=666" + */ + if ((optptr = strchr(argv[optind], '=')) != NULL) + { *optptr = '\0'; optptr++; } + + arglen = strlen(argv[optind]); + nmatch = 0; + for (i = 0; i < nopts; i++) + if (opt[i].single == FALSE && + strncmp(opt[i].name, argv[optind], arglen) == 0) + { + nmatch++; + opti = i; + if (arglen == strlen(opt[i].name)) break; /* exact match, stop now */ + } + if (nmatch > 1 && arglen != strlen(opt[i].name)) + Die("Option \"%s\" is ambiguous; please be more specific.\n%s", + argv[optind], usage); + if (nmatch == 0) + Die("No such option \"%s\".\n%s", argv[optind], usage); + + *ret_optname = opt[opti].name; + + /* Set the argument, if there is one + */ + if (opt[opti].argtype != sqdARG_NONE) + { + if (optptr != NULL) + { /* --foo=666 style */ + *ret_optarg = optptr; + optptr = NULL; + optind++; + } + else if (optind+1 >= argc) + Die("Option %s requires an argument\n%s", opt[opti].name, usage); + else /* "--foo 666" style */ + { + *ret_optarg = argv[optind+1]; + optind+=2; + } + } + else /* sqdARG_NONE */ + { + if (optptr != NULL) + Die("Option %s does not take an argument\n%s", opt[opti].name, usage); + *ret_optarg = NULL; + optind++; + } + } + else /* else, a single letter option "-o" */ + { + /* find the option */ + if (optptr == NULL) + optptr = argv[optind]+1; + for (opti = -1, i = 0; i < nopts; i++) + if (opt[i].single == TRUE && *optptr == opt[i].name[1]) + { opti = i; break; } + if (opti == -1) + Die("No such option \"%c\".\n%s", *optptr, usage); + *ret_optname = opt[opti].name; + + /* set the argument, if there is one */ + if (opt[opti].argtype != sqdARG_NONE) + { + if (*(optptr+1) != '\0') /* attached argument */ + { + *ret_optarg = optptr+1; + optind++; + } + else if (optind+1 < argc) /* unattached argument */ + { + *ret_optarg = argv[optind+1]; + optind+=2; + } + else Die("Option %s requires an argument\n%s", opt[opti].name, usage); + + optptr = NULL; /* can't concatenate after an argument */ + } + else /* sqdARG_NONE */ + { + *ret_optarg = NULL; + if (*(optptr+1) != '\0') /* concatenation */ + optptr++; + else + { + optind++; /* move to next field */ + optptr = NULL; + } + } + + } + + /* Type check the argument, if there is one + */ + if (opt[opti].argtype != sqdARG_NONE) + { + if (opt[opti].argtype == sqdARG_INT && ! IsInt(*ret_optarg)) + Die("Option %s requires an integer argument\n%s", + opt[opti].name, usage); + else if (opt[opti].argtype == sqdARG_FLOAT && ! IsReal(*ret_optarg)) + Die("Option %s requires a numerical argument\n%s", + opt[opti].name, usage); + else if (opt[opti].argtype == sqdARG_CHAR && strlen(*ret_optarg) != 1) + Die("Option %s requires a single-character argument\n%s", + opt[opti].name, usage); + /* sqdARG_STRING is always ok, no type check necessary */ + } + + *ret_optind = optind; + return 1; +} + + + +#ifdef GETOPT_TESTDRIVER +/* cc -DGETOPT_TESTDRIVER -L ~/lib/squid.linux/ getopt.c -lsquid + */ +struct opt_s OPTIONS[] = { + { "--test1", FALSE, sqdARG_INT }, + { "--test2", FALSE, sqdARG_FLOAT }, + { "--test3", FALSE, sqdARG_STRING }, + { "--test4", FALSE, sqdARG_CHAR }, + { "-a", TRUE, sqdARG_NONE }, + { "-b", TRUE, sqdARG_INT }, +}; +#define NOPTIONS (sizeof(OPTIONS) / sizeof(struct opt_s)) + +int +main(int argc, char **argv) +{ + int optind; + char *optarg; + char *optname; + + while (Getopt(argc, argv, OPTIONS, NOPTIONS, "Usage/help here", + &optind, &optname, &optarg)) + { + printf("Option: index: %d name: %s argument: %s\n", + optind, optname, optarg); + } + while (optind < argc) + { + printf("Argument: index: %d name: %s\n", optind, argv[optind]); + optind++; + } + + +} + + +#endif /*GETOPT_TESTDRIVER*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/gki.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,389 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* gki.c + * SRE, Sat May 1 14:49:08 1999 + * + * "generic key index" module: emulation of Perl hashes. + * Maps keys (ASCII char strings) to array index. Dynamically + * resizes the hash table. + * + * Limitations: + * - hash table can only grow; no provision for deleting keys + * or downsizing the hash table. + * - Maximum hash table size set at 100003. Performance + * will degrade for key sets much larger than this. + * - Assumes that integers are 32 bits (or greater). + * + * Defines a typedef'd structure: + * gki - a key index hash table. + * Provides functions: + * GKIInit() - start a hash table. + * GKIStoreKey() - store a new key, get a unique index. + * GKIKeyIndex() - retrieve an existing key's index. + * GKIFree() - free a hash table. + * GKIStatus() - Debugging: prints internal status of a hash struct + * + * + * Note that there are no dependencies on squid; the gki.c/gki.h + * pair are base ANSI C and can be reused anywhere. + ***************************************************************** + * + * API for storing/reading stuff: + * moral equivalent of Perl's $foo{$key} = whatever, $bar{$key} = whatever: + * #include "gki.h" + * + * gki *hash; + * int idx; + * char *key; + * + * hash = GKIInit(); + * (Storing:) + * (foreach key) { + * idx = GKIStoreKey(hash, key); + * (reallocate foo, bar as needed) + * foo[idx] = whatever; + * bar[idx] = whatever; + * } + * (Reading:) + * (foreach key) { + * idx = GKIKeyIndex(hash, key); + * if (idx == -1) {no_such_key; } + * (do something with) foo[idx]; + * (do something with) bar[idx]; + * } + * GKIFree(); + * + ***************************************************************** + * + * Timings on wrasse for 45402 keys in /usr/dict/words using + * Tests/test_gki: + * 250 msec store (6 usec/store) + * 140 msec retrieve (3 usec/retrieve) + * and using the 13408 names of Pfam's GP120.full alignment: + * 70 msec store (5 usec/store) + * 50 msec retrieve (4 usec/retrieve) + * + * RCS $Id: gki.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: gki.c,v 1.3 2000/12/21 23:42:59 eddy Exp) + */ + + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> +#include "squid.h" +#include "gki.h" + +/* + * Best hash table sizes are prime numbers (see Knuth vol 3, Sorting + * and Searching). + * gki_primes[] defines the ascending order of hash table sizes + * that we use in upsizing the hash table dynamically. + * useful site for testing primes: + * http://www.idbsu.edu/people/jbrennan/algebra/numbers/sieve.html + * Because of the way gki_hashvalue works, the largest number + * must be < INT_MAX / 128 / 128 : 131072 on a 32 bit machine. + */ +static int gki_primes[] = { 101, 1009, 10007, 100003 }; +#define GKI_NPRIMES 4 +#define GKI_ALPHABETSIZE 128 + +static GKI *gki_alloc(int primelevel); +static int gki_hashvalue(GKI *hash, char *key); +static int gki_upsize(GKI *old); + + +/* Function: GKIInit() + * Date: SRE, Sat May 1 11:12:24 1999 [May Day geek-out] + * + * Purpose: Initialize a hash table for key indexing. + * Simply a wrapper around a level 0 gki_alloc(). + * + * Args: (void) + * + * Returns: An allocated hash table structure. + * Caller frees with GKIFree(). + */ +GKI * +GKIInit(void) +{ + GKI *hash; + hash = gki_alloc(0); + return hash; +} + +/* Function: GKIFree() + * Date: SRE, Sat May 1 11:13:26 1999 [May Day geek-out] + * + * Purpose: Free a key index hash table. + * + * Args: hash - the gki structure + * + * Returns: (void). + * hash table is destroyed. + */ +void +GKIFree(GKI *hash) +{ + struct gki_elem *ptr; + int i; + + if (hash == NULL) return; /* tolerate a NULL */ + + for (i = 0; i < hash->nhash; i++) + while (hash->table[i] != NULL) + { + ptr = hash->table[i]->nxt; + /* NULL keys can occur after we've gki_upsize'd */ + if (hash->table[i]->key != NULL) free(hash->table[i]->key); + free(hash->table[i]); + hash->table[i] = ptr; + } + free(hash->table); + free(hash); +} + +/* Function: GKIStoreKey() + * Date: SRE, Sat May 1 11:16:48 1999 [May Day geek-out] + * + * Purpose: Store a key in the key index hash table. + * Associate it with a unique "key index", counting + * from 0. (It's this index that lets us map + * the hashed keys to indexed C arrays, (clumsily) + * emulating Perl's hashes.) + * + * Does *not* check to see if the key's already + * in the table, so it's possible to store multiple + * copies of a key with different indices; probably + * not what you want, so if you're not sure the + * key is unique, check the table first with + * GKIKeyIndex(). + * + * Args: hash - GKI structure to store the key in + * key - string to store + * + * Returns: the new key's index. Since it's always the + * last one in the current array, this index is + * just hash->nkeys-1. + * On a malloc failure, returns -1. + * hash table is modified. + */ +int +GKIStoreKey(GKI *hash, char *key) +{ + int val; + struct gki_elem *ptr; + + val = gki_hashvalue(hash, key); + + ptr = hash->table[val]; + hash->table[val] = MallocOrDie(sizeof(struct gki_elem)); + hash->table[val]->key = MallocOrDie(sizeof(char) * (strlen(key)+1)); + strcpy(hash->table[val]->key, key); + + hash->table[val]->idx = hash->nkeys; + hash->table[val]->nxt = ptr; + + hash->nkeys++; + /* time to upsize? */ + if (hash->nkeys > 3*hash->nhash && hash->primelevel < GKI_NPRIMES-1) + gki_upsize(hash); + + return hash->nkeys-1; +} + +/* Function: GKIKeyIndex() + * Date: SRE, Sat May 1 11:20:42 1999 [May Day geek-out] + * + * Purpose: Look up a key in the hash table. Return + * its index (0..nkeys-1), else -1 if the key + * isn't in the hash (yet). + * + * Args: hash - the GKI hash table to search in + * key - the key to look up + * + * Returns: -1 if key is not found; + * index of key if it is found (range 0..nkeys-1). + * hash table is unchanged. + */ +int +GKIKeyIndex(GKI *hash, char *key) +{ + struct gki_elem *ptr; + int val; + + val = gki_hashvalue(hash, key); + for (ptr = hash->table[val]; ptr != NULL; ptr = ptr->nxt) + if (strcmp(key, ptr->key) == 0) return ptr->idx; + return -1; +} + +/* Function: GKIStatus() + * Date: SRE, Sat May 1 11:11:13 1999 [St. Louis] + * + * Purpose: (DEBUGGING) How are we doing? Calculate some + * simple statistics for the hash table. + * + * Args: hash - the GKI hash table to look at + * + * Returns: (void) + * Prints diagnostics on stdout. + * hash table is unchanged. + */ +void +GKIStatus(GKI *hash) +{ + struct gki_elem *ptr; + int i; + int nkeys; + int nempty = 0; + int maxkeys = -1; + int minkeys = INT_MAX; + + for (i = 0; i < hash->nhash; i++) + { + nkeys = 0; + for (ptr = hash->table[i]; ptr != NULL; ptr = ptr->nxt) + nkeys++; + + if (nkeys == 0) nempty++; + if (nkeys > maxkeys) maxkeys = nkeys; + if (nkeys < minkeys) minkeys = nkeys; + } + + printf("Total keys: %d\n", hash->nkeys); + printf("Hash table size: %d\n", hash->nhash); + printf("Average occupancy: %.1f\n", (float) hash->nkeys / (float) hash->nhash); + printf("Unoccupied slots: %d\n", nempty); + printf("Most in one slot: %d\n", maxkeys); + printf("Least in one slot: %d\n", minkeys); + +} + + +/* Function: gki_alloc() + * Date: SRE, Sat May 1 11:55:47 1999 [May Day geek-out] + * + * Purpose: Allocate a hash table structure with the + * size given by primelevel. + * + * Args: primelevel - level 0..GKI_NPRIMES-1, specifying + * the size of the table; see gki_primes[] + * array. + * + * Returns: An allocated hash table structure. + * Caller frees with GKIFree(). + */ +static GKI * +gki_alloc(int primelevel) +{ + GKI *hash; + int i; + + if (primelevel < 0 || primelevel >= GKI_NPRIMES) + Die("bad primelevel in gki_alloc()"); + hash = MallocOrDie(sizeof(GKI)); + + hash->primelevel = primelevel; + hash->nhash = gki_primes[hash->primelevel]; + hash->table = MallocOrDie(sizeof(struct gki_elem) * hash->nhash); + for (i = 0; i < hash->nhash; i++) + hash->table[i] = NULL; + hash->nkeys = 0; + return hash; +} + + +/* Function: gki_hashvalue() + * Date: SRE, Sat May 1 11:14:10 1999 [May Day geek-out] + * + * Purpose: Calculate the hash value for a key. Usually + * we expect a one-word key, but the function will + * hash any ASCII string effectively. The hash function + * is a simple one (see p. 233 of Sedgewick, + * Algorithms in C). + * Slightly optimized: does two characters at a time + * before doing the modulo; this gives us a significant + * speedup. + * + * Args: hash - the gki structure (we need to know the hash table size) + * key - a string to calculate the hash value for + * + * Returns: a hash value, in the range 0..hash->nhash-1. + * hash table is unmodified. + */ +static int +gki_hashvalue(GKI *hash, char *key) +{ + int val = 0; + + for (; *key != '\0'; key++) + { + val = GKI_ALPHABETSIZE*val + *key; + if (*(++key) == '\0') { val = val % hash->nhash; break; } + val = (GKI_ALPHABETSIZE*val + *key) % hash->nhash; + } + return val; +} + +/* Function: gki_upsize() + * Date: SRE, Sat May 1 11:46:07 1999 [May Day geek-out] + * + * Purpose: Grow the hash table to the next available size. + * + * Args: old - the GKI hash table to reallocate. + * + * Returns: 1 on success (the hash table is changed); + * 0 on failure; the table is already at its maximum size, + * and the hash table is returned unchanged. + */ +static int +gki_upsize(GKI *old) +{ + GKI *new; + int i; + struct gki_elem *optr; + struct gki_elem *nptr; + int val; + + if (old->primelevel >= GKI_NPRIMES-1) return 0; + new = gki_alloc(old->primelevel+1); + + /* Read the old, store in the new, while *not changing* + * any key indices. Because of the way the lists are + * treated as LIFO stacks, all the lists are reversed + * in the new structure. + */ + for (i = 0; i < old->nhash; i++) + { + optr = old->table[i]; + while (optr != NULL) + { + val = gki_hashvalue(new, optr->key); + + nptr = new->table[val]; + new->table[val] = optr; + optr = optr->nxt; + new->table[val]->nxt = nptr; + } + } + free(old->table); + + /* Now swap within the interior of the structures, so the old + * structure is updated to the new structure. + * (nkeys is identical, so we don't need to swap that element.) + */ + old->primelevel = new->primelevel; + old->nhash = new->nhash; + old->table = new->table; + free(new); + return 1; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/gki.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,50 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +#ifndef SQUID_GKI_INCLUDED +#define SQUID_GKI_INCLUDED + +/* gki.h + * SRE, Sat May 1 15:07:22 1999 + * + * Declarations of structures, functions for generic key index + * module: emulation of Perl hashes. See gki.c. + * + * RCS $Id: gki.h 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: gki.h,v 1.2 1999/07/15 22:30:45 eddy Exp) + */ + +/* gki_elem: + * key, array index pairs are kept in linked list structures. + */ +struct gki_elem { + char *key; + int idx; + struct gki_elem *nxt; +}; + +/* gki: + * a dynamically resized hash structure; + * contains a hash table and associated data + */ +typedef struct { + struct gki_elem **table; + + int primelevel; + int nhash; + int nkeys; +} GKI; + +GKI *GKIInit(void); +void GKIFree(GKI *hash); +int GKIHashValue(GKI *hash, char *key); +int GKIStoreKey(GKI *hash, char *key); +int GKIKeyIndex(GKI *hash, char *key); +void GKIStatus(GKI *hash); + +#endif /* SQUID_GKI_INCLUDED */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/gsi.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,387 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* gsi.c + * Interfaces for GSI "generic sequence index" files. + * broken away from sqio.c and extended: SRE, Wed Aug 5 10:32:53 1998 + * + * + * GSI definition: + * 1 + <nfiles> + <nkeys> total records. + * Each record = 38 bytes. + * + * one header record : <"GSI" (32)> <nfiles (2)> <nkeys (4)> + * <nfiles> file records : <filename (32)> <fileno (2)> <fmt (4)> + * <nkeys> key records : <key (32)> <fileno (2)> <offset(4)> + * + * Matches up with my Perl scripts that create GSI files. + * + * RCS $Id: gsi.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: gsi.c,v 1.5 2001/08/04 20:15:42 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#ifndef SEEK_SET +#include <unistd.h> /* needed for poor crippled SunOS */ +#endif + +#include "squid.h" +#include "gsi.h" + + +/***************************************************************** + * GSI index file access routines + *****************************************************************/ + +/* Function: GSIOpen() + * + * Purpose: Open a GSI file. Returns the number of records in + * the file and a file pointer. Returns NULL on failure. + * The file pointer should be fclose()'d normally. + */ +GSIFILE * +GSIOpen(char *gsifile) +{ + GSIFILE *gsi; + char magic[GSI_KEYSIZE]; + + gsi = (GSIFILE *) MallocOrDie (sizeof(GSIFILE)); + if ((gsi->gsifp = fopen(gsifile, "r")) == NULL) + { free(gsi); squid_errno = SQERR_NOFILE; return NULL; } + + if (! fread(magic, sizeof(char), GSI_KEYSIZE, gsi->gsifp)) + { free(gsi); squid_errno = SQERR_NODATA; return NULL; } + if (strcmp(magic, "GSI") != 0) + { free(gsi); squid_errno = SQERR_FORMAT; return NULL; } + + if (! fread(&(gsi->nfiles), sizeof(sqd_uint16), 1, gsi->gsifp)) + { free(gsi); squid_errno = SQERR_NODATA; return NULL; } + if (! fread(&(gsi->recnum), sizeof(sqd_uint32), 1, gsi->gsifp)) + { free(gsi); squid_errno = SQERR_NODATA; return NULL; } + + gsi->nfiles = sre_ntoh16(gsi->nfiles); /* convert from network short */ + gsi->recnum = sre_ntoh32(gsi->recnum); /* convert from network long */ + + return gsi; +} + +/* Function: GSIGetRecord() + * + * Purpose: Each non-header record of a GSI index files consists + * of 38 bytes: 32 bytes of character string, a 2 byte + * short, and a 4 byte long. This function returns the + * three values. + * + * Args: gsi - open GSI index file, correctly positioned at a record + * f1 - char[32], allocated by caller (or NULL if unwanted) + * f2 - pointer to short (or NULL if unwanted) + * f3 - pointer to long (or NULL if unwanted) + * + * Return: 0 on failure and sets squid_errno. + */ +int +GSIGetRecord(GSIFILE *gsi, char *f1, sqd_uint16 *f2, sqd_uint32 *f3) +{ + if (f1 == NULL) fseek(gsi->gsifp, GSI_KEYSIZE, SEEK_CUR); + else if (! fread(f1, GSI_KEYSIZE, 1, gsi->gsifp)) + { squid_errno = SQERR_NODATA; return 0; } + + if (f2 == NULL) fseek(gsi->gsifp, sizeof(sqd_uint16), SEEK_CUR); + else if (! fread(f2, sizeof(sqd_uint16), 1, gsi->gsifp)) + { squid_errno = SQERR_NODATA; return 0; } + + if (f3 == NULL) fseek(gsi->gsifp, sizeof(sqd_uint32), SEEK_CUR); + else if (! fread(f3, sizeof(sqd_uint32), 1, gsi->gsifp)) + { squid_errno = SQERR_NODATA; return 0; } + + if (f2 != NULL) *f2 = sre_ntoh16(*f2); + if (f3 != NULL) *f3 = sre_ntoh32(*f3); + + return 1; +} + + +/* Function: GSIGetOffset() + * + * Purpose: From a key (sequence name), find a disk offset + * in an open general sequence index file by binary + * search. Presumably GSI indexing could be even faster + * if we used hashing. + * + * Args: gsi - GSI index file, opened by GSIOpen() + * key - name of key to retrieve indices for + * ret_seqfile - pre-alloced char[32] array for seqfile name + * ret_fmt - format of seqfile + * ret_offset - return: disk offset in seqfile. + */ +int +GSIGetOffset(GSIFILE *gsi, char *key, char *ret_seqfile, + int *ret_format, long *ret_offset) +{ + sqd_uint32 left, right, mid; + int cmp; + char name[GSI_KEYSIZE + 1]; + sqd_uint32 offset; + sqd_uint16 filenum; + sqd_uint32 fmt; + + name[GSI_KEYSIZE] = '\0'; + + left = gsi->nfiles + 1; + right = gsi->nfiles + gsi->recnum; + mid = (left + right) / 2; + fseek(gsi->gsifp, mid * GSI_RECSIZE, SEEK_SET); + + while (GSIGetRecord(gsi, name, &filenum, &offset)) + { + cmp = strcmp(name, key); + if (cmp == 0) break; /* found it! */ + else if (left >= right) return 0; /* oops, missed it; fail. */ + else if (cmp < 0) left = mid + 1; /* it's right of mid */ + else if (cmp > 0) right = mid - 1; /* it's left of mid */ + mid = (left + right) / 2; + fseek(gsi->gsifp, mid * GSI_RECSIZE, SEEK_SET); + } + + /* Using file number, look up the sequence file and format. + */ + fseek(gsi->gsifp, filenum * GSI_RECSIZE, SEEK_SET); + GSIGetRecord(gsi, ret_seqfile, NULL, &fmt); + *ret_format = (int) fmt; + *ret_offset = (long) offset; + + return 1; +} + +/* Function: GSIClose() + * + * Purpose: Close an open GSI sequence index file. + */ +void +GSIClose(GSIFILE *gsi) +{ + fclose(gsi->gsifp); + free(gsi); +} + + +/***************************************************************** + * GSI index construction routines + * SRE, Wed Nov 10 11:49:14 1999 [St. Louis] + * + * API: + * g = GSIAllocIndex(); + * + * [foreach filename, <32 char, no directory path] + * GSIAddFileToIndex(g, filename); + * filenum++; + * [foreach key, <32 char, w/ filenum 1..nfiles, w/ 32bit offset] + * GSIAddKeyToIndex(g, key, filenum, offset); + * + * GSISortIndex(g); + * GSIWriteIndex(fp, g); + * GSIFreeIndex(g); + *****************************************************************/ +struct gsiindex_s * +GSIAllocIndex(void) +{ + struct gsiindex_s *g; + + g = MallocOrDie(sizeof(struct gsiindex_s)); + g->filenames = MallocOrDie(sizeof(char *) * 10); + g->fmt = MallocOrDie(sizeof(int) * 10); + g->elems = MallocOrDie(sizeof(struct gsikey_s) * 100); + g->nfiles = 0; + g->nkeys = 0; + return g; +} +void +GSIFreeIndex(struct gsiindex_s *g) +{ + int i; + for (i = 0; i < g->nfiles; i++) free(g->filenames[i]); + free(g->filenames); + free(g->fmt); + free(g->elems); + free(g); +} +void +GSIAddFileToIndex(struct gsiindex_s *g, char *filename, int fmt) +{ + int len; + + len = strlen(filename); + if (len >= GSI_KEYSIZE) Die("File name too long to be indexed."); + g->filenames[g->nfiles] = sre_strdup(filename, len); + g->fmt[g->nfiles] = fmt; + g->nfiles++; + if (g->nfiles % 10 == 0) { + g->filenames = ReallocOrDie(g->filenames, sizeof(char *) * (g->nfiles + 10)); + g->fmt = ReallocOrDie(g->fmt, sizeof(int) * (g->nfiles + 10)); + } +} +void +GSIAddKeyToIndex(struct gsiindex_s *g, char *key, int filenum, long offset) +{ + if (strlen(key) >= GSI_KEYSIZE) Die("key too long in GSI index"); + if (filenum > SQD_UINT16_MAX) Die("too many files in GSI index"); + if (offset > SQD_UINT32_MAX) Die("offset too big in GSI index"); + + strncpy(g->elems[g->nkeys].key, key, GSI_KEYSIZE-1); + g->elems[g->nkeys].key[GSI_KEYSIZE-1] = '\0'; + g->elems[g->nkeys].filenum = (sqd_uint16) filenum; + g->elems[g->nkeys].offset = (sqd_uint32) offset; + g->nkeys++; + + if (g->nkeys % 100 == 0) + g->elems = ReallocOrDie(g->elems, sizeof(struct gsikey_s) * (g->nkeys + 100)); +} +static int +gsi_keysorter(const void *k1, const void *k2) +{ + struct gsikey_s *key1; + struct gsikey_s *key2; + key1 = (struct gsikey_s *) k1; + key2 = (struct gsikey_s *) k2; + return strcmp(key1->key, key2->key); +} +void +GSISortIndex(struct gsiindex_s *g) +{ + qsort((void *) g->elems, g->nkeys, sizeof(struct gsikey_s), gsi_keysorter); +} +void +GSIWriteIndex(FILE *fp, struct gsiindex_s *g) +{ + sqd_uint32 i; + + /* Range checking. + */ + /* AW: gcc says: comparison always false die to limited range of data type */ +#ifndef CLUSTALO + if (g->nfiles > SQD_UINT16_MAX) Die("Too many files in GSI index."); +#endif + if (g->nkeys > SQD_UINT32_MAX) Die("Too many keys in GSI index."); + + GSIWriteHeader(fp, g->nfiles, g->nkeys); + for (i = 0; i < g->nfiles; i++) + GSIWriteFileRecord(fp, g->filenames[i], i+1, g->fmt[i]); + for (i = 0; i < g->nkeys; i++) + GSIWriteKeyRecord(fp, g->elems[i].key, g->elems[i].filenum, g->elems[i].offset); +} + + + + + +/* Function: GSIWriteHeader() + * Date: SRE, Wed Aug 5 10:36:02 1998 [St. Louis] + * + * Purpose: Write the first record to an open GSI file: + * "GSI" <nfiles> <nkeys> + * + * Args: fp - open file to write to. + * nfiles - number of files indexed + * nkeys - number of keys indexed + * + * Returns: void + */ +void +GSIWriteHeader(FILE *fp, int nfiles, long nkeys) +{ + char key[GSI_KEYSIZE]; + sqd_uint16 f1; + sqd_uint32 f2; + + /* beware potential range errors! + */ + if (nfiles > SQD_UINT16_MAX) Die("GSI: nfiles out of range"); + if (nkeys > SQD_UINT32_MAX) Die("GSI: nkeys out of range"); + + f1 = (sqd_uint16) nfiles; + f2 = (sqd_uint32) nkeys; + f1 = sre_hton16(f1); + f2 = sre_hton32(f2); + strcpy(key, "GSI"); + + if (fwrite(key, 1, GSI_KEYSIZE, fp) < GSI_KEYSIZE) PANIC; + if (fwrite(&f1, 2, 1, fp) < 1) PANIC; + if (fwrite(&f2, 4, 1, fp) < 1) PANIC; +} + + +/* Function: GSIWriteFileRecord() + * Date: SRE, Wed Aug 5 10:45:51 1998 [St. Louis] + * + * Purpose: Write a file record to an open GSI file. + * + * Args: fp - open GSI file + * fname - file name (max 31 characters) + * idx - file number + * fmt - file format (e.g. kPearson, etc.) + * + * Returns: 0 on failure. 1 on success. + */ +int +GSIWriteFileRecord(FILE *fp, char *fname, int idx, int fmt) +{ + sqd_uint16 f1; + sqd_uint32 f2; + + if (strlen(fname) >= GSI_KEYSIZE) return 0; + if (idx > SQD_UINT16_MAX) Die("GSI: file index out of range"); + if (fmt > SQD_UINT32_MAX) Die("GSI: format index out of range"); + + f1 = (sqd_uint16) idx; + f2 = (sqd_uint32) fmt; + f1 = sre_hton16(f1); + f2 = sre_hton32(f2); + + if (fwrite(fname, 1, GSI_KEYSIZE, fp) < GSI_KEYSIZE) PANIC; + if (fwrite(&f1, 2, 1, fp) < 1) PANIC; + if (fwrite(&f2, 4, 1, fp) < 1) PANIC; + return 1; +} + + +/* Function: GSIWriteKeyRecord() + * Date: SRE, Wed Aug 5 10:52:30 1998 [St. Louis] + * + * Purpose: Write a key record to a GSI file. + * + * Args: fp - open GSI file for writing + * key - key (max 31 char + \0) + * fileidx - which file number to find this key in + * offset - offset for this key + * + * Returns: 1 on success, else 0. + * will fail if key >= 32 chars, for instance. + */ +int +GSIWriteKeyRecord(FILE *fp, char *key, int fileidx, long offset) +{ + sqd_uint16 f1; + sqd_uint32 f2; + + if (strlen(key) >= GSI_KEYSIZE) return 0; + if (fileidx > SQD_UINT16_MAX) Die("GSI: file index out of range"); + if (offset > SQD_UINT32_MAX) Die("GSI: offset out of range"); + + f1 = (sqd_uint16) fileidx; + f2 = (sqd_uint32) offset; + f1 = sre_hton16(f1); + f2 = sre_hton32(f2); + + if (fwrite(key, 1, GSI_KEYSIZE, fp) < GSI_KEYSIZE) PANIC; + if (fwrite(&f1, 2, 1, fp) < 1) PANIC; + if (fwrite(&f2, 4, 1, fp) < 1) PANIC; + return 1; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/gsi.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,84 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +#ifndef GSIH_INCLUDED +#define GSIH_INCLUDED + +/* gsi.h + * Database indexing (GSI format support) + * RCS $Id: gsi.h 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: gsi.h,v 1.3 2001/08/04 20:15:42 eddy Exp) + * + * A GSI (generic sequence index) file is composed of + * recnum + nfiles + 1 records. Each record contains + * three fields; key, file number, and disk offset. + * Record 0 contains: + * [ "GSI" ] [ nfiles ] [ recnum ] + * Records 1..nfiles map file names to file numbers, and contain: + * [ filename ] [ file number, 1..nfiles ] [ 0 (unused) ] + * Records nfiles+1 to recnum+nfiles+1 provide disk offset + * and file number indices for every key: + * [ key ] [ file number ] [ offset] + * + * Because the file is binary, we take some (but not + * complete) care to improve portability amongst platforms. + * This means using network order integers (see ntohl()) + * and defining types for 16 and 32 bit integers. + * + * Because we use 32-bit offsets, ftell(), and fseek(), + * there is an implicit 2 Gb file size maximum. + * AFAIK neither ANSI C nor POSIX provide a portable solution + * to this problem. fsetpos(), fgetpos() use an + * opaque fpos_t datatype that we can't write portably + * to a disk file. Suggestions welcomed. + */ +#define GSI_KEYSIZE 32 /* keys are 32 bytes long */ +#define GSI_RECSIZE 38 /* 32 + 2 + 4 bytes */ +#define SQD_UINT16_MAX 65535 /* 2^16-1 */ +#define SQD_UINT32_MAX 4294967295U/* 2^32-1 */ + +struct gsi_s { + FILE *gsifp; /* open GSI index file */ + sqd_uint16 nfiles; /* number of files = 16 bit int */ + sqd_uint32 recnum; /* number of records = 32 bit int */ +}; +typedef struct gsi_s GSIFILE; + +struct gsikey_s { + char key[GSI_KEYSIZE]; + sqd_uint16 filenum; + sqd_uint32 offset; +}; +struct gsiindex_s { + char **filenames; + int *fmt; + sqd_uint16 nfiles; + + struct gsikey_s *elems; + int nkeys; +}; + + +/* from gsi.c + */ +extern GSIFILE *GSIOpen(char *gsifile); +extern int GSIGetRecord(GSIFILE *gsi, char *f1, sqd_uint16 *f2, sqd_uint32 *f3); +extern int GSIGetOffset(GSIFILE *gsi, char *key, char *sqfile, + int *fmt, long *ret_offset); +extern void GSIClose(GSIFILE *gsi); +extern struct gsiindex_s *GSIAllocIndex(void); +extern void GSIFreeIndex(struct gsiindex_s *g); +extern void GSIAddFileToIndex(struct gsiindex_s *g, char *filename, int fmt); +extern void GSIAddKeyToIndex(struct gsiindex_s *g, char *key, int filenum, long offset); +extern void GSISortIndex(struct gsiindex_s *g); +extern void GSIWriteIndex(FILE *fp, struct gsiindex_s *g); +extern void GSIWriteHeader(FILE *fp, int nfiles, long nkeys); +extern int GSIWriteFileRecord(FILE *fp, char *fname, int idx, int fmt); +extern int GSIWriteKeyRecord(FILE *fp, char *key, int fileidx, long offset); + +#endif /*GSIH_INCLUDED*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/gsi64.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,394 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ +#ifdef USE_GSI64 + +/* gsi64.c + * Updated interfaces for GSI64 64-bit "generic sequence index" files. + * See gsi.c for old interfaces. + * This is a temporary hack! Needed for human genome project. + */ + +/* 1 + <nfiles> + <nkeys> total records. + * Each record = 42 bytes. + * + * one header record : <"GSI64" (32)> <nfiles (2)> <nkeys (8)> + * <nfiles> file records : <filename (32)> <fileno (2)> <fmt (8)> + * <nkeys> key records : <key (32)> <fileno (2)> <offset(8)> + * + * CVS $Id: gsi64.c,v 1.2 2000/12/21 23:42:59 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#ifndef SEEK_SET +#include <unistd.h> /* needed for poor crippled SunOS */ +#endif + +#include "squid.h" +#include "gsi64.h" + +/***************************************************************** + * GSI64 index file access routines + *****************************************************************/ + +/* Function: GSI64Open() + * + * Purpose: Open a GSI64 file. Returns the number of records in + * the file and a file pointer. Returns NULL on failure. + * The file pointer should be fclose()'d normally. + */ +GSI64FILE * +GSI64Open(char *gsifile) +{ + GSI64FILE *gsi; + char magic[GSI64_KEYSIZE]; + + gsi = (GSI64FILE *) MallocOrDie (sizeof(GSI64FILE)); + if ((gsi->gsifp = fopen(gsifile, "r")) == NULL) + { free(gsi); squid_errno = SQERR_NOFILE; return NULL; } + + if (! fread(magic, sizeof(char), GSI64_KEYSIZE, gsi->gsifp)) + { free(gsi); squid_errno = SQERR_NODATA; return NULL; } + if (strcmp(magic, "GSI64") != 0) + { free(gsi); squid_errno = SQERR_FORMAT; return NULL; } + + if (! fread(&(gsi->nfiles), sizeof(sqd_uint16), 1, gsi->gsifp)) + { free(gsi); squid_errno = SQERR_NODATA; return NULL; } + if (! fread(&(gsi->recnum), sizeof(sqd_uint64), 1, gsi->gsifp)) + { free(gsi); squid_errno = SQERR_NODATA; return NULL; } + +#if 0 /* HACK! we don't byteswap */ + gsi->nfiles = sre_ntohs(gsi->nfiles); /* convert from network short */ + gsi->recnum = sre_ntohl(gsi->recnum); /* convert from network long */ +#endif + + return gsi; +} + +/* Function: GSI64GetRecord() + * + * Purpose: Each non-header record of a GSI64 index file consists + * of 42 bytes: 32 bytes of character string, a 2 byte + * short, and an 8 byte long long. This function returns the + * three values. + * + * Args: gsi - open GSI64 index file, correctly positioned at a record + * f1 - char[32], allocated by caller (or NULL if unwanted) + * f2 - pointer to short (or NULL if unwanted) + * f3 - pointer to long long (or NULL if unwanted) + * + * Return: 0 on failure and sets squid_errno. + */ +int +GSI64GetRecord(GSI64FILE *gsi, char *f1, sqd_uint16 *f2, sqd_uint64 *f3) +{ + if (f1 == NULL) fseek64(gsi->gsifp, GSI64_KEYSIZE, SEEK_CUR); + else if (! fread(f1, GSI64_KEYSIZE, 1, gsi->gsifp)) + { squid_errno = SQERR_NODATA; return 0; } + + if (f2 == NULL) fseek64(gsi->gsifp, sizeof(sqd_uint16), SEEK_CUR); + else if (! fread(f2, sizeof(sqd_uint16), 1, gsi->gsifp)) + { squid_errno = SQERR_NODATA; return 0; } + + if (f3 == NULL) fseek64(gsi->gsifp, sizeof(sqd_uint64), SEEK_CUR); + else if (! fread(f3, sizeof(sqd_uint64), 1, gsi->gsifp)) + { squid_errno = SQERR_NODATA; return 0; } + +#if 0 /* no byteswap yet! HACK! */ + if (f2 != NULL) *f2 = sre_ntohs(*f2); + if (f3 != NULL) *f3 = sre_ntohl(*f3); +#endif + + return 1; +} + + +/* Function: GSI64GetOffset() + * + * Purpose: From a key (sequence name), find a disk offset + * in an open general sequence index file by binary + * search. Presumably GSI64 indexing could be even faster + * if we used hashing. + * + * Args: gsi - GSI64 index file, opened by GSI64Open() + * key - name of key to retrieve indices for + * ret_seqfile - pre-alloced char[32] array for seqfile name + * ret_fmt - format of seqfile + * ret_offset - return: disk offset in seqfile. + */ +int +GSI64GetOffset(GSI64FILE *gsi, char *key, char *ret_seqfile, + int *ret_format, long long *ret_offset) +{ + sqd_uint64 left, right, mid; + int cmp; + char name[GSI64_KEYSIZE + 1]; + sqd_uint64 offset; + sqd_uint16 filenum; + sqd_uint64 fmt; + + name[GSI64_KEYSIZE] = '\0'; + + left = gsi->nfiles + 1; + right = gsi->nfiles + gsi->recnum; + mid = (left + right) / 2; + fseek64(gsi->gsifp, mid * GSI64_RECSIZE, SEEK_SET); + + while (GSI64GetRecord(gsi, name, &filenum, &offset)) + { + cmp = strcmp(name, key); + if (cmp == 0) break; /* found it! */ + else if (left >= right) return 0; /* oops, missed it; fail. */ + else if (cmp < 0) left = mid + 1; /* it's right of mid */ + else if (cmp > 0) right = mid - 1; /* it's left of mid */ + mid = (left + right) / 2; + fseek64(gsi->gsifp, mid * GSI64_RECSIZE, SEEK_SET); + } + + /* Using file number, look up the sequence file and format. + */ + fseek64(gsi->gsifp, filenum * GSI64_RECSIZE, SEEK_SET); + GSI64GetRecord(gsi, ret_seqfile, NULL, &fmt); + *ret_format = (int) fmt; + *ret_offset = (long long) offset; + + return 1; +} + +/* Function: GSI64Close() + * + * Purpose: Close an open GSI64 sequence index file. + */ +void +GSI64Close(GSI64FILE *gsi) +{ + fclose(gsi->gsifp); + free(gsi); +} + + +/***************************************************************** + * GSI64 index construction routines + * SRE, Wed Nov 10 11:49:14 1999 [St. Louis] + * + * API: + * g = GSI64AllocIndex(); + * + * [foreach filename, <32 char, no directory path] + * GSI64AddFileToIndex(g, filename); + * filenum++; + * [foreach key, <32 char, w/ filenum 1..nfiles, w/ 64bit offset] + * GSI64AddKeyToIndex(g, key, filenum, offset); + * + * GSI64SortIndex(g); + * GSI64WriteIndex(fp, g); + * GSI64FreeIndex(g); + *****************************************************************/ +struct gsi64index_s * +GSI64AllocIndex(void) +{ + struct gsi64index_s *g; + + g = MallocOrDie(sizeof(struct gsi64index_s)); + g->filenames = MallocOrDie(sizeof(char *) * 10); + g->fmt = MallocOrDie(sizeof(int) * 10); + g->elems = MallocOrDie(sizeof(struct gsi64key_s) * 100); + g->nfiles = 0; + g->nkeys = 0; + return g; +} +void +GSI64FreeIndex(struct gsi64index_s *g) +{ + int i; + for (i = 0; i < g->nfiles; i++) free(g->filenames[i]); + free(g->filenames); + free(g->fmt); + free(g->elems); + free(g); +} +void +GSI64AddFileToIndex(struct gsi64index_s *g, char *filename, int fmt) +{ + int len; + + len = strlen(filename); + if (len >= GSI64_KEYSIZE) Die("File name too long to be indexed."); + g->filenames[g->nfiles] = sre_strdup(filename, len); + g->fmt[g->nfiles] = fmt; + g->nfiles++; + if (g->nfiles % 10 == 0) { + g->filenames = ReallocOrDie(g->filenames, sizeof(char *) * (g->nfiles + 10)); + g->fmt = ReallocOrDie(g->fmt, sizeof(int) * (g->nfiles + 10)); + } +} +void +GSI64AddKeyToIndex(struct gsi64index_s *g, char *key, int filenum, long long offset) +{ + if (strlen(key) >= GSI64_KEYSIZE) Die("key too long in GSI64 index"); + if (filenum > SQD_UINT16_MAX) Die("too many files in GSI64 index"); + if (offset > SQD_UINT64_MAX) Die("offset too big in GSI64 index"); + + strncpy(g->elems[g->nkeys].key, key, GSI64_KEYSIZE-1); + g->elems[g->nkeys].key[GSI64_KEYSIZE-1] = '\0'; + g->elems[g->nkeys].filenum = (sqd_uint16) filenum; + g->elems[g->nkeys].offset = (sqd_uint64) offset; + g->nkeys++; + + if (g->nkeys % 100 == 0) + g->elems = ReallocOrDie(g->elems, sizeof(struct gsi64key_s) * (g->nkeys + 100)); +} +static int +gsi_keysorter(const void *k1, const void *k2) +{ + struct gsi64key_s *key1; + struct gsi64key_s *key2; + key1 = (struct gsi64key_s *) k1; + key2 = (struct gsi64key_s *) k2; + return strcmp(key1->key, key2->key); +} +void +GSI64SortIndex(struct gsi64index_s *g) +{ + qsort((void *) g->elems, g->nkeys, sizeof(struct gsi64key_s), gsi_keysorter); +} +void +GSI64WriteIndex(FILE *fp, struct gsi64index_s *g) +{ + sqd_uint16 i; + sqd_uint64 j; + + /* Range checking. + */ + if (g->nfiles > SQD_UINT16_MAX) Die("Too many files in GSI64 index."); + if (g->nkeys > SQD_UINT64_MAX) Die("Too many keys in GSI64 index."); + + GSI64WriteHeader(fp, g->nfiles, g->nkeys); + for (i = 0; i < g->nfiles; i++) + GSI64WriteFileRecord(fp, g->filenames[i], i+1, g->fmt[i]); + for (j = 0; j < g->nkeys; j++) + GSI64WriteKeyRecord(fp, g->elems[j].key, g->elems[j].filenum, g->elems[j].offset); +} + + + + + +/* Function: GSI64WriteHeader() + * Date: SRE, Wed Aug 5 10:36:02 1998 [St. Louis] + * + * Purpose: Write the first record to an open GSI64 file: + * "GSI64" <nfiles> <nkeys> + * + * Args: fp - open file to write to. + * nfiles - number of files indexed + * nkeys - number of keys indexed + * + * Returns: void + */ +void +GSI64WriteHeader(FILE *fp, int nfiles, long long nkeys) +{ + char key[GSI64_KEYSIZE]; + sqd_uint16 f1; + sqd_uint64 f2; + + /* beware potential range errors! + */ + if (nfiles > SQD_UINT16_MAX) Die("GSI64: nfiles out of range"); + if (nkeys > SQD_UINT64_MAX) Die("GSI64: nkeys out of range"); + + f1 = (sqd_uint16) nfiles; + f2 = (sqd_uint64) nkeys; +#if 0 /* HACK no byteswap */ + f1 = sre_htons(f1); + f2 = sre_htonl(f2); +#endif + strcpy(key, "GSI64"); + + if (fwrite(key, 1, GSI64_KEYSIZE, fp) < GSI64_KEYSIZE) PANIC; + if (fwrite(&f1, 2, 1, fp) < 1) PANIC; + if (fwrite(&f2, 8, 1, fp) < 1) PANIC; +} + + +/* Function: GSI64WriteFileRecord() + * Date: SRE, Wed Aug 5 10:45:51 1998 [St. Louis] + * + * Purpose: Write a file record to an open GSI64 file. + * + * Args: fp - open GSI64 file + * fname - file name (max 31 characters) + * idx - file number + * fmt - file format (e.g. kPearson, etc.) + * + * Returns: 0 on failure. 1 on success. + */ +int +GSI64WriteFileRecord(FILE *fp, char *fname, int idx, int fmt) +{ + sqd_uint16 f1; + sqd_uint64 f2; + + if (strlen(fname) >= GSI64_KEYSIZE) return 0; + if (idx > SQD_UINT16_MAX) Die("GSI64: file index out of range"); + if (fmt > SQD_UINT64_MAX) Die("GSI64: format index out of range"); + + f1 = (sqd_uint16) idx; + f2 = (sqd_uint64) fmt; +#if 0 /* hack : no byteswap */ + f1 = sre_htons(f1); + f2 = sre_htonl(f2); +#endif + + if (fwrite(fname, 1, GSI64_KEYSIZE, fp) < GSI64_KEYSIZE) PANIC; + if (fwrite(&f1, 2, 1, fp) < 1) PANIC; + if (fwrite(&f2, 8, 1, fp) < 1) PANIC; + return 1; +} + + +/* Function: GSI64WriteKeyRecord() + * Date: SRE, Wed Aug 5 10:52:30 1998 [St. Louis] + * + * Purpose: Write a key record to a GSI64 file. + * + * Args: fp - open GSI64 file for writing + * key - key (max 31 char + \0) + * fileidx - which file number to find this key in + * offset - offset for this key + * + * Returns: 1 on success, else 0. + * will fail if key >= 32 chars, for instance. + */ +int +GSI64WriteKeyRecord(FILE *fp, char *key, int fileidx, long long offset) +{ + sqd_uint16 f1; + sqd_uint64 f2; + + if (strlen(key) >= GSI64_KEYSIZE) return 0; + if (fileidx > SQD_UINT16_MAX) Die("GSI64: file index out of range"); + if (offset > SQD_UINT64_MAX) Die("GSI64: offset out of range"); + + f1 = (sqd_uint16) fileidx; + f2 = (sqd_uint64) offset; +#if 0 /* HACK! */ + f1 = sre_htons(f1); + f2 = sre_htonl(f2); +#endif + + if (fwrite(key, 1, GSI64_KEYSIZE, fp) < GSI64_KEYSIZE) PANIC; + if (fwrite(&f1, 2, 1, fp) < 1) PANIC; + if (fwrite(&f2, 8, 1, fp) < 1) PANIC; + return 1; +} + +#endif /*USE_GSI64 */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/gsi64.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,95 @@ +/***************************************************************** + * @LICENSE@ + *****************************************************************/ + +#ifndef GSI64H_INCLUDED +#define GSI64H_INCLUDED +#ifdef USE_GSI64 + +/* gsi64.h + * Database indexing (GSI64 format support) + * CVS $Id: gsi64.h,v 1.2 2000/12/21 23:42:59 eddy Exp) + * + * A GSI64 (generic sequence index, 64 bit hack) file is composed of + * recnum + nfiles + 1 records. Each record contains + * three fields; key, file number, and disk offset. + * Record 0 contains: + * [ "GSI64" ] [ nfiles ] [ recnum ] + * Records 1..nfiles map file names to file numbers, and contain: + * [ filename ] [ file number, 1..nfiles ] [ 0 (unused) ] + * Records nfiles+1 to recnum+nfiles+1 provide disk offset + * and file number indices for every key: + * [ key ] [ file number ] [ offset] + * + * Because the file is binary, we take some (but not + * complete) care to improve portability amongst platforms. + * This means using network order integers (see ntohl()) + * and defining types for 16 and 64 bit integers. + * + * A short test program that verifies the sizes of these + * data types would be a good idea... + * + * Because we use 64-bit offsets, ftell64(), and fseek64(), + * we rely on the OS actually providing these. This is + * a temporary hack for human genome analysis. + */ +typedef unsigned long long sqd_uint64; /* 64 bit integer. */ + +#define GSI64_KEYSIZE 32 /* keys are 32 bytes long */ +#define GSI64_RECSIZE 42 /* 32 + 2 + 8 bytes */ +#define SQD_UINT16_MAX 65535 /* 2^16-1 */ +#define SQD_UINT64_MAX 18446744073709551615LU /* 2^64-1 */ + +struct gsi64_s { + FILE *gsifp; /* open GSI index file */ + sqd_uint16 nfiles; /* number of files = 16 bit int */ + sqd_uint64 recnum; /* number of records = 64 bit int */ +}; +typedef struct gsi64_s GSI64FILE; + +struct gsi64key_s { + char key[GSI64_KEYSIZE]; + sqd_uint16 filenum; + sqd_uint64 offset; +}; +struct gsi64index_s { + char **filenames; + int *fmt; + sqd_uint16 nfiles; + + struct gsi64key_s *elems; + sqd_uint64 nkeys; +}; + + + +/* if ntohl() and friends are not available, you + * can slip replacements in by providing sre_ntohl() + * functions. (i.e., there is a possible portability problem here.) + */ +#if 0 +#define sre_ntohl(x) ntohl(x); +#define sre_ntohs(x) ntohs(x); +#define sre_htonl(x) htonl(x); +#define sre_htons(x) htons(x); +#endif + +/* from gsi64.c + */ +extern GSI64FILE *GSI64Open(char *gsifile); +extern int GSI64GetRecord(GSI64FILE *gsi, char *f1, sqd_uint16 *f2, sqd_uint64 *f3); +extern int GSI64GetOffset(GSI64FILE *gsi, char *key, char *sqfile, + int *fmt, long long *ret_offset); +extern void GSI64Close(GSI64FILE *gsi); +extern struct gsi64index_s *GSI64AllocIndex(void); +extern void GSI64FreeIndex(struct gsi64index_s *g); +extern void GSI64AddFileToIndex(struct gsi64index_s *g, char *filename, int fmt); +extern void GSI64AddKeyToIndex(struct gsi64index_s *g, char *key, int filenum, long long offset); +extern void GSI64SortIndex(struct gsi64index_s *g); +extern void GSI64WriteIndex(FILE *fp, struct gsi64index_s *g); +extern void GSI64WriteHeader(FILE *fp, int nfiles, long long nkeys); +extern int GSI64WriteFileRecord(FILE *fp, char *fname, int idx, int fmt); +extern int GSI64WriteKeyRecord(FILE *fp, char *key, int fileidx, long long offset); + +#endif /* USE_GSI64 */ +#endif /*GSIH_INCLUDED*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/hsregex.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1350 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/***************************************************************** + * This code is an altered version of Henry Spencer's + * regex library. Alterations are limited to minor streamlining, + * and some name changes to protect the SQUID namespace. + * Henry's copyright notice appears below. + * You can obtain the original from + * ftp://ftp.zoo.toronto.edu/pub/bookregex.tar.Z + * Thanks, Henry! + * + * The magic word for compiling a testdriver: NBA_TEAM_IN_STL + * gcc -o test -g -DNBA_TEAM_IN_STL -L. hsregex.c -lsquid -lm + * + * Usage: + * test <pattern> <ntok> <string> + * + * SRE, Fri Aug 28 11:10:17 1998 + * CVS $Id: hsregex.c,v 1.7 2001/08/09 17:50:17 eddy Exp) + *****************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" + +/* global sqd_parse[] are managed by Strparse(). + * WARNING: TODO: this code is not threadsafe, and needs to be revised. + */ +char *sqd_parse[10]; + +/* Function: Strparse() + * + * Purpose: Match a regexp to a string. Returns 1 if pattern matches, + * else 0. + * + * Much like Perl, Strparse() makes copies of the matching + * substrings available via globals, sqd_parse[]. + * sqd_parse[0] contains a copy of the complete matched + * text. sqd_parse[1-9] contain copies of up to nine + * different substrings matched within parentheses. + * The memory for these strings is internally managed and + * volatile; the next call to Strparse() may destroy them. + * If the caller needs the matched substrings to persist + * beyond a new Strparse() call, it must make its own + * copies. + * + * A minor drawback of the memory management is that + * there will be a small amount of unfree'd memory being + * managed by Strparse() when a program exits; this may + * confuse memory debugging (Purify, dbmalloc). The + * general cleanup function SqdClean() is provided; + * you can call this before exiting. + * + * Uses an extended POSIX regular expression interface. + * A copylefted GNU implementation is included in the squid + * implementation (gnuregex.c) for use on non-POSIX compliant + * systems. POSIX 1003.2-compliant systems (all UNIX, + * some WinNT, I believe) can omit the GNU code if necessary. + * + * I built this for ease of use, not speed nor efficiency. + * + * Example: Strparse("foo-...-baz", "foo-bar-baz") returns 0 + * Strparse("foo-(...)-baz", "foo-bar-baz") + * returns 0; sqd_parse[0] is "foo-bar-baz"; + * sqd_parse[1] is "bar". + * + * A real example: + * s = ">gnl|ti|3 G10P69425RH2.T0 {SUB 81..737} /len=657" + * pat = "SUB ([0-9]+)" + * Strparse(pat, s, 1) + * returns 1; sqd_parse[1] is "81". + * + * Args: rexp - regular expression, extended POSIX form + * s - string to match against + * ntok - number of () substrings we will save (maximum NSUBEXP-1) + * + * Return: 1 on match, 0 if no match + */ +int +Strparse(char *rexp, char *s, int ntok) +{ + sqd_regexp *pat; + int code; + int len; + int i; + /* sanity check */ + if (ntok >= NSUBEXP ) Die("Strparse(): ntok must be <= %d", NSUBEXP-1); + + /* Free previous global substring buffers + */ + for (i = 0; i <= ntok; i++) + if (sqd_parse[i] != NULL) + { + free(sqd_parse[i]); + sqd_parse[i] = NULL; + } + + /* Compile and match the pattern, using our modified + * copy of Henry Spencer's regexp library + */ + if ((pat = sqd_regcomp(rexp)) == NULL) + Die("regexp compilation failed."); + code = sqd_regexec(pat, s); + + /* Fill the global substring buffers + */ + if (code == 1) + for (i = 0; i <= ntok; i++) + if (pat->startp[i] != NULL && pat->endp[i] != NULL) + { + len = pat->endp[i] - pat->startp[i]; + sqd_parse[i] = (char *) MallocOrDie(sizeof(char) * (len+1)); + strncpy(sqd_parse[i], pat->startp[i], len); + sqd_parse[i][len] = '\0'; + } + + free(pat); + return code; +} + +/* Function: SqdClean() + * Date: SRE, Wed Oct 29 12:52:08 1997 [TWA 721] + * + * Purpose: Clean up any squid library allocations before exiting + * a program, so we don't leave unfree'd memory around + * and confuse a malloc debugger like Purify or dbmalloc. + */ +void +SqdClean(void) +{ + int i; + + /* Free global substring buffers that Strparse() uses + */ + for (i = 0; i <= 9; i++) + if (sqd_parse[i] != NULL) { + free(sqd_parse[i]); + sqd_parse[i] = NULL; + } +} + + + +/* all code below is: + * Copyright (c) 1986, 1993, 1995 by University of Toronto. + * Written by Henry Spencer. Not derived from licensed software. + * + * Permission is granted to anyone to use this software for any + * purpose on any computer system, and to redistribute it in any way, + * subject to the following restrictions: + * + * 1. The author is not responsible for the consequences of use of + * this software, no matter how awful, even if they arise + * from defects in it. + * + * 2. The origin of this software must not be misrepresented, either + * by explicit claim or by omission. + * + * 3. Altered versions must be plainly marked as such, and must not + * be misrepresented (by explicit claim or omission) as being + * the original software. + * + * 4. This notice must not be removed or altered. + */ + +/* + * sqd_regcomp and sqd_regexec -- sqd_regsub and sqd_regerror are elsewhere + */ + +/* + * The first byte of the regexp internal "program" is actually this magic + * number; the start node begins in the second byte. + */ +#define SQD_REGMAGIC 0234 + +/* + * The "internal use only" fields in regexp.h are present to pass info from + * compile to execute that permits the execute phase to run lots faster on + * simple cases. They are: + * + * regstart char that must begin a match; '\0' if none obvious + * reganch is the match anchored (at beginning-of-line only)? + * regmust string (pointer into program) that match must include, or NULL + * regmlen length of regmust string + * + * Regstart and reganch permit very fast decisions on suitable starting points + * for a match, cutting down the work a lot. Regmust permits fast rejection + * of lines that cannot possibly match. The regmust tests are costly enough + * that sqd_regcomp() supplies a regmust only if the r.e. contains something + * potentially expensive (at present, the only such thing detected is * or + + * at the start of the r.e., which can involve a lot of backup). Regmlen is + * supplied because the test in sqd_regexec() needs it and sqd_regcomp() is computing + * it anyway. + */ + +/* + * Structure for regexp "program". This is essentially a linear encoding + * of a nondeterministic finite-state machine (aka syntax charts or + * "railroad normal form" in parsing technology). Each node is an opcode + * plus a "next" pointer, possibly plus an operand. "Next" pointers of + * all nodes except BRANCH implement concatenation; a "next" pointer with + * a BRANCH on both ends of it is connecting two alternatives. (Here we + * have one of the subtle syntax dependencies: an individual BRANCH (as + * opposed to a collection of them) is never concatenated with anything + * because of operator precedence.) The operand of some types of node is + * a literal string; for others, it is a node leading into a sub-FSM. In + * particular, the operand of a BRANCH node is the first node of the branch. + * (NB this is *not* a tree structure: the tail of the branch connects + * to the thing following the set of BRANCHes.) The opcodes are: + */ + +/* definition number opnd? meaning */ +#define END 0 /* no End of program. */ +#define BOL 1 /* no Match beginning of line. */ +#define EOL 2 /* no Match end of line. */ +#define ANY 3 /* no Match any character. */ +#define ANYOF 4 /* str Match any of these. */ +#define ANYBUT 5 /* str Match any but one of these. */ +#define BRANCH 6 /* node Match this, or the next..\&. */ +#define BACK 7 /* no "next" ptr points backward. */ +#define EXACTLY 8 /* str Match this string. */ +#define NOTHING 9 /* no Match empty string. */ +#define STAR 10 /* node Match this 0 or more times. */ +#define PLUS 11 /* node Match this 1 or more times. */ +#define OPEN 20 /* no Sub-RE starts here. */ + /* OPEN+1 is number 1, etc. */ +#define CLOSE 30 /* no Analogous to OPEN. */ + +/* + * Opcode notes: + * + * BRANCH The set of branches constituting a single choice are hooked + * together with their "next" pointers, since precedence prevents + * anything being concatenated to any individual branch. The + * "next" pointer of the last BRANCH in a choice points to the + * thing following the whole choice. This is also where the + * final "next" pointer of each individual branch points; each + * branch starts with the operand node of a BRANCH node. + * + * BACK Normal "next" pointers all implicitly point forward; BACK + * exists to make loop structures possible. + * + * STAR,PLUS '?', and complex '*' and '+', are implemented as circular + * BRANCH structures using BACK. Simple cases (one character + * per match) are implemented with STAR and PLUS for speed + * and to minimize recursive plunges. + * + * OPEN,CLOSE ...are numbered at compile time. + */ + +/* + * A node is one char of opcode followed by two chars of "next" pointer. + * "Next" pointers are stored as two 8-bit pieces, high order first. The + * value is a positive offset from the opcode of the node containing it. + * An operand, if any, simply follows the node. (Note that much of the + * code generation knows about this implicit relationship.) + * + * Using two bytes for the "next" pointer is vast overkill for most things, + * but allows patterns to get big without disasters. + */ +#define OP(p) (*(p)) +#define NEXT(p) (((*((p)+1)&0177)<<8) + (*((p)+2)&0377)) +#define OPERAND(p) ((p) + 3) + +/* + * Utility definitions. + */ +#define FAIL(m) { sqd_regerror(m); return(NULL); } +#define ISREPN(c) ((c) == '*' || (c) == '+' || (c) == '?') +#define META "^$.[()|?+*\\" + +/* + * Flags to be passed up and down. + */ +#define HASWIDTH 01 /* Known never to match null string. */ +#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */ +#define SPSTART 04 /* Starts with * or +. */ +#define WORST 0 /* Worst case. */ + +/* + * Work-variable struct for sqd_regcomp(). + */ +struct comp { + char *regparse; /* Input-scan pointer. */ + int regnpar; /* () count. */ + char *regcode; /* Code-emit pointer; ®dummy = don't. */ + char regdummy[3]; /* NOTHING, 0 next ptr */ + long regsize; /* Code size. */ +}; +#define EMITTING(cp) ((cp)->regcode != (cp)->regdummy) + +/* + * Forward declarations for sqd_regcomp()'s friends. + */ +static char *reg(struct comp *cp, int paren, int *flagp); +static char *regbranch(struct comp *cp, int *flagp); +static char *regpiece(struct comp *cp, int *flagp); +static char *regatom(struct comp *cp, int *flagp); +static char *regnode(struct comp *cp, int op); +static char *regnext(char *node); +static void regc(struct comp *cp, int c); +static void reginsert(struct comp *cp, int op, char *opnd); +static void regtail(struct comp *cp, char *p, char *val); +static void regoptail(struct comp *cp, char *p, char *val); + +/* + - sqd_regcomp - compile a regular expression into internal code + * + * We can't allocate space until we know how big the compiled form will be, + * but we can't compile it (and thus know how big it is) until we've got a + * place to put the code. So we cheat: we compile it twice, once with code + * generation turned off and size counting turned on, and once "for real". + * This also means that we don't allocate space until we are sure that the + * thing really will compile successfully, and we never have to move the + * code and thus invalidate pointers into it. (Note that it has to be in + * one piece because free() must be able to free it all.) + * + * Beware that the optimization-preparation code in here knows about some + * of the structure of the compiled regexp. + */ +sqd_regexp * +sqd_regcomp(exp) +const char *exp; +{ + register sqd_regexp *r; + register char *scan; + int flags; + struct comp co; + + if (exp == NULL) + FAIL("NULL argument to sqd_regcomp"); + + /* First pass: determine size, legality. */ + co.regparse = (char *)exp; + co.regnpar = 1; + co.regsize = 0L; + co.regdummy[0] = NOTHING; + co.regdummy[1] = co.regdummy[2] = 0; + co.regcode = co.regdummy; + regc(&co, SQD_REGMAGIC); + if (reg(&co, 0, &flags) == NULL) + return(NULL); + + /* Small enough for pointer-storage convention? */ + if (co.regsize >= 0x7fffL) /* Probably could be 0xffffL. */ + FAIL("regexp too big"); + + /* Allocate space. */ + r = (sqd_regexp *)malloc(sizeof(sqd_regexp) + (size_t)co.regsize); + if (r == NULL) + FAIL("out of space"); + + /* Second pass: emit code. */ + co.regparse = (char *)exp; + co.regnpar = 1; + co.regcode = r->program; + regc(&co, SQD_REGMAGIC); + if (reg(&co, 0, &flags) == NULL) + return(NULL); + + /* Dig out information for optimizations. */ + r->regstart = '\0'; /* Worst-case defaults. */ + r->reganch = 0; + r->regmust = NULL; + r->regmlen = 0; + scan = r->program+1; /* First BRANCH. */ + if (OP(regnext(scan)) == END) { /* Only one top-level choice. */ + scan = OPERAND(scan); + + /* Starting-point info. */ + if (OP(scan) == EXACTLY) + r->regstart = *OPERAND(scan); + else if (OP(scan) == BOL) + r->reganch = 1; + + /* + * If there's something expensive in the r.e., find the + * longest literal string that must appear and make it the + * regmust. Resolve ties in favor of later strings, since + * the regstart check works with the beginning of the r.e. + * and avoiding duplication strengthens checking. Not a + * strong reason, but sufficient in the absence of others. + */ + if (flags&SPSTART) { + register char *longest = NULL; + register size_t len = 0; + + for (; scan != NULL; scan = regnext(scan)) + if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) { + longest = OPERAND(scan); + len = strlen(OPERAND(scan)); + } + r->regmust = longest; + r->regmlen = (int)len; + } + } + + return(r); +} + +/* + - reg - regular expression, i.e. main body or parenthesized thing + * + * Caller must absorb opening parenthesis. + * + * Combining parenthesis handling with the base level of regular expression + * is a trifle forced, but the need to tie the tails of the branches to what + * follows makes it hard to avoid. + */ +static char * +reg(cp, paren, flagp) +register struct comp *cp; +int paren; /* Parenthesized? */ +int *flagp; +{ + register char *ret = NULL; /* SRE: NULL init added to silence gcc */ + register char *br; + register char *ender; + register int parno = 0; /* SRE: init added to silence gcc */ + int flags; + + *flagp = HASWIDTH; /* Tentatively. */ + + if (paren) { + /* Make an OPEN node. */ + if (cp->regnpar >= NSUBEXP) + FAIL("too many ()"); + parno = cp->regnpar; + cp->regnpar++; + ret = regnode(cp, OPEN+parno); + } + + /* Pick up the branches, linking them together. */ + br = regbranch(cp, &flags); + if (br == NULL) + return(NULL); + if (paren) + regtail(cp, ret, br); /* OPEN -> first. */ + else + ret = br; + *flagp &= ~(~flags&HASWIDTH); /* Clear bit if bit 0. */ + *flagp |= flags&SPSTART; + while (*cp->regparse == '|') { + cp->regparse++; + br = regbranch(cp, &flags); + if (br == NULL) + return(NULL); + regtail(cp, ret, br); /* BRANCH -> BRANCH. */ + *flagp &= ~(~flags&HASWIDTH); + *flagp |= flags&SPSTART; + } + + /* Make a closing node, and hook it on the end. */ + ender = regnode(cp, (paren) ? CLOSE+parno : END); + regtail(cp, ret, ender); + + /* Hook the tails of the branches to the closing node. */ + for (br = ret; br != NULL; br = regnext(br)) + regoptail(cp, br, ender); + + /* Check for proper termination. */ + if (paren && *cp->regparse++ != ')') { + FAIL("unterminated ()"); + } else if (!paren && *cp->regparse != '\0') { + if (*cp->regparse == ')') { + FAIL("unmatched ()"); + } else + FAIL("internal error: junk on end"); + /* NOTREACHED */ + } + + return(ret); +} + +/* + - regbranch - one alternative of an | operator + * + * Implements the concatenation operator. + */ +static char * +regbranch(cp, flagp) +register struct comp *cp; +int *flagp; +{ + register char *ret; + register char *chain; + register char *latest; + int flags; + register int c; + + *flagp = WORST; /* Tentatively. */ + + ret = regnode(cp, BRANCH); + chain = NULL; + while ((c = *cp->regparse) != '\0' && c != '|' && c != ')') { + latest = regpiece(cp, &flags); + if (latest == NULL) + return(NULL); + *flagp |= flags&HASWIDTH; + if (chain == NULL) /* First piece. */ + *flagp |= flags&SPSTART; + else + regtail(cp, chain, latest); + chain = latest; + } + if (chain == NULL) /* Loop ran zero times. */ + (void) regnode(cp, NOTHING); + + return(ret); +} + +/* + - regpiece - something followed by possible [*+?] + * + * Note that the branching code sequences used for ? and the general cases + * of * and + are somewhat optimized: they use the same NOTHING node as + * both the endmarker for their branch list and the body of the last branch. + * It might seem that this node could be dispensed with entirely, but the + * endmarker role is not redundant. + */ +static char * +regpiece(cp, flagp) +register struct comp *cp; +int *flagp; +{ + register char *ret; + register char op; + register char *next; + int flags; + + ret = regatom(cp, &flags); + if (ret == NULL) + return(NULL); + + op = *cp->regparse; + if (!ISREPN(op)) { + *flagp = flags; + return(ret); + } + + if (!(flags&HASWIDTH) && op != '?') + FAIL("*+ operand could be empty"); + switch (op) { + case '*': *flagp = WORST|SPSTART; break; + case '+': *flagp = WORST|SPSTART|HASWIDTH; break; + case '?': *flagp = WORST; break; + } + + if (op == '*' && (flags&SIMPLE)) + reginsert(cp, STAR, ret); + else if (op == '*') { + /* Emit x* as (x&|), where & means "self". */ + reginsert(cp, BRANCH, ret); /* Either x */ + regoptail(cp, ret, regnode(cp, BACK)); /* and loop */ + regoptail(cp, ret, ret); /* back */ + regtail(cp, ret, regnode(cp, BRANCH)); /* or */ + regtail(cp, ret, regnode(cp, NOTHING)); /* null. */ + } else if (op == '+' && (flags&SIMPLE)) + reginsert(cp, PLUS, ret); + else if (op == '+') { + /* Emit x+ as x(&|), where & means "self". */ + next = regnode(cp, BRANCH); /* Either */ + regtail(cp, ret, next); + regtail(cp, regnode(cp, BACK), ret); /* loop back */ + regtail(cp, next, regnode(cp, BRANCH)); /* or */ + regtail(cp, ret, regnode(cp, NOTHING)); /* null. */ + } else if (op == '?') { + /* Emit x? as (x|) */ + reginsert(cp, BRANCH, ret); /* Either x */ + regtail(cp, ret, regnode(cp, BRANCH)); /* or */ + next = regnode(cp, NOTHING); /* null. */ + regtail(cp, ret, next); + regoptail(cp, ret, next); + } + cp->regparse++; + if (ISREPN(*cp->regparse)) + FAIL("nested *?+"); + + return(ret); +} + +/* + - regatom - the lowest level + * + * Optimization: gobbles an entire sequence of ordinary characters so that + * it can turn them into a single node, which is smaller to store and + * faster to run. Backslashed characters are exceptions, each becoming a + * separate node; the code is simpler that way and it's not worth fixing. + */ +static char * +regatom(cp, flagp) +register struct comp *cp; +int *flagp; +{ + register char *ret; + int flags; + + *flagp = WORST; /* Tentatively. */ + + switch (*cp->regparse++) { + case '^': + ret = regnode(cp, BOL); + break; + case '$': + ret = regnode(cp, EOL); + break; + case '.': + ret = regnode(cp, ANY); + *flagp |= HASWIDTH|SIMPLE; + break; + case '[': { + register int range; + register int rangeend; + register int c; + + if (*cp->regparse == '^') { /* Complement of range. */ + ret = regnode(cp, ANYBUT); + cp->regparse++; + } else + ret = regnode(cp, ANYOF); + if ((c = *cp->regparse) == ']' || c == '-') { + regc(cp, c); + cp->regparse++; + } + while ((c = *cp->regparse++) != '\0' && c != ']') { + if (c != '-') + regc(cp, c); + else if ((c = *cp->regparse) == ']' || c == '\0') + regc(cp, '-'); + else { + range = (unsigned char)*(cp->regparse-2); + rangeend = (unsigned char)c; + if (range > rangeend) + FAIL("invalid [] range"); + for (range++; range <= rangeend; range++) + regc(cp, range); + cp->regparse++; + } + } + regc(cp, '\0'); + if (c != ']') + FAIL("unmatched []"); + *flagp |= HASWIDTH|SIMPLE; + break; + } + case '(': + ret = reg(cp, 1, &flags); + if (ret == NULL) + return(NULL); + *flagp |= flags&(HASWIDTH|SPSTART); + break; + case '\0': + case '|': + case ')': + /* supposed to be caught earlier */ + FAIL("internal error: \\0|) unexpected"); + break; + case '?': + case '+': + case '*': + FAIL("?+* follows nothing"); + break; + case '\\': + if (*cp->regparse == '\0') + FAIL("trailing \\"); + ret = regnode(cp, EXACTLY); + regc(cp, *cp->regparse++); + regc(cp, '\0'); + *flagp |= HASWIDTH|SIMPLE; + break; + default: { + register size_t len; + register char ender; + + cp->regparse--; + len = strcspn(cp->regparse, META); + if (len == 0) + FAIL("internal error: strcspn 0"); + ender = *(cp->regparse+len); + if (len > 1 && ISREPN(ender)) + len--; /* Back off clear of ?+* operand. */ + *flagp |= HASWIDTH; + if (len == 1) + *flagp |= SIMPLE; + ret = regnode(cp, EXACTLY); + for (; len > 0; len--) + regc(cp, *cp->regparse++); + regc(cp, '\0'); + break; + } + } + + return(ret); +} + +/* + - regnode - emit a node + */ +static char * /* Location. */ +regnode(cp, op) +register struct comp *cp; +char op; +{ + register char *const ret = cp->regcode; + register char *ptr; + + if (!EMITTING(cp)) { + cp->regsize += 3; + return(ret); + } + + ptr = ret; + *ptr++ = op; + *ptr++ = '\0'; /* Null next pointer. */ + *ptr++ = '\0'; + cp->regcode = ptr; + + return(ret); +} + +/* + - regc - emit (if appropriate) a byte of code + */ +static void +regc(cp, b) +register struct comp *cp; +char b; +{ + if (EMITTING(cp)) + *cp->regcode++ = b; + else + cp->regsize++; +} + +/* + - reginsert - insert an operator in front of already-emitted operand + * + * Means relocating the operand. + */ +static void +reginsert(cp, op, opnd) +register struct comp *cp; +char op; +char *opnd; +{ + register char *place; + + if (!EMITTING(cp)) { + cp->regsize += 3; + return; + } + + (void) memmove(opnd+3, opnd, (size_t)(cp->regcode - opnd)); + cp->regcode += 3; + + place = opnd; /* Op node, where operand used to be. */ + *place++ = op; + *place++ = '\0'; + *place++ = '\0'; +} + +/* + - regtail - set the next-pointer at the end of a node chain + */ +static void +regtail(cp, p, val) +register struct comp *cp; +char *p; +char *val; +{ + register char *scan; + register char *temp; + register int offset; + + if (!EMITTING(cp)) + return; + + /* Find last node. */ + for (scan = p; (temp = regnext(scan)) != NULL; scan = temp) + continue; + + offset = (OP(scan) == BACK) ? scan - val : val - scan; + *(scan+1) = (offset>>8)&0177; + *(scan+2) = offset&0377; +} + +/* + - regoptail - regtail on operand of first argument; nop if operandless + */ +static void +regoptail(cp, p, val) +register struct comp *cp; +char *p; +char *val; +{ + /* "Operandless" and "op != BRANCH" are synonymous in practice. */ + if (!EMITTING(cp) || OP(p) != BRANCH) + return; + regtail(cp, OPERAND(p), val); +} + +/* + * sqd_regexec and friends + */ + +/* + * Work-variable struct for sqd_regexec(). + */ +struct exec { + char *reginput; /* String-input pointer. */ + char *regbol; /* Beginning of input, for ^ check. */ + char **regstartp; /* Pointer to startp array. */ + char **regendp; /* Ditto for endp. */ +}; + +/* + * Forwards. + */ +static int regtry(struct exec *ep, sqd_regexp *rp, char *string); +static int regmatch(struct exec *ep, char *prog); +static size_t regrepeat(struct exec *ep, char *node); + +#ifdef DEBUG +int regnarrate = 0; +void regdump(); +static char *regprop(); +#endif + +/* + - sqd_regexec - match a regexp against a string + */ +int +sqd_regexec(prog, str) +register sqd_regexp *prog; +const char *str; +{ + register char *string = (char *)str; /* avert const poisoning */ + register char *s; + struct exec ex; + + /* Be paranoid. */ + if (prog == NULL || string == NULL) { + sqd_regerror("NULL argument to sqd_regexec"); + return(0); + } + + /* Check validity of program. */ + if ((unsigned char)*prog->program != SQD_REGMAGIC) { + sqd_regerror("corrupted regexp"); + return(0); + } + + /* If there is a "must appear" string, look for it. */ + if (prog->regmust != NULL && strstr(string, prog->regmust) == NULL) + return(0); + + /* Mark beginning of line for ^ . */ + ex.regbol = string; + ex.regstartp = prog->startp; + ex.regendp = prog->endp; + + /* Simplest case: anchored match need be tried only once. */ + if (prog->reganch) + return(regtry(&ex, prog, string)); + + /* Messy cases: unanchored match. */ + if (prog->regstart != '\0') { + /* We know what char it must start with. */ + for (s = string; s != NULL; s = strchr(s+1, prog->regstart)) + if (regtry(&ex, prog, s)) + return(1); + return(0); + } else { + /* We don't -- general case. */ + for (s = string; !regtry(&ex, prog, s); s++) + if (*s == '\0') + return(0); + return(1); + } + /* NOTREACHED */ +} + +/* + - regtry - try match at specific point + */ +static int /* 0 failure, 1 success */ +regtry(ep, prog, string) +register struct exec *ep; +sqd_regexp *prog; +char *string; +{ + register int i; + register char **stp; + register char **enp; + + ep->reginput = string; + + stp = prog->startp; + enp = prog->endp; + for (i = NSUBEXP; i > 0; i--) { + *stp++ = NULL; + *enp++ = NULL; + } + if (regmatch(ep, prog->program + 1)) { + prog->startp[0] = string; + prog->endp[0] = ep->reginput; + return(1); + } else + return(0); +} + +/* + - regmatch - main matching routine + * + * Conceptually the strategy is simple: check to see whether the current + * node matches, call self recursively to see whether the rest matches, + * and then act accordingly. In practice we make some effort to avoid + * recursion, in particular by going through "ordinary" nodes (that don't + * need to know whether the rest of the match failed) by a loop instead of + * by recursion. + */ +static int /* 0 failure, 1 success */ +regmatch(ep, prog) +register struct exec *ep; +char *prog; +{ + register char *scan; /* Current node. */ + char *next; /* Next node. */ + +#ifdef DEBUG + if (prog != NULL && regnarrate) + fprintf(stderr, "%s(\n", regprop(prog)); +#endif + for (scan = prog; scan != NULL; scan = next) { +#ifdef DEBUG + if (regnarrate) + fprintf(stderr, "%s...\n", regprop(scan)); +#endif + next = regnext(scan); + + switch (OP(scan)) { + case BOL: + if (ep->reginput != ep->regbol) + return(0); + break; + case EOL: + if (*ep->reginput != '\0') + return(0); + break; + case ANY: + if (*ep->reginput == '\0') + return(0); + ep->reginput++; + break; + case EXACTLY: { + register size_t len; + register char *const opnd = OPERAND(scan); + + /* Inline the first character, for speed. */ + if (*opnd != *ep->reginput) + return(0); + len = strlen(opnd); + if (len > 1 && strncmp(opnd, ep->reginput, len) != 0) + return(0); + ep->reginput += len; + break; + } + case ANYOF: + if (*ep->reginput == '\0' || + strchr(OPERAND(scan), *ep->reginput) == NULL) + return(0); + ep->reginput++; + break; + case ANYBUT: + if (*ep->reginput == '\0' || + strchr(OPERAND(scan), *ep->reginput) != NULL) + return(0); + ep->reginput++; + break; + case NOTHING: + break; + case BACK: + break; + case OPEN+1: case OPEN+2: case OPEN+3: + case OPEN+4: case OPEN+5: case OPEN+6: + case OPEN+7: case OPEN+8: case OPEN+9: { + register const int no = OP(scan) - OPEN; + register char *const input = ep->reginput; + + if (regmatch(ep, next)) { + /* + * Don't set startp if some later + * invocation of the same parentheses + * already has. + */ + if (ep->regstartp[no] == NULL) + ep->regstartp[no] = input; + return(1); + } else + return(0); + break; + } + case CLOSE+1: case CLOSE+2: case CLOSE+3: + case CLOSE+4: case CLOSE+5: case CLOSE+6: + case CLOSE+7: case CLOSE+8: case CLOSE+9: { + register const int no = OP(scan) - CLOSE; + register char *const input = ep->reginput; + + if (regmatch(ep, next)) { + /* + * Don't set endp if some later + * invocation of the same parentheses + * already has. + */ + if (ep->regendp[no] == NULL) + ep->regendp[no] = input; + return(1); + } else + return(0); + break; + } + case BRANCH: { + register char *const save = ep->reginput; + + if (OP(next) != BRANCH) /* No choice. */ + next = OPERAND(scan); /* Avoid recursion. */ + else { + while (OP(scan) == BRANCH) { + if (regmatch(ep, OPERAND(scan))) + return(1); + ep->reginput = save; + scan = regnext(scan); + } + return(0); + /* NOTREACHED */ + } + break; + } + case STAR: case PLUS: { + register const char nextch = + (OP(next) == EXACTLY) ? *OPERAND(next) : '\0'; + register size_t no; + register char *const save = ep->reginput; + register const size_t min = (OP(scan) == STAR) ? 0 : 1; + + for (no = regrepeat(ep, OPERAND(scan)) + 1; no > min; no--) { + ep->reginput = save + no - 1; + /* If it could work, try it. */ + if (nextch == '\0' || *ep->reginput == nextch) + if (regmatch(ep, next)) + return(1); + } + return(0); + break; + } + case END: + return(1); /* Success! */ + break; + default: + sqd_regerror("regexp corruption"); + return(0); + break; + } + } + + /* + * We get here only if there's trouble -- normally "case END" is + * the terminating point. + */ + sqd_regerror("corrupted pointers"); + return(0); +} + +/* + - regrepeat - report how many times something simple would match + */ +static size_t +regrepeat(ep, node) +register struct exec *ep; +char *node; +{ + register size_t count; + register char *scan; + register char ch; + + switch (OP(node)) { + case ANY: + return(strlen(ep->reginput)); + break; + case EXACTLY: + ch = *OPERAND(node); + count = 0; + for (scan = ep->reginput; *scan == ch; scan++) + count++; + return(count); + break; + case ANYOF: + return(strspn(ep->reginput, OPERAND(node))); + break; + case ANYBUT: + return(strcspn(ep->reginput, OPERAND(node))); + break; + default: /* Oh dear. Called inappropriately. */ + sqd_regerror("internal error: bad call of regrepeat"); + return(0); /* Best compromise. */ + break; + } + /* NOTREACHED */ +} + +/* + - regnext - dig the "next" pointer out of a node + */ +static char * +regnext(p) +register char *p; +{ + register const int offset = NEXT(p); + + if (offset == 0) + return(NULL); + + return((OP(p) == BACK) ? p-offset : p+offset); +} + +#ifdef DEBUG + +static char *regprop(); + +/* + - regdump - dump a regexp onto stdout in vaguely comprehensible form + */ +void +regdump(r) +sqd_regexp *r; +{ + register char *s; + register char op = EXACTLY; /* Arbitrary non-END op. */ + register char *next; + + + s = r->program + 1; + while (op != END) { /* While that wasn't END last time... */ + op = OP(s); + printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */ + next = regnext(s); + if (next == NULL) /* Next ptr. */ + printf("(0)"); + else + printf("(%d)", (s-r->program)+(next-s)); + s += 3; + if (op == ANYOF || op == ANYBUT || op == EXACTLY) { + /* Literal string, where present. */ + while (*s != '\0') { + putchar(*s); + s++; + } + s++; + } + putchar('\n'); + } + + /* Header fields of interest. */ + if (r->regstart != '\0') + printf("start `%c' ", r->regstart); + if (r->reganch) + printf("anchored "); + if (r->regmust != NULL) + printf("must have \"%s\"", r->regmust); + printf("\n"); +} + +/* + - regprop - printable representation of opcode + */ +static char * +regprop(op) +char *op; +{ + register char *p; + static char buf[50]; + + (void) strcpy(buf, ":"); + + switch (OP(op)) { + case BOL: + p = "BOL"; + break; + case EOL: + p = "EOL"; + break; + case ANY: + p = "ANY"; + break; + case ANYOF: + p = "ANYOF"; + break; + case ANYBUT: + p = "ANYBUT"; + break; + case BRANCH: + p = "BRANCH"; + break; + case EXACTLY: + p = "EXACTLY"; + break; + case NOTHING: + p = "NOTHING"; + break; + case BACK: + p = "BACK"; + break; + case END: + p = "END"; + break; + case OPEN+1: + case OPEN+2: + case OPEN+3: + case OPEN+4: + case OPEN+5: + case OPEN+6: + case OPEN+7: + case OPEN+8: + case OPEN+9: + sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN); + p = NULL; + break; + case CLOSE+1: + case CLOSE+2: + case CLOSE+3: + case CLOSE+4: + case CLOSE+5: + case CLOSE+6: + case CLOSE+7: + case CLOSE+8: + case CLOSE+9: + sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE); + p = NULL; + break; + case STAR: + p = "STAR"; + break; + case PLUS: + p = "PLUS"; + break; + default: + sqd_regerror("corrupted opcode"); + break; + } + if (p != NULL) + (void) strcat(buf, p); + return(buf); +} +#endif + + +/* + - sqd_regsub - perform substitutions after a regexp match + */ +void +sqd_regsub(rp, source, dest) +const sqd_regexp *rp; +const char *source; +char *dest; +{ + register sqd_regexp * const prog = (sqd_regexp *)rp; + register char *src = (char *)source; + register char *dst = dest; + register char c; + register int no; + register size_t len; + + if (prog == NULL || source == NULL || dest == NULL) { + sqd_regerror("NULL parameter to sqd_regsub"); + return; + } + if ((unsigned char)*(prog->program) != SQD_REGMAGIC) { + sqd_regerror("damaged regexp"); + return; + } + + while ((c = *src++) != '\0') { + if (c == '&') + no = 0; + else if (c == '\\' && isdigit((int) (*src))) + no = *src++ - '0'; + else + no = -1; + + if (no < 0) { /* Ordinary character. */ + if (c == '\\' && (*src == '\\' || *src == '&')) + c = *src++; + *dst++ = c; + } else if (prog->startp[no] != NULL && prog->endp[no] != NULL && + prog->endp[no] > prog->startp[no]) { + len = prog->endp[no] - prog->startp[no]; + (void) strncpy(dst, prog->startp[no], len); + dst += len; + if (*(dst-1) == '\0') { /* strncpy hit NUL. */ + sqd_regerror("damaged match string"); + return; + } + } + } + *dst++ = '\0'; +} + + +void +sqd_regerror(s) +char *s; +{ + fprintf(stderr, "regexp(3): %s\n", s); + exit(EXIT_FAILURE); + /* NOTREACHED */ +} + +#ifdef NBA_TEAM_IN_STL +int +main(int argc, char **argv) +{ + char *pat; + int ntok; + char *s; + int status; + + pat = argv[1]; + ntok = atoi(argv[2]); + s = argv[3]; + + status = Strparse(pat, s, ntok); + if (status == 0) { + printf("no match\n"); + } else { + int i; + printf("MATCH.\n"); + for (i = 1; i <= ntok; i++) + printf("matched token %1d: %s\n", i, sqd_parse[i]); + } +} +#endif /*NBA_TEAM_IN_STL*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/iupac.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,219 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* iupac.c + * + * Globally defines the IUPAC symbols for nucleic acid sequence + * Slowly evolving into a repository of globals. Tue Apr 20 1993 + * + * RCS $Id: iupac.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: iupac.c,v 1.3 2001/02/21 21:09:10 eddy Exp) + */ +#include "squid.h" + +/* Default expected nucleotide occurrence frequencies, A/C/G/T. + * Used (for instance) as the default distribution for + * i.i.d. random nucleotide sequences. + */ +float dnafq[4] = { 0.25, 0.25, 0.25, 0.25 }; + +/* Dayhoff f(i) amino acid occurrence frequencies. + * From SwissProt 34: 21,210,388 residues + * In alphabetic order by single-letter code. + * Used (for instance) as the default distribution for + * i.i.d. random protein sequences. + */ +float aafq[20] = { + 0.075520, /* A */ + 0.016973, /* C */ + 0.053029, /* D */ + 0.063204, /* E */ + 0.040762, /* F */ + 0.068448, /* G */ + 0.022406, /* H */ + 0.057284, /* I */ + 0.059398, /* K */ + 0.093399, /* L */ + 0.023569, /* M */ + 0.045293, /* N */ + 0.049262, /* P */ + 0.040231, /* Q */ + 0.051573, /* R */ + 0.072214, /* S */ + 0.057454, /* T */ + 0.065252, /* V */ + 0.012513, /* W */ + 0.031985 /* Y */ +}; + +char aa_alphabet[] = AMINO_ALPHABET; + /* aa_index converts to pam's 27x27 scheme */ +int aa_index[20] = { 0, 2, 3, 4, 5, 6, 7, 8, 10, 11, + 12, 13, 15, 16, 17, 18, 19, 21, 22, 24 }; + + /* IUPAC code translations */ + /* note: sequence chars are UPPER CASE */ +struct iupactype iupac[] = { + { 'A', 'T', NTA, NTT, }, + { 'C', 'G', NTC, NTG, }, + { 'G', 'C', NTG, NTC, }, + { 'T', 'A', NTT, NTA, }, + { 'U', 'A', NTU, NTA, }, + { 'N', 'N', NTN, NTN, }, + { ' ', ' ', NTGAP, NTGAP, }, + { 'R', 'Y', NTR, NTY, }, + { 'Y', 'R', NTY, NTR, }, + { 'M', 'K', NTM, NTK, }, + { 'K', 'M', NTK, NTM, }, + { 'S', 'S', NTS, NTS, }, + { 'W', 'W', NTW, NTW, }, + { 'H', 'D', NTH, NTD, }, + { 'B', 'V', NTB, NTV, }, + { 'V', 'B', NTV, NTB, }, + { 'D', 'H', NTD, NTH, }, + }; + + +char *stdcode1[65] = { + "K", /* AAA */ + "N", /* AAC */ + "K", /* AAG */ + "N", /* AAU */ + "T", /* ACA */ + "T", /* ACC */ + "T", /* ACG */ + "T", /* ACU */ + "R", /* AGA */ + "S", /* AGC */ + "R", /* AGG */ + "S", /* AGU */ + "I", /* AUA */ + "I", /* AUC */ + "M", /* AUG */ + "I", /* AUU */ + "Q", /* CAA */ + "H", /* CAC */ + "Q", /* CAG */ + "H", /* CAU */ + "P", /* CCA */ + "P", /* CCC */ + "P", /* CCG */ + "P", /* CCU */ + "R", /* CGA */ + "R", /* CGC */ + "R", /* CGG */ + "R", /* CGU */ + "L", /* CUA */ + "L", /* CUC */ + "L", /* CUG */ + "L", /* CUU */ + "E", /* GAA */ + "D", /* GAC */ + "E", /* GAG */ + "D", /* GAU */ + "A", /* GCA */ + "A", /* GCC */ + "A", /* GCG */ + "A", /* GCU */ + "G", /* GGA */ + "G", /* GGC */ + "G", /* GGG */ + "G", /* GGU */ + "V", /* GUA */ + "V", /* GUC */ + "V", /* GUG */ + "V", /* GUU */ + "*", /* UAA */ + "Y", /* UAC */ + "*", /* UAG */ + "Y", /* UAU */ + "S", /* UCA */ + "S", /* UCC */ + "S", /* UCG */ + "S", /* UCU */ + "*", /* UGA */ + "C", /* UGC */ + "W", /* UGG */ + "C", /* UGU */ + "L", /* UUA */ + "F", /* UUC */ + "L", /* UUG */ + "F", /* UUU */ + "X", /* unknown */ +}; + + + + +char *stdcode3[65] = { + "Lys", /* AAA */ + "Asn", /* AAC */ + "Lys", /* AAG */ + "Asn", /* AAU */ + "Thr", /* ACA */ + "Thr", /* ACC */ + "Thr", /* ACG */ + "Thr", /* ACU */ + "Arg", /* AGA */ + "Ser", /* AGC */ + "Arg", /* AGG */ + "Ser", /* AGU */ + "Ile", /* AUA */ + "Ile", /* AUC */ + "Met", /* AUG */ + "Ile", /* AUU */ + "Gln", /* CAA */ + "His", /* CAC */ + "Gln", /* CAG */ + "His", /* CAU */ + "Pro", /* CCA */ + "Pro", /* CCC */ + "Pro", /* CCG */ + "Pro", /* CCU */ + "Arg", /* CGA */ + "Arg", /* CGC */ + "Arg", /* CGG */ + "Arg", /* CGU */ + "Leu", /* CUA */ + "Leu", /* CUC */ + "Leu", /* CUG */ + "Leu", /* CUU */ + "Glu", /* GAA */ + "Asp", /* GAC */ + "Glu", /* GAG */ + "Asp", /* GAU */ + "Ala", /* GCA */ + "Ala", /* GCC */ + "Ala", /* GCG */ + "Ala", /* GCU */ + "Gly", /* GGA */ + "Gly", /* GGC */ + "Gly", /* GGG */ + "Gly", /* GGU */ + "Val", /* GUA */ + "Val", /* GUC */ + "Val", /* GUG */ + "Val", /* GUU */ + "***", /* UAA */ + "Tyr", /* UAC */ + "***", /* UAG */ + "Tyr", /* UAU */ + "Ser", /* UCA */ + "Ser", /* UCC */ + "Ser", /* UCG */ + "Ser", /* UCU */ + "***", /* UGA */ + "Cys", /* UGC */ + "Trp", /* UGG */ + "Cys", /* UGU */ + "Leu", /* UUA */ + "Phe", /* UUC */ + "Leu", /* UUG */ + "Trp", /* UUU */ + "XXX", /* unknown */ +};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/msa.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1442 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* msa.c + * SRE, Mon May 17 10:48:47 1999 + * + * SQUID's interface for multiple sequence alignment + * manipulation: access to the MSA object. + * + * RCS $Id: msa.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: msa.c,v 1.18 2002/10/12 04:40:35 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "squid.h" +#include "msa.h" /* multiple sequence alignment object support */ +#include "gki.h" /* string indexing hashtable code */ +#include "ssi.h" /* SSI sequence file indexing code */ + +/* Function: MSAAlloc() + * Date: SRE, Tue May 18 10:45:47 1999 [St. Louis] + * + * Purpose: Allocate an MSA structure, return a pointer + * to it. + * + * Designed to be used in three ways: + * 1) We know exactly the dimensions of the alignment: + * both nseq and alen. + * msa = MSAAlloc(nseq, alen); + * + * 2) We know the number of sequences but not alen. + * (We add sequences later.) + * msa = MSAAlloc(nseq, 0); + * + * 3) We even don't know the number of sequences, so + * we'll have to dynamically expand allocations. + * We provide a blocksize for the allocation expansion, + * and expand when needed. + * msa = MSAAlloc(10, 0); + * if (msa->nseq == msa->nseqalloc) MSAExpand(msa); + * + * Args: nseq - number of sequences, or nseq allocation blocksize + * alen - length of alignment in columns, or 0 + * + * Returns: pointer to new MSA object, w/ all values initialized. + * Note that msa->nseq is initialized to 0, though space + * is allocated. + * + * Diagnostics: "always works". Die()'s on memory allocation failure. + * + */ +MSA * +MSAAlloc(int nseq, int alen) +{ + MSA *msa; + int i; + + msa = MallocOrDie(sizeof(MSA)); + msa->aseq = MallocOrDie(sizeof(char *) * nseq); + msa->sqname = MallocOrDie(sizeof(char *) * nseq); + msa->sqlen = MallocOrDie(sizeof(int) * nseq); + msa->wgt = MallocOrDie(sizeof(float) * nseq); + + for (i = 0; i < nseq; i++) + { + msa->sqname[i] = NULL; + msa->sqlen[i] = 0; + msa->wgt[i] = -1.0; + + if (alen != 0) msa->aseq[i] = MallocOrDie(sizeof(char) * (alen+1)); + else msa->aseq[i] = NULL; + } + + msa->alen = alen; + msa->nseq = 0; + msa->nseqalloc = nseq; + msa->nseqlump = nseq; + + msa->flags = 0; + msa->type = kOtherSeq; + msa->name = NULL; + msa->desc = NULL; + msa->acc = NULL; + msa->au = NULL; + msa->ss_cons = NULL; + msa->sa_cons = NULL; + msa->rf = NULL; + msa->sqacc = NULL; + msa->sqdesc = NULL; + msa->ss = NULL; + msa->sslen = NULL; + msa->sa = NULL; + msa->salen = NULL; + msa->index = GKIInit(); + msa->lastidx = 0; + + for (i = 0; i < MSA_MAXCUTOFFS; i++) { + msa->cutoff[i] = 0.; + msa->cutoff_is_set[i] = FALSE; + } + + /* Initialize unparsed optional markup + */ + msa->comment = NULL; + msa->ncomment = 0; + msa->alloc_ncomment = 0; + + msa->gf_tag = NULL; + msa->gf = NULL; + msa->ngf = 0; + + msa->gs_tag = NULL; + msa->gs = NULL; + msa->gs_idx = NULL; + msa->ngs = 0; + + msa->gc_tag = NULL; + msa->gc = NULL; + msa->gc_idx = NULL; + msa->ngc = 0; + + msa->gr_tag = NULL; + msa->gr = NULL; + msa->gr_idx = NULL; + msa->ngr = 0; + + /* Done. Return the alloced, initialized structure + */ + return msa; +} + +/* Function: MSAExpand() + * Date: SRE, Tue May 18 11:06:53 1999 [St. Louis] + * + * Purpose: Increase the sequence allocation in an MSA + * by msa->nseqlump. (Typically used when we're reading + * in an alignment sequentially from a file, + * so we don't know nseq until we're done.) + * + * Args: msa - the MSA object + * + * Returns: (void) + * + */ +void +MSAExpand(MSA *msa) +{ + int i,j; + + msa->nseqalloc += msa->nseqlump; + + msa->aseq = ReallocOrDie(msa->aseq, sizeof(char *) * msa->nseqalloc); + msa->sqname = ReallocOrDie(msa->sqname, sizeof(char *) * msa->nseqalloc); + msa->sqlen = ReallocOrDie(msa->sqlen, sizeof(char *) * msa->nseqalloc); + msa->wgt = ReallocOrDie(msa->wgt, sizeof(float) * msa->nseqalloc); + + if (msa->ss != NULL) { + msa->ss = ReallocOrDie(msa->ss, sizeof(char *) * msa->nseqalloc); + msa->sslen = ReallocOrDie(msa->sslen, sizeof(int) * msa->nseqalloc); + } + if (msa->sa != NULL) { + msa->sa = ReallocOrDie(msa->sa, sizeof(char *) * msa->nseqalloc); + msa->salen = ReallocOrDie(msa->salen, sizeof(int) * msa->nseqalloc); + } + if (msa->sqacc != NULL) + msa->sqacc = ReallocOrDie(msa->sqacc, sizeof(char *) * msa->nseqalloc); + if (msa->sqdesc != NULL) + msa->sqdesc =ReallocOrDie(msa->sqdesc,sizeof(char *) * msa->nseqalloc); + + for (i = msa->nseqalloc-msa->nseqlump; i < msa->nseqalloc; i++) + { + msa->sqname[i] = NULL; + msa->wgt[i] = -1.0; + + if (msa->sqacc != NULL) msa->sqacc[i] = NULL; + if (msa->sqdesc != NULL) msa->sqdesc[i] = NULL; + + if (msa->alen != 0) + msa->aseq[i] = ReallocOrDie(msa->aseq[i], sizeof(char) * (msa->alen+1)); + else msa->aseq[i] = NULL; + msa->sqlen[i] = 0; + + if (msa->ss != NULL) { + if (msa->alen != 0) + msa->ss[i] = ReallocOrDie(msa->ss[i], sizeof(char) * (msa->alen+1)); + else msa->ss[i] = NULL; + msa->sslen[i] = 0; + } + if (msa->sa != NULL) { + if (msa->alen != 0) + msa->sa[i] = ReallocOrDie(msa->ss[i], sizeof(char) * (msa->alen+1)); + else + msa->sa[i] = NULL; + msa->salen[i] = 0; + } + } + + /* Reallocate and re-init for unparsed #=GS tags, if we have some. + * gs is [0..ngs-1][0..nseq-1][], so we're reallocing the middle + * set of pointers. + */ + if (msa->gs != NULL) + for (i = 0; i < msa->ngs; i++) + { + if (msa->gs[i] != NULL) + { + msa->gs[i] = ReallocOrDie(msa->gs[i], sizeof(char *) * msa->nseqalloc); + for (j = msa->nseqalloc-msa->nseqlump; j < msa->nseqalloc; j++) + msa->gs[i][j] = NULL; + } + } + + /* Reallocate and re-init for unparsed #=GR tags, if we have some. + * gr is [0..ngs-1][0..nseq-1][], so we're reallocing the middle + * set of pointers. + */ + if (msa->gr != NULL) + for (i = 0; i < msa->ngr; i++) + { + if (msa->gr[i] != NULL) + { + msa->gr[i] = ReallocOrDie(msa->gr[i], sizeof(char *) * msa->nseqalloc); + for (j = msa->nseqalloc-msa->nseqlump; j < msa->nseqalloc; j++) + msa->gr[i][j] = NULL; + } + } + + return; +} + +/* Function: MSAFree() + * Date: SRE, Tue May 18 11:20:16 1999 [St. Louis] + * + * Purpose: Free a multiple sequence alignment structure. + * + * Args: msa - the alignment + * + * Returns: (void) + */ +void +MSAFree(MSA *msa) +{ + Free2DArray((void **) msa->aseq, msa->nseq); + Free2DArray((void **) msa->sqname, msa->nseq); + Free2DArray((void **) msa->sqacc, msa->nseq); + Free2DArray((void **) msa->sqdesc, msa->nseq); + Free2DArray((void **) msa->ss, msa->nseq); + Free2DArray((void **) msa->sa, msa->nseq); + + if (msa->sqlen != NULL) free(msa->sqlen); + if (msa->wgt != NULL) free(msa->wgt); + + if (msa->name != NULL) free(msa->name); + if (msa->desc != NULL) free(msa->desc); + if (msa->acc != NULL) free(msa->acc); + if (msa->au != NULL) free(msa->au); + if (msa->ss_cons != NULL) free(msa->ss_cons); + if (msa->sa_cons != NULL) free(msa->sa_cons); + if (msa->rf != NULL) free(msa->rf); + if (msa->sslen != NULL) free(msa->sslen); + if (msa->salen != NULL) free(msa->salen); + + Free2DArray((void **) msa->comment, msa->ncomment); + Free2DArray((void **) msa->gf_tag, msa->ngf); + Free2DArray((void **) msa->gf, msa->ngf); + Free2DArray((void **) msa->gs_tag, msa->ngs); + Free3DArray((void ***)msa->gs, msa->ngs, msa->nseq); + Free2DArray((void **) msa->gc_tag, msa->ngc); + Free2DArray((void **) msa->gc, msa->ngc); + Free2DArray((void **) msa->gr_tag, msa->ngr); + Free3DArray((void ***)msa->gr, msa->ngr, msa->nseq); + + GKIFree(msa->index); + GKIFree(msa->gs_idx); + GKIFree(msa->gc_idx); + GKIFree(msa->gr_idx); + + free(msa); +} + + +/* Function: MSASetSeqAccession() + * Date: SRE, Mon Jun 21 04:13:33 1999 [Sanger Centre] + * + * Purpose: Set a sequence accession in an MSA structure. + * Handles some necessary allocation/initialization. + * + * Args: msa - multiple alignment to add accession to + * seqidx - index of sequence to attach accession to + * acc - accession + * + * Returns: void + */ +void +MSASetSeqAccession(MSA *msa, int seqidx, char *acc) +{ + int x; + + if (msa->sqacc == NULL) { + msa->sqacc = MallocOrDie(sizeof(char *) * msa->nseqalloc); + for (x = 0; x < msa->nseqalloc; x++) + msa->sqacc[x] = NULL; + } + msa->sqacc[seqidx] = sre_strdup(acc, -1); +} + +/* Function: MSASetSeqDescription() + * Date: SRE, Mon Jun 21 04:21:09 1999 [Sanger Centre] + * + * Purpose: Set a sequence description in an MSA structure. + * Handles some necessary allocation/initialization. + * + * Args: msa - multiple alignment to add accession to + * seqidx - index of sequence to attach accession to + * desc - description + * + * Returns: void + */ +void +MSASetSeqDescription(MSA *msa, int seqidx, char *desc) +{ + int x; + + if (msa->sqdesc == NULL) { + msa->sqdesc = MallocOrDie(sizeof(char *) * msa->nseqalloc); + for (x = 0; x < msa->nseqalloc; x++) + msa->sqdesc[x] = NULL; + } + msa->sqdesc[seqidx] = sre_strdup(desc, -1); +} + + +/* Function: MSAAddComment() + * Date: SRE, Tue Jun 1 17:37:21 1999 [St. Louis] + * + * Purpose: Add an (unparsed) comment line to the MSA structure, + * allocating as necessary. + * + * Args: msa - a multiple alignment + * s - comment line to add + * + * Returns: (void) + */ +void +MSAAddComment(MSA *msa, char *s) +{ + /* If this is our first recorded comment, we need to malloc(); + * and if we've filled available space, we need to realloc(). + * Note the arbitrary lumpsize of 10 lines per allocation... + */ + if (msa->comment == NULL) { + msa->comment = MallocOrDie (sizeof(char *) * 10); + msa->alloc_ncomment = 10; + } + if (msa->ncomment == msa->alloc_ncomment) { + msa->alloc_ncomment += 10; + msa->comment = ReallocOrDie(msa->comment, sizeof(char *) * msa->alloc_ncomment); + } + + msa->comment[msa->ncomment] = sre_strdup(s, -1); + msa->ncomment++; + return; +} + +/* Function: MSAAddGF() + * Date: SRE, Wed Jun 2 06:53:54 1999 [bus to Madison] + * + * Purpose: Add an unparsed #=GF markup line to the MSA + * structure, allocating as necessary. + * + * Args: msa - a multiple alignment + * tag - markup tag (e.g. "AU") + * value - free text markup (e.g. "Alex Bateman") + * + * Returns: (void) + */ +void +MSAAddGF(MSA *msa, char *tag, char *value) +{ + /* If this is our first recorded unparsed #=GF line, we need to malloc(); + * if we've filled availabl space If we already have a hash index, and the GF + * Note the arbitrary lumpsize of 10 lines per allocation... + */ + if (msa->gf_tag == NULL) { + msa->gf_tag = MallocOrDie (sizeof(char *) * 10); + msa->gf = MallocOrDie (sizeof(char *) * 10); + msa->alloc_ngf = 10; + } + if (msa->ngf == msa->alloc_ngf) { + msa->alloc_ngf += 10; + msa->gf_tag = ReallocOrDie(msa->gf_tag, sizeof(char *) * msa->alloc_ngf); + msa->gf = ReallocOrDie(msa->gf, sizeof(char *) * msa->alloc_ngf); + } + + msa->gf_tag[msa->ngf] = sre_strdup(tag, -1); + msa->gf[msa->ngf] = sre_strdup(value, -1); + msa->ngf++; + + return; +} + + +/* Function: MSAAddGS() + * Date: SRE, Wed Jun 2 06:57:03 1999 [St. Louis] + * + * Purpose: Add an unparsed #=GS markup line to the MSA + * structure, allocating as necessary. + * + * It's possible that we could get more than one + * of the same type of GS tag per sequence; for + * example, "DR PDB;" structure links in Pfam. + * Hack: handle these by appending to the string, + * in a \n separated fashion. + * + * Args: msa - multiple alignment structure + * tag - markup tag (e.g. "AC") + * sqidx - index of sequence to assoc markup with (0..nseq-1) + * value - markup (e.g. "P00666") + * + * Returns: 0 on success + */ +void +MSAAddGS(MSA *msa, char *tag, int sqidx, char *value) +{ + int tagidx; + int i; + + /* Is this an unparsed tag name that we recognize? + * If not, handle adding it to index, and reallocating + * as needed. + */ + if (msa->gs_tag == NULL) /* first tag? init w/ malloc */ + { + msa->gs_idx = GKIInit(); + tagidx = GKIStoreKey(msa->gs_idx, tag); + SQD_DASSERT1((tagidx == 0)); + msa->gs_tag = MallocOrDie(sizeof(char *)); + msa->gs = MallocOrDie(sizeof(char **)); + msa->gs[0] = MallocOrDie(sizeof(char *) * msa->nseqalloc); + for (i = 0; i < msa->nseqalloc; i++) + msa->gs[0][i] = NULL; + } + else + { + /* new tag? */ + tagidx = GKIKeyIndex(msa->gs_idx, tag); + if (tagidx < 0) { /* it's a new tag name; realloc */ + tagidx = GKIStoreKey(msa->gs_idx, tag); + /* since we alloc in blocks of 1, + we always realloc upon seeing + a new tag. */ + SQD_DASSERT1((tagidx == msa->ngs)); + msa->gs_tag = ReallocOrDie(msa->gs_tag, (msa->ngs+1) * sizeof(char *)); + msa->gs = ReallocOrDie(msa->gs, (msa->ngs+1) * sizeof(char **)); + msa->gs[msa->ngs] = MallocOrDie(sizeof(char *) * msa->nseqalloc); + for (i = 0; i < msa->nseqalloc; i++) + msa->gs[msa->ngs][i] = NULL; + } + } + + if (tagidx == msa->ngs) { + msa->gs_tag[tagidx] = sre_strdup(tag, -1); + msa->ngs++; + } + + if (msa->gs[tagidx][sqidx] == NULL) /* first annotation of this seq with this tag? */ + msa->gs[tagidx][sqidx] = sre_strdup(value, -1); + else { + /* >1 annotation of this seq with this tag; append */ + int len; + if ((len = sre_strcat(&(msa->gs[tagidx][sqidx]), -1, "\n", 1)) < 0) + Die("failed to sre_strcat()"); + if (sre_strcat(&(msa->gs[tagidx][sqidx]), len, value, -1) < 0) + Die("failed to sre_strcat()"); + } + return; +} + +/* Function: MSAAppendGC() + * Date: SRE, Thu Jun 3 06:25:14 1999 [Madison] + * + * Purpose: Add an unparsed #=GC markup line to the MSA + * structure, allocating as necessary. + * + * When called multiple times for the same tag, + * appends value strings together -- used when + * parsing multiblock alignment files, for + * example. + * + * Args: msa - multiple alignment structure + * tag - markup tag (e.g. "CS") + * value - markup, one char per aligned column + * + * Returns: (void) + */ +void +MSAAppendGC(MSA *msa, char *tag, char *value) +{ + int tagidx; + + /* Is this an unparsed tag name that we recognize? + * If not, handle adding it to index, and reallocating + * as needed. + */ + if (msa->gc_tag == NULL) /* first tag? init w/ malloc */ + { + msa->gc_tag = MallocOrDie(sizeof(char *)); + msa->gc = MallocOrDie(sizeof(char *)); + msa->gc_idx = GKIInit(); + tagidx = GKIStoreKey(msa->gc_idx, tag); + SQD_DASSERT1((tagidx == 0)); + msa->gc[0] = NULL; + } + else + { /* new tag? */ + tagidx = GKIKeyIndex(msa->gc_idx, tag); + if (tagidx < 0) { /* it's a new tag name; realloc */ + tagidx = GKIStoreKey(msa->gc_idx, tag); + /* since we alloc in blocks of 1, + we always realloc upon seeing + a new tag. */ + SQD_DASSERT1((tagidx == msa->ngc)); + msa->gc_tag = ReallocOrDie(msa->gc_tag, (msa->ngc+1) * sizeof(char **)); + msa->gc = ReallocOrDie(msa->gc, (msa->ngc+1) * sizeof(char **)); + msa->gc[tagidx] = NULL; + } + } + + if (tagidx == msa->ngc) { + msa->gc_tag[tagidx] = sre_strdup(tag, -1); + msa->ngc++; + } + sre_strcat(&(msa->gc[tagidx]), -1, value, -1); + return; +} + +/* Function: MSAGetGC() + * Date: SRE, Fri Aug 13 13:25:57 1999 [St. Louis] + * + * Purpose: Given a tagname for a miscellaneous #=GC column + * annotation, return a pointer to the annotation + * string. + * + * Args: msa - alignment and its annotation + * tag - name of the annotation + * + * Returns: ptr to the annotation string. Caller does *not* + * free; is managed by msa object still. + */ +char * +MSAGetGC(MSA *msa, char *tag) +{ + int tagidx; + + if (msa->gc_idx == NULL) return NULL; + if ((tagidx = GKIKeyIndex(msa->gc_idx, tag)) < 0) return NULL; + return msa->gc[tagidx]; +} + + +/* Function: MSAAppendGR() + * Date: SRE, Thu Jun 3 06:34:38 1999 [Madison] + * + * Purpose: Add an unparsed #=GR markup line to the + * MSA structure, allocating as necessary. + * + * When called multiple times for the same tag, + * appends value strings together -- used when + * parsing multiblock alignment files, for + * example. + * + * Args: msa - multiple alignment structure + * tag - markup tag (e.g. "SS") + * sqidx - index of seq to assoc markup with (0..nseq-1) + * value - markup, one char per aligned column + * + * Returns: (void) + */ +void +MSAAppendGR(MSA *msa, char *tag, int sqidx, char *value) +{ + int tagidx; + int i; + + /* Is this an unparsed tag name that we recognize? + * If not, handle adding it to index, and reallocating + * as needed. + */ + if (msa->gr_tag == NULL) /* first tag? init w/ malloc */ + { + msa->gr_tag = MallocOrDie(sizeof(char *)); + msa->gr = MallocOrDie(sizeof(char **)); + msa->gr[0] = MallocOrDie(sizeof(char *) * msa->nseqalloc); + for (i = 0; i < msa->nseqalloc; i++) + msa->gr[0][i] = NULL; + msa->gr_idx = GKIInit(); + tagidx = GKIStoreKey(msa->gr_idx, tag); + SQD_DASSERT1((tagidx == 0)); + } + else + { + /* new tag? */ + tagidx = GKIKeyIndex(msa->gr_idx, tag); + if (tagidx < 0) { /* it's a new tag name; realloc */ + tagidx = GKIStoreKey(msa->gr_idx, tag); + /* since we alloc in blocks of 1, + we always realloc upon seeing + a new tag. */ + SQD_DASSERT1((tagidx == msa->ngr)); + msa->gr_tag = ReallocOrDie(msa->gr_tag, (msa->ngr+1) * sizeof(char *)); + msa->gr = ReallocOrDie(msa->gr, (msa->ngr+1) * sizeof(char **)); + msa->gr[msa->ngr] = MallocOrDie(sizeof(char *) * msa->nseqalloc); + for (i = 0; i < msa->nseqalloc; i++) + msa->gr[msa->ngr][i] = NULL; + } + } + + if (tagidx == msa->ngr) { + msa->gr_tag[tagidx] = sre_strdup(tag, -1); + msa->ngr++; + } + sre_strcat(&(msa->gr[tagidx][sqidx]), -1, value, -1); + return; +} + + +/* Function: MSAVerifyParse() + * Date: SRE, Sat Jun 5 14:24:24 1999 [Madison, 1999 worm mtg] + * + * Purpose: Last function called after a multiple alignment is + * parsed. Checks that parse was successful; makes sure + * required information is present; makes sure required + * information is consistent. Some fields that are + * only use during parsing may be freed (sqlen, for + * example). + * + * Some fields in msa may be modified (msa->alen is set, + * for example). + * + * Args: msa - the multiple alignment + * sqname, aseq must be set + * nseq must be correct + * alen need not be set; will be set here. + * wgt will be set here if not already set + * + * Returns: (void) + * Will Die() here with diagnostics on error. + * + * Example: + */ +void +MSAVerifyParse(MSA *msa) +{ + int idx; + + if (msa->nseq == 0) Die("Parse error: no sequences were found for alignment %s", + msa->name != NULL ? msa->name : ""); + + msa->alen = msa->sqlen[0]; + + /* We can rely on msa->sqname[] being valid for any index, + * because of the way the line parsers always store any name + * they add to the index. + */ + for (idx = 0; idx < msa->nseq; idx++) + { + /* aseq is required. */ + if (msa->aseq[idx] == NULL) + Die("Parse error: No sequence for %s in alignment %s", msa->sqname[idx], + msa->name != NULL ? msa->name : ""); + /* either all weights must be set, or none of them */ + if ((msa->flags & MSA_SET_WGT) && msa->wgt[idx] == -1.0) + Die("Parse error: some weights are set, but %s doesn't have one in alignment %s", + msa->sqname[idx], + msa->name != NULL ? msa->name : ""); + /* all aseq must be same length. */ + if (msa->sqlen[idx] != msa->alen) + Die("Parse error: sequence %s: length %d, expected %d in alignment %s", + msa->sqname[idx], msa->sqlen[idx], msa->alen, + msa->name != NULL ? msa->name : ""); + /* if SS is present, must have length right */ + if (msa->ss != NULL && msa->ss[idx] != NULL && msa->sslen[idx] != msa->alen) + Die("Parse error: #=GR SS annotation for %s: length %d, expected %d in alignment %s", + msa->sqname[idx], msa->sslen[idx], msa->alen, + msa->name != NULL ? msa->name : ""); + /* if SA is present, must have length right */ + if (msa->sa != NULL && msa->sa[idx] != NULL && msa->salen[idx] != msa->alen) + Die("Parse error: #=GR SA annotation for %s: length %d, expected %d in alignment %s", + msa->sqname[idx], msa->salen[idx], msa->alen, + msa->name != NULL ? msa->name : ""); + } + + /* if cons SS is present, must have length right */ + if (msa->ss_cons != NULL && strlen(msa->ss_cons) != msa->alen) + Die("Parse error: #=GC SS_cons annotation: length %d, expected %d in alignment %s", + strlen(msa->ss_cons), msa->alen, + msa->name != NULL ? msa->name : ""); + + /* if cons SA is present, must have length right */ + if (msa->sa_cons != NULL && strlen(msa->sa_cons) != msa->alen) + Die("Parse error: #=GC SA_cons annotation: length %d, expected %d in alignment %s", + strlen(msa->sa_cons), msa->alen, + msa->name != NULL ? msa->name : ""); + + /* if RF is present, must have length right */ + if (msa->rf != NULL && strlen(msa->rf) != msa->alen) + Die("Parse error: #=GC RF annotation: length %d, expected %d in alignment %s", + strlen(msa->rf), msa->alen, + msa->name != NULL ? msa->name : ""); + + /* Check that all or no weights are set */ + if (!(msa->flags & MSA_SET_WGT)) + FSet(msa->wgt, msa->nseq, 1.0); /* default weights */ + + /* Clean up a little from the parser */ + if (msa->sqlen != NULL) { free(msa->sqlen); msa->sqlen = NULL; } + if (msa->sslen != NULL) { free(msa->sslen); msa->sslen = NULL; } + if (msa->salen != NULL) { free(msa->salen); msa->salen = NULL; } + + return; +} + + + + +/* Function: MSAFileOpen() + * Date: SRE, Tue May 18 13:22:01 1999 [St. Louis] + * + * Purpose: Open an alignment database file and prepare + * for reading one alignment, or sequentially + * in the (rare) case of multiple MSA databases + * (e.g. Stockholm format). + * + * Args: filename - name of file to open + * if "-", read stdin + * if it ends in ".gz", read from pipe to gunzip -dc + * format - format of file (e.g. MSAFILE_STOCKHOLM) + * env - environment variable for path (e.g. BLASTDB) + * + * Returns: opened MSAFILE * on success. + * NULL on failure: + * usually, because the file doesn't exist; + * for gzip'ed files, may also mean that gzip isn't in the path. + */ +MSAFILE * +MSAFileOpen(char *filename, int format, char *env) +{ + MSAFILE *afp; + + afp = MallocOrDie(sizeof(MSAFILE)); + if (strcmp(filename, "-") == 0) + { + afp->f = stdin; + afp->do_stdin = TRUE; + afp->do_gzip = FALSE; + afp->fname = sre_strdup("[STDIN]", -1); + afp->ssi = NULL; /* can't index stdin because we can't seek*/ + } +#ifndef SRE_STRICT_ANSI + /* popen(), pclose() aren't portable to non-POSIX systems; disable */ + else if (Strparse("^.*\\.gz$", filename, 0)) + { + char cmd[256]; + + /* Note that popen() will return "successfully" + * if file doesn't exist, because gzip works fine + * and prints an error! So we have to check for + * existence of file ourself. + */ + if (! FileExists(filename)) + Die("%s: file does not exist", filename); + if (strlen(filename) + strlen("gzip -dc ") >= 256) + Die("filename > 255 char in MSAFileOpen()"); + sprintf(cmd, "gzip -dc %s", filename); + if ((afp->f = popen(cmd, "r")) == NULL) + return NULL; + + afp->do_stdin = FALSE; + afp->do_gzip = TRUE; + afp->fname = sre_strdup(filename, -1); + /* we can't index a .gz file, because we can't seek in a pipe afaik */ + afp->ssi = NULL; + } +#endif /*SRE_STRICT_ANSI*/ + else + { + char *ssifile; + char *dir; + + /* When we open a file, it may be either in the current + * directory, or in the directory indicated by the env + * argument - and we have to construct the SSI filename accordingly. + */ + if ((afp->f = fopen(filename, "r")) != NULL) + { + ssifile = MallocOrDie(sizeof(char) * (strlen(filename) + 5)); + sprintf(ssifile, "%s.ssi", filename); + } + else if ((afp->f = EnvFileOpen(filename, env, &dir)) != NULL) + { + char *full; + full = FileConcat(dir, filename); + ssifile = MallocOrDie(sizeof(char) * (strlen(full) + strlen(filename) + 5)); + sprintf(ssifile, "%s.ssi", full); + free(dir); + } + else return NULL; + + afp->do_stdin = FALSE; + afp->do_gzip = FALSE; + afp->fname = sre_strdup(filename, -1); + afp->ssi = NULL; + + /* Open the SSI index file. If it doesn't exist, or + * it's corrupt, or some error happens, afp->ssi stays NULL. + */ + SSIOpen(ssifile, &(afp->ssi)); + free(ssifile); + } + + /* Invoke autodetection if we haven't already been told what + * to expect. + */ + if (format == MSAFILE_UNKNOWN) + { + if (afp->do_stdin == TRUE || afp->do_gzip) + Die("Can't autodetect alignment file format from a stdin or gzip pipe"); + format = MSAFileFormat(afp); + if (format == MSAFILE_UNKNOWN) + Die("Can't determine format of multiple alignment file %s", afp->fname); + } + + afp->format = format; + afp->linenumber = 0; + afp->buf = NULL; + afp->buflen = 0; + + return afp; +} + + +/* Function: MSAFilePositionByKey() + * MSAFilePositionByIndex() + * MSAFileRewind() + * + * Date: SRE, Tue Nov 9 19:02:54 1999 [St. Louis] + * + * Purpose: Family of functions for repositioning in + * open MSA files; analogous to a similarly + * named function series in HMMER's hmmio.c. + * + * Args: afp - open alignment file + * offset - disk offset in bytes + * key - key to look up in SSI indices + * idx - index of alignment. + * + * Returns: 0 on failure. + * 1 on success. + * If called on a non-fseek()'able file (e.g. a gzip'ed + * or pipe'd alignment), returns 0 as a failure flag. + */ +int +MSAFileRewind(MSAFILE *afp) +{ + if (afp->do_gzip || afp->do_stdin) return 0; + rewind(afp->f); + return 1; +} +int +MSAFilePositionByKey(MSAFILE *afp, char *key) +{ + int fh; /* filehandle is ignored */ + SSIOFFSET offset; /* offset of the key alignment */ + + if (afp->ssi == NULL) return 0; + if (SSIGetOffsetByName(afp->ssi, key, &fh, &offset) != 0) return 0; + if (SSISetFilePosition(afp->f, &offset) != 0) return 0; + return 1; +} +int +MSAFilePositionByIndex(MSAFILE *afp, int idx) +{ + int fh; /* filehandled is passed but ignored */ + SSIOFFSET offset; /* disk offset of desired alignment */ + + if (afp->ssi == NULL) return 0; + if (SSIGetOffsetByNumber(afp->ssi, idx, &fh, &offset) != 0) return 0; + if (SSISetFilePosition(afp->f, &offset) != 0) return 0; + return 1; +} + + +/* Function: MSAFileRead() + * Date: SRE, Fri May 28 16:01:43 1999 [St. Louis] + * + * Purpose: Read the next msa from an open alignment file. + * This is a wrapper around format-specific calls. + * + * Args: afp - open alignment file + * + * Returns: next alignment, or NULL if out of alignments + */ +MSA * +MSAFileRead(MSAFILE *afp) +{ + MSA *msa = NULL; + + switch (afp->format) { + case MSAFILE_STOCKHOLM: msa = ReadStockholm(afp); break; + case MSAFILE_MSF: msa = ReadMSF(afp); break; + case MSAFILE_A2M: msa = ReadA2M(afp); break; + case MSAFILE_CLUSTAL: msa = ReadClustal(afp); break; + case MSAFILE_SELEX: msa = ReadSELEX(afp); break; + case MSAFILE_PHYLIP: msa = ReadPhylip(afp); break; + default: + Die("MSAFILE corrupted: bad format index"); + } + return msa; +} + +/* Function: MSAFileClose() + * Date: SRE, Tue May 18 14:05:28 1999 [St. Louis] + * + * Purpose: Close an open MSAFILE. + * + * Args: afp - ptr to an open MSAFILE. + * + * Returns: void + */ +void +MSAFileClose(MSAFILE *afp) +{ +#ifndef SRE_STRICT_ANSI /* gzip functionality only on POSIX systems */ + if (afp->do_gzip) pclose(afp->f); +#endif + if (! afp->do_stdin) fclose(afp->f); + if (afp->buf != NULL) free(afp->buf); + if (afp->ssi != NULL) SSIClose(afp->ssi); + if (afp->fname != NULL) free(afp->fname); + free(afp); +} + +char * +MSAFileGetLine(MSAFILE *afp) +{ + char *s; + if ((s = sre_fgets(&(afp->buf), &(afp->buflen), afp->f)) == NULL) + return NULL; + afp->linenumber++; + return afp->buf; +} + +void +MSAFileWrite(FILE *fp, MSA *msa, int outfmt, int do_oneline) +{ + switch (outfmt) { +#ifdef CLUSTALO + case MSAFILE_A2M: WriteA2M(stdout, msa, 0); break; + case MSAFILE_VIENNA: WriteA2M(stdout, msa, 1); break; +#else + case MSAFILE_A2M: WriteA2M(stdout, msa); break; +#endif + case MSAFILE_CLUSTAL: WriteClustal(stdout, msa); break; + case MSAFILE_MSF: WriteMSF(stdout, msa); break; + case MSAFILE_PHYLIP: WritePhylip(stdout, msa); break; + case MSAFILE_SELEX: WriteSELEX(stdout, msa); break; + case MSAFILE_STOCKHOLM: + if (do_oneline) WriteStockholmOneBlock(stdout, msa); + else WriteStockholm(stdout, msa); + break; + default: + Die("can't write. no such alignment format %d\n", outfmt); + } +} + +/* Function: MSAGetSeqidx() + * Date: SRE, Wed May 19 15:08:25 1999 [St. Louis] + * + * Purpose: From a sequence name, return seqidx appropriate + * for an MSA structure. + * + * 1) try to guess the index. (pass -1 if you can't guess) + * 2) Look up name in msa's hashtable. + * 3) If it's a new name, store in msa's hashtable; + * expand allocs as needed; + * save sqname. + * + * Args: msa - alignment object + * name - a sequence name + * guess - a guess at the right index, or -1 if no guess. + * + * Returns: seqidx + */ +int +MSAGetSeqidx(MSA *msa, char *name, int guess) +{ + int seqidx; + /* can we guess? */ + if (guess >= 0 && guess < msa->nseq && strcmp(name, msa->sqname[guess]) == 0) + return guess; + /* else, a lookup in the index */ + if ((seqidx = GKIKeyIndex(msa->index, name)) >= 0) + return seqidx; + /* else, it's a new name */ + seqidx = GKIStoreKey(msa->index, name); + if (seqidx >= msa->nseqalloc) MSAExpand(msa); + + msa->sqname[seqidx] = sre_strdup(name, -1); + msa->nseq++; + return seqidx; +} + + +/* Function: MSAFromAINFO() + * Date: SRE, Mon Jun 14 11:22:24 1999 [St. Louis] + * + * Purpose: Convert the old aseq/ainfo alignment structure + * to new MSA structure. Enables more rapid conversion + * of codebase to the new world order. + * + * Args: aseq - [0..nseq-1][0..alen-1] alignment + * ainfo - old-style optional info + * + * Returns: MSA * + */ +MSA * +MSAFromAINFO(char **aseq, AINFO *ainfo) +{ + MSA *msa; + int i, j; + + msa = MSAAlloc(ainfo->nseq, ainfo->alen); + for (i = 0; i < ainfo->nseq; i++) + { + strcpy(msa->aseq[i], aseq[i]); + msa->wgt[i] = ainfo->wgt[i]; + msa->sqname[i] = sre_strdup(ainfo->sqinfo[i].name, -1); + msa->sqlen[i] = msa->alen; + GKIStoreKey(msa->index, msa->sqname[i]); + + if (ainfo->sqinfo[i].flags & SQINFO_ACC) + MSASetSeqAccession(msa, i, ainfo->sqinfo[i].acc); + + if (ainfo->sqinfo[i].flags & SQINFO_DESC) + MSASetSeqDescription(msa, i, ainfo->sqinfo[i].desc); + + if (ainfo->sqinfo[i].flags & SQINFO_SS) { + if (msa->ss == NULL) { + msa->ss = MallocOrDie(sizeof(char *) * msa->nseqalloc); + msa->sslen = MallocOrDie(sizeof(int) * msa->nseqalloc); + for (j = 0; j < msa->nseqalloc; j++) { + msa->ss[j] = NULL; + msa->sslen[j] = 0; + } + } + MakeAlignedString(msa->aseq[i], msa->alen, ainfo->sqinfo[i].ss, &(msa->ss[i])); + msa->sslen[i] = msa->alen; + } + + if (ainfo->sqinfo[i].flags & SQINFO_SA) { + if (msa->sa == NULL) { + msa->sa = MallocOrDie(sizeof(char *) * msa->nseqalloc); + msa->salen = MallocOrDie(sizeof(int) * msa->nseqalloc); + for (j = 0; j < msa->nseqalloc; j++) { + msa->sa[j] = NULL; + msa->salen[j] = 0; + } + } + MakeAlignedString(msa->aseq[i], msa->alen, ainfo->sqinfo[i].sa, &(msa->sa[i])); + msa->salen[i] = msa->alen; + } + } + /* note that sre_strdup() returns NULL when passed NULL */ + msa->name = sre_strdup(ainfo->name, -1); + msa->desc = sre_strdup(ainfo->desc, -1); + msa->acc = sre_strdup(ainfo->acc, -1); + msa->au = sre_strdup(ainfo->au, -1); + msa->ss_cons = sre_strdup(ainfo->cs, -1); + msa->rf = sre_strdup(ainfo->rf, -1); + if (ainfo->flags & AINFO_TC) { + msa->cutoff[MSA_CUTOFF_TC1] = ainfo->tc1; msa->cutoff_is_set[MSA_CUTOFF_TC1] = TRUE; + msa->cutoff[MSA_CUTOFF_TC2] = ainfo->tc2; msa->cutoff_is_set[MSA_CUTOFF_TC2] = TRUE; + } + if (ainfo->flags & AINFO_NC) { + msa->cutoff[MSA_CUTOFF_NC1] = ainfo->nc1; msa->cutoff_is_set[MSA_CUTOFF_NC1] = TRUE; + msa->cutoff[MSA_CUTOFF_NC2] = ainfo->nc2; msa->cutoff_is_set[MSA_CUTOFF_NC2] = TRUE; + } + if (ainfo->flags & AINFO_GA) { + msa->cutoff[MSA_CUTOFF_GA1] = ainfo->ga1; msa->cutoff_is_set[MSA_CUTOFF_GA1] = TRUE; + msa->cutoff[MSA_CUTOFF_GA2] = ainfo->ga2; msa->cutoff_is_set[MSA_CUTOFF_GA2] = TRUE; + } + msa->nseq = ainfo->nseq; + msa->alen = ainfo->alen; + return msa; +} + + + + +/* Function: MSAFileFormat() + * Date: SRE, Fri Jun 18 14:26:49 1999 [Sanger Centre] + * + * Purpose: (Attempt to) determine the format of an alignment file. + * Since it rewinds the file pointer when it's done, + * cannot be used on a pipe or gzip'ed file. Works by + * calling SeqfileFormat() from sqio.c, then making sure + * that the format is indeed an alignment. If the format + * comes back as FASTA, it assumes that the format as A2M + * (e.g. aligned FASTA). + * + * Args: fname - file to evaluate + * + * Returns: format code; e.g. MSAFILE_STOCKHOLM + */ +int +MSAFileFormat(MSAFILE *afp) +{ + int fmt; + + fmt = SeqfileFormat(afp->f); + + if (fmt == SQFILE_FASTA) fmt = MSAFILE_A2M; + + if (fmt != MSAFILE_UNKNOWN && ! IsAlignmentFormat(fmt)) + Die("File %s does not appear to be an alignment file;\n\ +rather, it appears to be an unaligned file in %s format.\n\ +I'm expecting an alignment file in this context.\n", + afp->fname, + SeqfileFormat2String(fmt)); + return fmt; +} + + +/* Function: MSAMingap() + * Date: SRE, Mon Jun 28 18:57:54 1999 [on jury duty, St. Louis Civil Court] + * + * Purpose: Remove all-gap columns from a multiple sequence alignment + * and its associated per-residue data. + * + * Args: msa - the alignment + * + * Returns: (void) + */ +void +MSAMingap(MSA *msa) +{ + int *useme; /* array of TRUE/FALSE flags for which columns to keep */ + int apos; /* position in original alignment */ + int idx; /* sequence index */ + + useme = MallocOrDie(sizeof(int) * msa->alen); + for (apos = 0; apos < msa->alen; apos++) + { + for (idx = 0; idx < msa->nseq; idx++) + if (! isgap(msa->aseq[idx][apos])) + break; + if (idx == msa->nseq) useme[apos] = FALSE; else useme[apos] = TRUE; + } + MSAShorterAlignment(msa, useme); + free(useme); + return; +} + +/* Function: MSANogap() + * Date: SRE, Wed Nov 17 09:59:51 1999 [St. Louis] + * + * Purpose: Remove all columns from a multiple sequence alignment that + * contain any gaps -- used for filtering before phylogenetic + * analysis. + * + * Args: msa - the alignment + * + * Returns: (void). The alignment is modified, so if you want to keep + * the original for something, make a copy. + */ +void +MSANogap(MSA *msa) +{ + int *useme; /* array of TRUE/FALSE flags for which columns to keep */ + int apos; /* position in original alignment */ + int idx; /* sequence index */ + + useme = MallocOrDie(sizeof(int) * msa->alen); + for (apos = 0; apos < msa->alen; apos++) + { + for (idx = 0; idx < msa->nseq; idx++) + if (isgap(msa->aseq[idx][apos])) + break; + if (idx == msa->nseq) useme[apos] = TRUE; else useme[apos] = FALSE; + } + MSAShorterAlignment(msa, useme); + free(useme); + return; +} + + +/* Function: MSAShorterAlignment() + * Date: SRE, Wed Nov 17 09:49:32 1999 [St. Louis] + * + * Purpose: Given an array "useme" (0..alen-1) of TRUE/FALSE flags, + * where TRUE means "keep this column in the new alignment": + * Remove all columns annotated as "FALSE" in the useme + * array. + * + * Args: msa - the alignment. The alignment is changed, so + * if you don't want the original screwed up, make + * a copy of it first. + * useme - TRUE/FALSE flags for columns to keep: 0..alen-1 + * + * Returns: (void) + */ +void +MSAShorterAlignment(MSA *msa, int *useme) +{ + int apos; /* position in original alignment */ + int mpos; /* position in new alignment */ + int idx; /* sequence index */ + int i; /* markup index */ + + /* Since we're minimizing, we can overwrite, using already allocated + * memory. + */ + for (apos = 0, mpos = 0; apos < msa->alen; apos++) + { + if (useme[apos] == FALSE) continue; + + /* shift alignment and associated per-column+per-residue markup */ + if (mpos != apos) + { + for (idx = 0; idx < msa->nseq; idx++) + { + msa->aseq[idx][mpos] = msa->aseq[idx][apos]; + if (msa->ss != NULL && msa->ss[idx] != NULL) msa->ss[idx][mpos] = msa->ss[idx][apos]; + if (msa->sa != NULL && msa->sa[idx] != NULL) msa->sa[idx][mpos] = msa->sa[idx][apos]; + + for (i = 0; i < msa->ngr; i++) + if (msa->gr[i][idx] != NULL) msa->gr[i][idx][mpos] = msa->gr[i][idx][apos]; + } + + if (msa->ss_cons != NULL) msa->ss_cons[mpos] = msa->ss_cons[apos]; + if (msa->sa_cons != NULL) msa->sa_cons[mpos] = msa->sa_cons[apos]; + if (msa->rf != NULL) msa->rf[mpos] = msa->rf[apos]; + + for (i = 0; i < msa->ngc; i++) + msa->gc[i][mpos] = msa->gc[i][apos]; + } + mpos++; + } + + msa->alen = mpos; /* set new length */ + /* null terminate everything */ + for (idx = 0; idx < msa->nseq; idx++) + { + msa->aseq[idx][mpos] = '\0'; + if (msa->ss != NULL && msa->ss[idx] != NULL) msa->ss[idx][mpos] = '\0'; + if (msa->sa != NULL && msa->sa[idx] != NULL) msa->sa[idx][mpos] = '\0'; + + for (i = 0; i < msa->ngr; i++) + if (msa->gr[i][idx] != NULL) msa->gr[i][idx][mpos] = '\0'; + } + + if (msa->ss_cons != NULL) msa->ss_cons[mpos] = '\0'; + if (msa->sa_cons != NULL) msa->sa_cons[mpos] = '\0'; + if (msa->rf != NULL) msa->rf[mpos] = '\0'; + + for (i = 0; i < msa->ngc; i++) + msa->gc[i][mpos] = '\0'; + + return; +} + + +/* Function: MSASmallerAlignment() + * Date: SRE, Wed Jun 30 09:56:08 1999 [St. Louis] + * + * Purpose: Given an array "useme" of TRUE/FALSE flags for + * each sequence in an alignment, construct + * and return a new alignment containing only + * those sequences that are flagged useme=TRUE. + * + * Used by routines such as MSAFilterAlignment() + * and MSASampleAlignment(). + * + * Limitations: + * Does not copy unparsed Stockholm markup. + * + * Does not make assumptions about meaning of wgt; + * if you want the new wgt vector renormalized, do + * it yourself with FNorm(new->wgt, new->nseq). + * + * Args: msa -- the original (larger) alignment + * useme -- [0..nseq-1] array of TRUE/FALSE flags; TRUE means include + * this seq in new alignment + * ret_new -- RETURN: new alignment + * + * Returns: void + * ret_new is allocated here; free with MSAFree() + */ +void +MSASmallerAlignment(MSA *msa, int *useme, MSA **ret_new) +{ + MSA *new; /* RETURN: new alignment */ + int nnew; /* number of seqs in new msa (e.g. # of TRUEs) */ + int oidx, nidx; /* old, new indices */ + int i; + + nnew = 0; + for (oidx = 0; oidx < msa->nseq; oidx++) + if (useme[oidx]) nnew++; + if (nnew == 0) { *ret_new = NULL; return; } + + new = MSAAlloc(nnew, 0); + nidx = 0; + for (oidx = 0; oidx < msa->nseq; oidx++) + if (useme[oidx]) + { + new->aseq[nidx] = sre_strdup(msa->aseq[oidx], msa->alen); + new->sqname[nidx] = sre_strdup(msa->sqname[oidx], msa->alen); + GKIStoreKey(new->index, msa->sqname[oidx]); + new->wgt[nidx] = msa->wgt[oidx]; + if (msa->sqacc != NULL) + MSASetSeqAccession(new, nidx, msa->sqacc[oidx]); + if (msa->sqdesc != NULL) + MSASetSeqDescription(new, nidx, msa->sqdesc[oidx]); + if (msa->ss != NULL && msa->ss[oidx] != NULL) + { + if (new->ss == NULL) new->ss = MallocOrDie(sizeof(char *) * new->nseq); + new->ss[nidx] = sre_strdup(msa->ss[oidx], -1); + } + if (msa->sa != NULL && msa->sa[oidx] != NULL) + { + if (new->sa == NULL) new->sa = MallocOrDie(sizeof(char *) * new->nseq); + new->sa[nidx] = sre_strdup(msa->sa[oidx], -1); + } + nidx++; + } + + new->nseq = nnew; + new->alen = msa->alen; + new->flags = msa->flags; + new->type = msa->type; + new->name = sre_strdup(msa->name, -1); + new->desc = sre_strdup(msa->desc, -1); + new->acc = sre_strdup(msa->acc, -1); + new->au = sre_strdup(msa->au, -1); + new->ss_cons = sre_strdup(msa->ss_cons, -1); + new->sa_cons = sre_strdup(msa->sa_cons, -1); + new->rf = sre_strdup(msa->rf, -1); + for (i = 0; i < MSA_MAXCUTOFFS; i++) { + new->cutoff[i] = msa->cutoff[i]; + new->cutoff_is_set[i] = msa->cutoff_is_set[i]; + } + free(new->sqlen); + + MSAMingap(new); + *ret_new = new; + return; +} + + +/***************************************************************** + * Retrieval routines + * + * Access to MSA structure data is possible through these routines. + * I'm not doing this because of object oriented design, though + * it might work in my favor someday. + * I'm doing this because lots of MSA data is optional, and + * checking through the chain of possible NULLs is a pain. + *****************************************************************/ + +char * +MSAGetSeqAccession(MSA *msa, int idx) +{ + if (msa->sqacc != NULL && msa->sqacc[idx] != NULL) + return msa->sqacc[idx]; + else + return NULL; +} +char * +MSAGetSeqDescription(MSA *msa, int idx) +{ + if (msa->sqdesc != NULL && msa->sqdesc[idx] != NULL) + return msa->sqdesc[idx]; + else + return NULL; +} +char * +MSAGetSeqSS(MSA *msa, int idx) +{ + if (msa->ss != NULL && msa->ss[idx] != NULL) + return msa->ss[idx]; + else + return NULL; +} +char * +MSAGetSeqSA(MSA *msa, int idx) +{ + if (msa->sa != NULL && msa->sa[idx] != NULL) + return msa->sa[idx]; + else + return NULL; +} + + +/***************************************************************** + * Information routines + * + * Access information about the MSA. + *****************************************************************/ + +/* Function: MSAAverageSequenceLength() + * Date: SRE, Sat Apr 6 09:41:34 2002 [St. Louis] + * + * Purpose: Return the average length of the (unaligned) sequences + * in the MSA. + * + * Args: msa - the alignment + * + * Returns: average length + */ +float +MSAAverageSequenceLength(MSA *msa) +{ + int i; + float avg; + + avg = 0.; + for (i = 0; i < msa->nseq; i++) + avg += (float) DealignedLength(msa->aseq[i]); + + if (msa->nseq == 0) return 0.; + else return (avg / msa->nseq); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/msa.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,302 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +#ifndef SQUID_MSA_INCLUDED +#define SQUID_MSA_INCLUDED + +/* msa.h + * SRE, Mon May 17 10:24:30 1999 + * + * Header file for SQUID's multiple sequence alignment + * manipulation code. + * + * RCS $Id: msa.h 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: msa.h,v 1.12 2002/10/12 04:40:35 eddy Exp) + */ + +#include <stdio.h> /* FILE support */ +#include "gki.h" /* hash table support */ +#include "ssi.h" /* sequence file index support */ +#include "squid.h" /* need SQINFO */ + +/**************************************************** + * Obsolete alignment information, AINFO + * Superceded by MSA structure further below; but we + * need AINFO for the near future for backwards + * compatibility. + ****************************************************/ +/* Structure: aliinfo_s + * + * Purpose: Optional information returned from an alignment file. + * + * flags: always used. Flags for which info is valid/alloced. + * + * alen: mandatory. Alignments are always flushed right + * with gaps so that all aseqs are the same length, alen. + * Available for all alignment formats. + * + * nseq: mandatory. Aligned seqs are indexed 0..nseq-1. + * + * wgt: 0..nseq-1 vector of sequence weights. Mandatory. + * If not explicitly set, weights are initialized to 1.0. + * + * cs: 0..alen-1, just like the alignment. Contains single-letter + * secondary structure codes for consensus structure; "<>^+" + * for RNA, "EHL." for protein. May be NULL if unavailable + * from seqfile. Only available for SELEX format files. + * + * rf: 0..alen-1, just like the alignment. rf is an arbitrary string + * of characters, used for annotating columns. Blanks are + * interpreted as non-canonical columns and anything else is + * considered canonical. Only available from SELEX files. + * + * sqinfo: mandatory. Array of 0..nseq-1 + * per-sequence information structures, carrying + * name, id, accession, coords. + * + */ +struct aliinfo_s { + int flags; /* flags for what info is valid */ + int alen; /* length of alignment (columns) */ + int nseq; /* number of seqs in alignment */ + float *wgt; /* sequence weights [0..nseq-1] */ + char *cs; /* consensus secondary structure string */ + char *rf; /* reference coordinate system */ + struct seqinfo_s *sqinfo; /* name, id, coord info for each sequence */ + + /* Pfam/HMMER pick-ups */ + char *name; /* name of alignment */ + char *desc; /* description of alignment */ + char *acc; /* accession of alignment */ + char *au; /* "author" information */ + float tc1, tc2; /* trusted score cutoffs (per-seq, per-domain) */ + float nc1, nc2; /* noise score cutoffs (per-seq, per-domain) */ + float ga1, ga2; /* gathering cutoffs */ +}; +typedef struct aliinfo_s AINFO; +#define AINFO_TC (1 << 0) +#define AINFO_NC (1 << 1) +#define AINFO_GA (1 << 2) + +/***************************************************************** + * MSA + * SRE, Sun Jun 27 15:03:35 1999 [TW 723 over Greenland] + * + * Defines the new data structure and API for multiple + * sequence alignment i/o. + *****************************************************************/ + +/* The following constants define the Pfam/Rfam cutoff set we'll propagate + * from msa's into HMMER and Infernal models. + */ +#define MSA_CUTOFF_TC1 0 +#define MSA_CUTOFF_TC2 1 +#define MSA_CUTOFF_GA1 2 +#define MSA_CUTOFF_GA2 3 +#define MSA_CUTOFF_NC1 4 +#define MSA_CUTOFF_NC2 5 +#define MSA_MAXCUTOFFS 6 + +/* Structure: MSA + * SRE, Tue May 18 11:33:08 1999 + * + * Our object for a multiple sequence alignment. + */ +typedef struct msa_struct { + /* Mandatory information associated with the alignment. + */ + char **aseq; /* the alignment itself, [0..nseq-1][0..alen-1] */ + char **sqname; /* names of sequences, [0..nseq-1][0..alen-1] */ + float *wgt; /* sequence weights [0..nseq-1] */ + int alen; /* length of alignment (columns) */ + int nseq; /* number of seqs in alignment */ + + /* Optional information that we understand, and might have. + */ + int flags; /* flags for what optional info is valid */ + int type; /* kOtherSeq, kRNA/hmmNUCLEIC, or kAmino/hmmAMINO */ + char *name; /* name of alignment, or NULL */ + char *desc; /* description of alignment, or NULL */ + char *acc; /* accession of alignment, or NULL */ + char *au; /* "author" information, or NULL */ + char *ss_cons; /* consensus secondary structure string, or NULL */ + char *sa_cons; /* consensus surface accessibility string, or NULL */ + char *rf; /* reference coordinate system, or NULL */ + char **sqacc; /* accession numbers for individual sequences */ + char **sqdesc; /* description lines for individual sequences */ + char **ss; /* per-seq secondary structure annotation, or NULL */ + char **sa; /* per-seq surface accessibility annotation, or NULL */ + float cutoff[MSA_MAXCUTOFFS]; /* NC, TC, GA cutoffs propagated to Pfam/Rfam */ + int cutoff_is_set[MSA_MAXCUTOFFS];/* TRUE if a cutoff is set; else FALSE */ + + /* Optional information that we don't understand. + * That is, we know what type of information it is, but it's + * either (interpreted as) free-text comment, or it's Stockholm + * markup with unfamiliar tags. + */ + char **comment; /* free text comments, or NULL */ + int ncomment; /* number of comment lines */ + int alloc_ncomment; /* number of comment lines alloc'ed */ + + char **gf_tag; /* markup tags for unparsed #=GF lines */ + char **gf; /* annotations for unparsed #=GF lines */ + int ngf; /* number of unparsed #=GF lines */ + int alloc_ngf; /* number of gf lines alloc'ed */ + + char **gs_tag; /* markup tags for unparsed #=GS lines */ + char ***gs; /* [0..ngs-1][0..nseq-1][free text] markup */ + GKI *gs_idx; /* hash of #=GS tag types */ + int ngs; /* number of #=GS tag types */ + + char **gc_tag; /* markup tags for unparsed #=GC lines */ + char **gc; /* [0..ngc-1][0..alen-1] markup */ + GKI *gc_idx; /* hash of #=GC tag types */ + int ngc; /* number of #=GC tag types */ + + char **gr_tag; /* markup tags for unparsed #=GR lines */ + char ***gr; /* [0..ngr][0..nseq-1][0..alen-1] markup */ + GKI *gr_idx; /* hash of #=GR tag types */ + int ngr; /* number of #=GR tag types */ + + /* Stuff we need for our own maintenance of the data structure + */ + GKI *index; /* name ->seqidx hash table */ + int nseqalloc; /* number of seqs currently allocated for */ + int nseqlump; /* lump size for dynamic expansions of nseq */ + int *sqlen; /* individual sequence lengths during parsing */ + int *sslen; /* individual ss lengths during parsing */ + int *salen; /* individual sa lengths during parsing */ + int lastidx; /* last index we saw; use for guessing next */ +} MSA; +#define MSA_SET_WGT (1 << 0) /* track whether wgts were set, or left at default 1.0 */ + + +/* Structure: MSAFILE + * SRE, Tue May 18 11:36:54 1999 + * + * Defines an alignment file that's open for reading. + */ +typedef struct msafile_struct { + FILE *f; /* open file pointer */ + char *fname; /* name of file. used for diagnostic output */ + int linenumber; /* what line are we on in the file */ + + char *buf; /* buffer for line input w/ sre_fgets() */ + int buflen; /* current allocated length for buf */ + + SSIFILE *ssi; /* open SSI index file; or NULL, if none. */ + + int do_gzip; /* TRUE if f is a pipe from gzip -dc (need pclose(f)) */ + int do_stdin; /* TRUE if f is stdin (don't close f, not our problem) */ + int format; /* format of alignment file we're reading */ +} MSAFILE; + + +/* Alignment file formats. + * Must coexist with sqio.c/squid.h unaligned file format codes. + * Rules: + * - 0 is an unknown/unassigned format + * - <100 reserved for unaligned formats + * - >100 reserved for aligned formats + */ +#define MSAFILE_UNKNOWN 0 /* unknown format */ +#define MSAFILE_STOCKHOLM 101 /* Pfam/HMMER's Stockholm format */ +#define MSAFILE_SELEX 102 /* Obsolete(!): old HMMER/SELEX format */ +#define MSAFILE_MSF 103 /* GCG MSF format */ +#define MSAFILE_CLUSTAL 104 /* Clustal V/W format */ +#define MSAFILE_A2M 105 /* aligned FASTA (A2M is UCSC terminology) */ +#define MSAFILE_PHYLIP 106 /* Felsenstein's PHYLIP format */ +#define MSAFILE_EPS 107 /* Encapsulated PostScript (output only) */ +#ifdef CLUSTALO +#define MSAFILE_VIENNA 108 /* Vienna: concatenated fasta */ +#endif + +#define IsAlignmentFormat(fmt) ((fmt) > 100) + + +/* from msa.c + */ +extern MSAFILE *MSAFileOpen(char *filename, int format, char *env); +extern MSA *MSAFileRead(MSAFILE *afp); +extern void MSAFileClose(MSAFILE *afp); +extern void MSAFree(MSA *msa); +extern void MSAFileWrite(FILE *fp, MSA *msa, int outfmt, int do_oneline); + +extern int MSAFileRewind(MSAFILE *afp); +extern int MSAFilePositionByKey(MSAFILE *afp, char *key); +extern int MSAFilePositionByIndex(MSAFILE *afp, int idx); + +extern int MSAFileFormat(MSAFILE *afp); +extern MSA *MSAAlloc(int nseq, int alen); +extern void MSAExpand(MSA *msa); +extern char *MSAFileGetLine(MSAFILE *afp); +extern void MSASetSeqAccession(MSA *msa, int seqidx, char *acc); +extern void MSASetSeqDescription(MSA *msa, int seqidx, char *desc); +extern void MSAAddComment(MSA *msa, char *s); +extern void MSAAddGF(MSA *msa, char *tag, char *value); +extern void MSAAddGS(MSA *msa, char *tag, int seqidx, char *value); +extern void MSAAppendGC(MSA *msa, char *tag, char *value); +extern char *MSAGetGC(MSA *msa, char *tag); +extern void MSAAppendGR(MSA *msa, char *tag, int seqidx, char *value); +extern void MSAVerifyParse(MSA *msa); +extern int MSAGetSeqidx(MSA *msa, char *name, int guess); + +extern MSA *MSAFromAINFO(char **aseq, AINFO *ainfo); + +extern void MSAMingap(MSA *msa); +extern void MSANogap(MSA *msa); +extern void MSAShorterAlignment(MSA *msa, int *useme); +extern void MSASmallerAlignment(MSA *msa, int *useme, MSA **ret_new); + +extern char *MSAGetSeqAccession(MSA *msa, int idx); +extern char *MSAGetSeqDescription(MSA *msa, int idx); +extern char *MSAGetSeqSS(MSA *msa, int idx); +extern char *MSAGetSeqSA(MSA *msa, int idx); + +extern float MSAAverageSequenceLength(MSA *msa); + +/* from a2m.c + */ +extern MSA *ReadA2M(MSAFILE *afp); +#ifdef CLUSTALO +extern void WriteA2M(FILE *fp, MSA *msa, int vienna); +#else +extern void WriteA2M(FILE *fp, MSA *msa); +#endif +/* from clustal.c + */ +extern MSA *ReadClustal(MSAFILE *afp); +extern void WriteClustal(FILE *fp, MSA *msa); + +/* from eps.c + */ +extern void EPSWriteSmallMSA(FILE *fp, MSA *msa); + +/* from msf.c + */ +extern MSA *ReadMSF(MSAFILE *afp); +extern void WriteMSF(FILE *fp, MSA *msa); + +/* from phylip.c + */ +extern MSA *ReadPhylip(MSAFILE *afp); +extern void WritePhylip(FILE *fp, MSA *msa); + +/* from selex.c + */ +extern MSA *ReadSELEX(MSAFILE *afp); +extern void WriteSELEX(FILE *fp, MSA *msa); +extern void WriteSELEXOneBlock(FILE *fp, MSA *msa); + +/* from stockholm.c + */ +extern MSA *ReadStockholm(MSAFILE *afp); +extern void WriteStockholm(FILE *fp, MSA *msa); +extern void WriteStockholmOneBlock(FILE *fp, MSA *msa); + +#endif /*SQUID_MSA_INCLUDED*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/msf.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,388 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* msf.c + * SRE, Sun Jul 11 16:17:32 1993 + * + * Import/export of GCG MSF multiple sequence alignment + * formatted files. Designed using format specifications + * kindly provided by Steve Smith of Genetics Computer Group. + * + * RCS $Id: msf.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: msf.c,v 1.4 2001/04/23 00:35:33 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <time.h> +#include "squid.h" +#include "msa.h" + +#ifdef TESTDRIVE_MSF +/***************************************************************** + * msf.c test driver: + * cc -DTESTDRIVE_MSF -g -O2 -Wall -o test msf.c msa.c gki.c sqerror.c sre_string.c file.c hsregex.c sre_math.c sre_ctype.c sqio.c alignio.c selex.c interleaved.c types.c -lm + * + */ +int +main(int argc, char **argv) +{ + MSAFILE *afp; + MSA *msa; + char *file; + + file = argv[1]; + + if ((afp = MSAFileOpen(file, MSAFILE_STOCKHOLM, NULL)) == NULL) + Die("Couldn't open %s\n", file); + + while ((msa = ReadMSF(afp)) != NULL) + { + WriteMSF(stdout, msa); + MSAFree(msa); + } + + MSAFileClose(afp); + exit(0); +} +/******************************************************************/ +#endif /* testdrive_msf */ + + + +/* Function: ReadMSF() + * Date: SRE, Tue Jun 1 08:07:22 1999 [St. Louis] + * + * Purpose: Parse an alignment read from an open MSF format + * alignment file. (MSF is a single-alignment format.) + * Return the alignment, or NULL if we've already + * read the alignment. + * + * Args: afp - open alignment file + * + * Returns: MSA * - an alignment object + * caller responsible for an MSAFree() + * NULL if no more alignments + * + * Diagnostics: + * Will Die() here with a (potentially) useful message + * if a parsing error occurs. + */ +MSA * +ReadMSF(MSAFILE *afp) +{ + MSA *msa; + char *s; + int alleged_alen; + int alleged_type; + int alleged_checksum; + char *tok; + char *sp; + int slen; + int sqidx; + char *name; + char *seq; + + if (feof(afp->f)) return NULL; + if ((s = MSAFileGetLine(afp)) == NULL) return NULL; + + /* The first line is the header. + * This is a new-ish GCG feature. Don't count on it, so + * we can be a bit more tolerant towards non-GCG software + * generating "MSF" files. + */ + msa = MSAAlloc(10, 0); + if (strncmp(s, "!!AA_MULTIPLE_ALIGNMENT", 23) == 0) { + msa->type = kAmino; + if ((s = MSAFileGetLine(afp)) == NULL) return NULL; + } else if (strncmp(s, "!!NA_MULTIPLE_ALIGNMENT", 23) == 0) { + msa->type = kRNA; + if ((s = MSAFileGetLine(afp)) == NULL) return NULL; + } + + /* Now we're in the free text comment section of the MSF file. + * It ends when we see the "MSF: Type: Check: .." line. + * This line must be present. + */ + do + { + if ((strstr(s, "..") != NULL && strstr(s, "MSF:") != NULL) && + Strparse("^.+MSF: +([0-9]+) +Type: +([PNX]).+Check: +([0-9]+) +\\.\\.", s, 3)) + { + alleged_alen = atoi(sqd_parse[0]); + switch (*(sqd_parse[1])) { + case 'N' : alleged_type = kRNA; break; + case 'P' : alleged_type = kAmino; break; + case 'X' : alleged_type = kOtherSeq; break; + default : alleged_type = kOtherSeq; + } + alleged_checksum = atoi(sqd_parse[3]); + if (msa->type == kOtherSeq) msa->type = alleged_type; + break; /* we're done with comment section. */ + } + if (! IsBlankline(s)) + MSAAddComment(msa, s); + } while ((s = MSAFileGetLine(afp)) != NULL); + + /* Now we're in the name section. + * GCG has a relatively poorly documented feature: only sequences that + * appear in this list will be read from the alignment section. Commenting + * out sequences in the name list (by preceding them with "!") is + * allowed as a means of manually defining subsets of sequences in + * the alignment section. We can support this feature reasonably + * easily because of the hash table for names in the MSA: we + * only add names to the hash table when we see 'em in the name section. + */ + while ((s = MSAFileGetLine(afp)) != NULL) + { + while ((*s == ' ' || *s == '\t') && *s) s++; /* skip leading whitespace */ + + if (*s == '\n') continue; /* skip blank lines */ + else if (*s == '!') MSAAddComment(msa, s); + else if ((sp = strstr(s, "Name:")) != NULL) + { + /* We take the name and the weigh, and that's it */ + sp += 5; + tok = sre_strtok(&sp, " \t", &slen); /* <sequence name> */ + sqidx = GKIStoreKey(msa->index, tok); + if (sqidx >= msa->nseqalloc) MSAExpand(msa); + msa->sqname[sqidx] = sre_strdup(tok, slen); + msa->nseq++; + + if ((sp = strstr(sp, "Weight:")) == NULL) + Die("No Weight: on line %d for %s in name section of MSF file %s\n", + afp->linenumber, msa->sqname[sqidx], afp->fname); + sp += 7; + tok = sre_strtok(&sp, " \t", &slen); + msa->wgt[sqidx] = atof(tok); + msa->flags |= MSA_SET_WGT; + } + else if (strncmp(s, "//", 2) == 0) + break; + else + { + Die("Invalid line (probably %d) in name section of MSF file %s:\n%s\n", + afp->linenumber, afp->fname, s); + squid_errno = SQERR_FORMAT; /* NOT THREADSAFE */ + return NULL; + } + + } + + /* And now we're in the sequence section. + * As discussed above, if we haven't seen a sequence name, then we + * don't include the sequence in the alignment. + * Also, watch out for coordinate-only lines. + */ + while ((s = MSAFileGetLine(afp)) != NULL) + { + sp = s; + if ((name = sre_strtok(&sp, " \t", NULL)) == NULL) continue; + if ((seq = sre_strtok(&sp, "\n", &slen)) == NULL) continue; + + /* The test for a coord line: digits starting both fields + */ + if (isdigit(*name) && isdigit(*seq)) + continue; + + /* It's not blank, and it's not a coord line: must be sequence + */ + sqidx = GKIKeyIndex(msa->index, name); + if (sqidx < 0) continue; /* not a sequence we recognize */ + + msa->sqlen[sqidx] = sre_strcat(&(msa->aseq[sqidx]), msa->sqlen[sqidx], seq, slen); + } + + /* We've left blanks in the aseqs; take them back out. + */ + for (sqidx = 0; sqidx < msa->nseq; sqidx++) + { + if (msa->aseq[sqidx] == NULL) + Die("Didn't find a sequence for %s in MSF file %s\n", msa->sqname[sqidx], afp->fname); + + for (s = sp = msa->aseq[sqidx]; *s != '\0'; s++) + { + if (*s == ' ' || *s == '\t') { + msa->sqlen[sqidx]--; + } else { + *sp = *s; + sp++; + } + } + *sp = '\0'; + } + + MSAVerifyParse(msa); /* verifies, and also sets alen and wgt. */ + return msa; +} + + +/* Function: WriteMSF() + * Date: SRE, Mon May 31 11:25:18 1999 [St. Louis] + * + * Purpose: Write an alignment in MSF format to an open file. + * + * Args: fp - file that's open for writing. + * msa - alignment to write. + * + * Note that msa->type, usually optional, must be + * set for WriteMSF to work. If it isn't, a fatal + * error is generated. + * + * Returns: (void) + */ +void +WriteMSF(FILE *fp, MSA *msa) +{ + time_t now; /* current time as a time_t */ + char date[64]; /* today's date in GCG's format "October 3, 1996 15:57" */ + char **gcg_aseq; /* aligned sequences with gaps converted to GCG format */ + char **gcg_sqname; /* sequence names with GCG-valid character sets */ + int idx; /* counter for sequences */ + char *s; /* pointer into sqname or seq */ + int len; /* tmp variable for name lengths */ + int namelen; /* maximum name length used */ + int pos; /* position counter */ + char buffer[51]; /* buffer for writing seq */ + int i; /* another position counter */ + + /***************************************************************** + * Make copies of sequence names and sequences. + * GCG recommends that name characters should only contain + * alphanumeric characters, -, or _ + * Some GCG and GCG-compatible software is sensitive to this. + * We silently convert all other characters to '_'. + * + * For sequences, GCG allows only ~ and . for gaps. + * Otherwise, everthing is interpreted as a residue; + * so squid's IUPAC-restricted chars are fine. ~ means + * an external gap. . means an internal gap. + *****************************************************************/ + + /* make copies that we can edit */ + gcg_aseq = MallocOrDie(sizeof(char *) * msa->nseq); + gcg_sqname = MallocOrDie(sizeof(char *) * msa->nseq); + for (idx = 0; idx < msa->nseq; idx++) + { + gcg_aseq[idx] = sre_strdup(msa->aseq[idx], msa->alen); + gcg_sqname[idx] = sre_strdup(msa->sqname[idx], -1); + } + /* alter names as needed */ + for (idx = 0; idx < msa->nseq; idx++) + for (s = gcg_sqname[idx]; *s != '\0'; s++) + if (! isalnum((int) *s) && *s != '-' && *s != '_') + *s = '_'; + /* alter gap chars in seq */ + for (idx = 0; idx < msa->nseq; idx++) + { + for (s = gcg_aseq[idx]; *s != '\0' && isgap(*s); s++) + *s = '~'; + for (; *s != '\0'; s++) + if (isgap(*s)) *s = '.'; + for (pos = msa->alen-1; pos > 0 && isgap(gcg_aseq[idx][pos]); pos--) + gcg_aseq[idx][pos] = '~'; + } + /* calculate max namelen used */ + namelen = 0; + for (idx = 0; idx < msa->nseq; idx++) + if ((len = strlen(msa->sqname[idx])) > namelen) + namelen = len; + + /***************************************************** + * Write the MSF header + *****************************************************/ + /* required file type line */ + if (msa->type == kOtherSeq) + msa->type = GuessAlignmentSeqtype(msa->aseq, msa->nseq); + + if (msa->type == kRNA) fprintf(fp, "!!NA_MULTIPLE_ALIGNMENT 1.0\n"); + else if (msa->type == kDNA) fprintf(fp, "!!NA_MULTIPLE_ALIGNMENT 1.0\n"); + else if (msa->type == kAmino) fprintf(fp, "!!AA_MULTIPLE_ALIGNMENT 1.0\n"); + else if (msa->type == kOtherSeq) + Die("WriteMSF(): couldn't guess whether that alignment is RNA or protein.\n"); + else + Die("Invalid sequence type %d in WriteMSF()\n", msa->type); + + /* free text comments */ + if (msa->ncomment > 0) + { + for (idx = 0; idx < msa->ncomment; idx++) + fprintf(fp, "%s\n", msa->comment[idx]); + fprintf(fp, "\n"); + } + /* required checksum line */ + now = time(NULL); + if (strftime(date, 64, "%B %d, %Y %H:%M", localtime(&now)) == 0) + Die("What time is it on earth? strftime() failed in WriteMSF().\n"); + fprintf(fp, " %s MSF: %d Type: %c %s Check: %d ..\n", + msa->name != NULL ? msa->name : "squid.msf", + msa->alen, + msa->type == kRNA ? 'N' : 'P', + date, + GCGMultchecksum(gcg_aseq, msa->nseq)); + fprintf(fp, "\n"); + + /***************************************************** + * Names/weights section + *****************************************************/ + + for (idx = 0; idx < msa->nseq; idx++) + { + fprintf(fp, " Name: %-*.*s Len: %5d Check: %4d Weight: %.2f\n", + namelen, namelen, + gcg_sqname[idx], + msa->alen, + GCGchecksum(gcg_aseq[idx], msa->alen), + msa->wgt[idx]); + } + fprintf(fp, "\n"); + fprintf(fp, "//\n"); + + /***************************************************** + * Write the sequences + *****************************************************/ + + for (pos = 0; pos < msa->alen; pos += 50) + { + fprintf(fp, "\n"); /* Blank line between sequence blocks */ + + /* Coordinate line */ + len = (pos + 50) > msa->alen ? msa->alen - pos : 50; + if (len > 10) + fprintf(fp, "%*s %-6d%*s%6d\n", namelen, "", + pos+1, + len + ((len-1)/10) - 12, "", + pos + len); + else + fprintf(fp, "%*s %-6d\n", namelen, "", pos+1); + + for (idx = 0; idx < msa->nseq; idx++) + { + fprintf(fp, "%-*s ", namelen, gcg_sqname[idx]); + /* get next line's worth of 50 from seq */ + strncpy(buffer, gcg_aseq[idx] + pos, 50); + buffer[50] = '\0'; + /* draw the sequence line */ + for (i = 0; i < len; i++) + { + if (! (i % 10)) fputc(' ', fp); + fputc(buffer[i], fp); + } + fputc('\n', fp); + } + } + + Free2DArray((void **) gcg_aseq, msa->nseq); + Free2DArray((void **) gcg_sqname, msa->nseq); + return; +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/phylip.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,173 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* phylip.c + * SRE, Mon Jun 14 14:08:33 1999 [St. Louis] + * + * Import/export of PHYLIP interleaved multiple sequence alignment + * format files. + * + * RCS $Id: phylip.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: phylip.c,v 1.1 1999/07/15 22:29:20 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" +#include "msa.h" + +#ifdef TESTDRIVE_PHYLIP +/***************************************************************** + * phylip.c test driver: + * + */ +int +main(int argc, char **argv) +{ + MSAFILE *afp; + MSA *msa; + char *file; + + file = argv[1]; + + if ((afp = MSAFileOpen(file, MSAFILE_UNKNOWN, NULL)) == NULL) + Die("Couldn't open %s\n", file); + + printf("format %d\n", afp->format); + + while ((msa = ReadPhylip(afp)) != NULL) + { + WritePhylip(stdout, msa); + MSAFree(msa); + } + + MSAFileClose(afp); + exit(0); +} +/******************************************************************/ +#endif /* testdrive_phylip */ + + + +/* Function: ReadPhylip() + * Date: SRE, Fri Jun 18 12:59:37 1999 [Sanger Centre] + * + * Purpose: Parse an alignment from an open Phylip format + * alignment file. Phylip is a single-alignment format. + * Return the alignment, or NULL if we have no data. + * + * Args: afp - open alignment file + * + * Returns: MSA * - an alignment object + * Caller responsible for an MSAFree() + * NULL if no more alignments + */ +MSA * +ReadPhylip(MSAFILE *afp) +{ + MSA *msa; + char *s, *s1, *s2; + char name[11]; /* seq name max len = 10 char */ + int nseq, alen; + int idx; /* index of current sequence */ + int slen; + int nblock; + + if (feof(afp->f)) return NULL; + + /* Skip until we see a nonblank line; it's the header, + * containing nseq/alen + */ + nseq = 0; alen = 0; + while ((s = MSAFileGetLine(afp)) != NULL) + { + if ((s1 = sre_strtok(&s, WHITESPACE, NULL)) == NULL) continue; + if ((s2 = sre_strtok(&s, WHITESPACE, NULL)) == NULL) + Die("Failed to parse nseq/alen from first line of PHYLIP file %s\n", afp->fname); + if (! IsInt(s1) || ! IsInt(s2)) + Die("nseq and/or alen not an integer in first line of PHYLIP file %s\n", afp->fname); + nseq = atoi(s1); + alen = atoi(s2); + break; + } + + msa = MSAAlloc(nseq, 0); + idx = 0; + nblock = 0; + while ((s = MSAFileGetLine(afp)) != NULL) + { + /* ignore blank lines. nonblank lines start w/ nonblank char */ + if (isspace(*s)) continue; + /* First block has seq names */ + if (nblock == 0) { + strncpy(name, s, 10); + name[10] = '\0'; + GKIStoreKey(msa->index, name); + msa->sqname[idx] = sre_strdup(name, -1); + s += 10; + } + /* be careful of trailing whitespace on lines */ + if ((s1 = sre_strtok(&s, WHITESPACE, &slen)) == NULL) + Die("Failed to parse sequence at line %d of PHYLIP file %s\n", + afp->linenumber, afp->fname); + msa->sqlen[idx] = sre_strcat(&(msa->aseq[idx]), msa->sqlen[idx], s1, slen); + + idx++; + if (idx == nseq) { idx = 0; nblock++; } + } + msa->nseq = nseq; + MSAVerifyParse(msa); /* verifies; sets alen, wgt; frees sqlen[] */ + return msa; +} + + + +/* Function: WritePhylip() + * Date: SRE, Fri Jun 18 12:07:41 1999 [Sanger Centre] + * + * Purpose: Write an alignment in Phylip format to an open file. + * + * Args: fp - file that's open for writing. + * msa - alignment to write. + * + * Returns: (void) + */ +void +WritePhylip(FILE *fp, MSA *msa) +{ + int idx; /* counter for sequences */ + int cpl = 50; /* 50 seq char per line */ + char buf[51]; /* buffer for writing seq */ + int pos; + + /* First line has nseq, alen + */ + fprintf(fp, " %d %d\n", msa->nseq, msa->alen); + + /* Alignment section. + * PHYLIP is a multiblock format, blocks (optionally) separated + * by blanks; names only attached to first block. Names are + * restricted to ten char; we achieve this by simple truncation (!). + * (Do we need to convert gap characters from our ./- convention?) + */ + for (pos = 0; pos < msa->alen; pos += cpl) + { + if (pos > 0) fprintf(fp, "\n"); + + for (idx = 0; idx < msa->nseq; idx++) + { + strncpy(buf, msa->aseq[idx] + pos, cpl); + buf[cpl] = '\0'; + if (pos > 0) fprintf(fp, "%s\n", buf); + else fprintf(fp, "%-10.10s%s\n", msa->sqname[idx], buf); + } + } + return; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/revcomp.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,87 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* revcomp.c + * + * Reverse complement of a IUPAC character string + * RCS $Id: revcomp.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: revcomp.c,v 1.5 2002/06/25 20:06:06 eddy Exp) + */ + +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" + +/* Function: revcomp() + * + * Purpose: Reverse complement seq; store in comp. + * Can revcomp "in place" (revcomp(seq, seq)). + * + * Args: comp - destination for reverse complement of seq + * seq - sequence to reverse complement + * + * Returns: NULL on failure; or a (useless) pointer to comp. + */ +char * +revcomp(char *comp, char *seq) +{ + char *s; + char c; + + if (comp == NULL) return NULL; + if (seq == NULL) return NULL; + + StrReverse(comp, seq); + for (s = comp; *s != '\0'; s++) + { + c = *s; + c = sre_toupper(c); + switch (c) { + case 'A': c = 'T'; break; + case 'C': c = 'G'; break; + case 'G': c = 'C'; break; + case 'T': c = 'A'; break; + case 'U': c = 'A'; break; + case 'R': c = 'Y'; break; + case 'Y': c = 'R'; break; + case 'M': c = 'K'; break; + case 'K': c = 'M'; break; + case 'S': c = 'S'; break; + case 'W': c = 'W'; break; + case 'H': c = 'D'; break; + case 'D': c = 'H'; break; + case 'B': c = 'V'; break; + case 'V': c = 'B'; break; + default: break; /* anything else? leave it; it's prob a gap or an X */ + } + if (islower((int) *s)) c = (char) sre_tolower((int) c); + *s = c; + } + return comp; +} + +#ifdef REVCOMP_TESTDRIVER +/* gcc -g -DREVCOMP_TESTDRIVER revcomp.c sre_string.c shuffle.c sre_math.c sre_ctype.c sqerror.c -lm +*/ +int +main(void) +{ + float p[4] = {0.25, 0.25, 0.25, 0.25}; + char *alphabet = "ACGT"; + int len = 10; + char *seq; + + seq = RandomSequence(alphabet, p, 4, len); + printf("%s\n", seq); + revcomp(seq, seq); + printf("%s\n", seq); + free(seq); + exit(0); +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/rk.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,133 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* rk.c (originally from rnabob's patsearch.c) + * + * Contains a compiler and a search engine for Rabin-Karp + * based primary sequence pattern searching on encoded + * sequences. + * + * See Sedgewick, _Algorithms_, for a general discussion of + * the Rabin-Karp algorithm. See the rkcomp or rkexec man + * pages for specific details. + * + * RCS $Id: rk.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: rk.c,v 1.2 1998/10/09 18:07:16 eddy Exp) + */ + +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" /* seq encoding utilities and typedefs */ +#include "rk.h" + + +#ifdef MEMDEBUG +#include "dbmalloc.h" +#endif + +Hashseq +rkcomp(char *probe) /* A,C,G,T/U, N probe string, 0-8 nt long */ +{ + Hashseq hashprobe = 0; + char coded[RK_HASHSIZE + 1]; + int len; + int i; + /* check bounds violation on probe */ + if ((len = strlen(probe)) > RK_HASHSIZE) return 0; + /* encode the probe */ + if (seqencode(coded, probe) == 0) return 0; + /* pack the probe into a Hashseq */ + for (i = 0; i < len; i++) + { + hashprobe <<= 4; + hashprobe |= (Hashseq) coded[i]; + } + /* left adjust as needed */ + for (; i < RK_HASHSIZE; i++) + { + hashprobe <<= 4; + hashprobe |= (Hashseq) NTN; + } + /* return the compiled probe */ + return hashprobe; +} + +int +rkseq(Hashseq hashprobe, /* up to 8 nt packed into the probe */ + char *sequence) /* encoded sequence */ +{ + long i; + long pos = 0; + Hashseq target = 0; + + /* initialize the target hashseq */ + for (i = 0; i < RK_HASHSIZE; i++) + { + if (*(sequence + i) == NTEND) + break; + target <<= 4; + target |= (Hashseq) (*(sequence + i)); + } + + while (*(sequence + pos + RK_HASHSIZE -1) != NTEND) + { +#ifdef DEBUG + printf("hashprobe: "); + writehash(hashprobe); + printf("\ttarget: "); + writehash(target); + printf("\nhashprobe & target: "); + writehash(hashprobe & target); + printf("\n"); +#endif + if ((hashprobe & target) == target) + return ((int) pos); + target <<= 4; + target |= (Hashseq) (*(sequence + pos + RK_HASHSIZE)); + pos++; + } + /* now we deal with an end effect */ + for (i = 0; i < RK_HASHSIZE; i++) + { + target |= (Hashseq) NTN; + if ((hashprobe & target) == target) + return ((int) pos); + target <<=4; + pos++; + } + + return(-1); +} + + +#ifdef DEBUG /* Debugging aids */ + +static void +writehash(Hashseq hashseq) +{ + int idx; + int sym; + + if (hashseq/16) + writehash(hashseq/16); + + sym = (int) (hashseq % 16); + if (sym == 0) + putchar('-'); + else + { + for (idx = 0; sym != iupac[idx].code && idx < IUPACSYMNUM; idx++); + if (idx > IUPACSYMNUM) + printf("(%d)", sym); + else + putchar(iupac[idx].sym); + } +} + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/rk.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,39 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +#ifndef SQRKH_INCLUDED +#define SQRKH_INCLUDED + +/* rk.h + * + * Header file for Rabin-Karp pattern searching on encoded + * sequence strings. + * + * Sean Eddy, Thu Oct 1 11:45:42 1992 + * RCS $Id: rk.h 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: rk.h,v 1.2 1998/10/09 18:07:16 eddy Exp) + */ + + + /* expect 32 bits for 8 nt */ +typedef unsigned long Hashseq; + /* but we count to be sure... + RK_HASHSIZE is the number of nt that fit + in one probe */ +#define RK_HASHSIZE (sizeof(Hashseq)*2) + /* empirically, how many nt minimum we require + in a pattern before we abandon rk and + go with something else */ +#define RK_REQUIRE 4 + +extern int rkseq(Hashseq hashprobe, char *sequence); +extern Hashseq rkcomp(char *probe); /* compile a Hashseq from a pattern */ + + + +#endif /* SQRKH_INCLUDED */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/selex.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,833 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* selex.c + * + * SRE, Mon Jun 14 11:08:38 1999 + * SELEX obsolete as the preferred HMMER/SQUID format + * replaced by Stockholm format + * selex support retained for backwards compatibility + * kludged to use the MSA interface + * + * SRE, Mon Jan 30 14:41:49 1995: + * #=SA side chain % surface accessibility annotation supported + * + * SRE, Tue Nov 9 17:40:50 1993: + * major revision. #= special comments and aliinfo_s optional + * alignment info support added. Support for #=CS (consensus + * secondary structure), #=SS (individual secondary structure), + * #=RF (reference coordinate system), #=SQ (per-sequence header info), + * and #=AU ("author") added. + * + * Fri Dec 4 17:43:24 1992, SRE: + * Reading and writing aligned sequences to/from disk files. + * Implements a new, broader specification of SELEX format + * and supercedes alignio.c. + * + * SELEX format is documented in Docs/formats.tex. + **************************************************************************** + * RCS $Id: selex.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: selex.c,v 1.11 2002/10/12 04:40:35 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <memory.h> +#include "squid.h" +#include "msa.h" + +static int copy_alignment_line(char *aseq, int apos, int name_rcol, + char *buffer, int lcol, int rcol, char gapsym); +static void actually_write_selex(FILE *fp, MSA *msa, int cpl); + +static char commentsyms[] = "%#"; + +/* Function: ReadSELEX() + * Date: SRE, Sun Jun 6 18:24:09 1999 [St. Louis] + * + * Purpose: Parse an alignment read from an open SELEX format + * alignment file. (SELEX is a single alignment format). + * Return the alignment, or NULL if we've already read the + * alignment or there's no alignment data in the file. + * + * Limitations: SELEX is the only remaining multipass parser for + * alignment files. It cannot read from gzip or from stdin. + * It Die()'s here if you try. The reason for this + * that SELEX allows space characters as gaps, so we don't + * know the borders of an alignment block until we've seen + * the whole block. I could rewrite to allow single-pass + * parsing (by storing the whole block in memory) but + * since SELEX is now legacy, why bother. + * + * Note that the interface is totally kludged: fastest + * possible adaptation of old ReadSELEX() to the new + * MSA interface. + * + * Args: afp - open alignment file + * + * Returns: MSA * - an alignment object + * caller responsible for an MSAFree() + * NULL if no alignment data. + */ +MSA * +ReadSELEX(MSAFILE *afp) +{ + MSA *msa; /* RETURN: mult seq alignment */ + FILE *fp; /* ptr to opened seqfile */ + char **aseqs; /* aligned seqs */ + int num = 0; /* number of seqs read */ + char buffer[LINEBUFLEN]; /* input buffer for lines */ + char bufcpy[LINEBUFLEN]; /* strtok'able copy of buffer */ + struct block_struc { /** alignment data for a block: */ + int lcol; /* furthest left aligned sym */ + int rcol; /* furthest right aligned sym */ + } *blocks = NULL; + int blocknum; /* number of blocks in file */ + char *nptr; /* ptr to start of name on line */ + char *sptr; /* ptr into sequence on line */ + int currnum; /* num. seqs in given block */ + int currblock; /* index for blocks */ + int i; /* loop counter */ + int seqidx; /* counter for seqs */ + int alen; /* length of alignment */ + int warn_names; /* becomes TRUE if names don't match between blocks */ + int headnum; /* seqidx in per-sequence header info */ + int currlen; + int count; + int have_cs = 0; + int have_rf = 0; + AINFO base_ainfo, *ainfo; /* hack: used to be passed ptr to AINFO */ + + + /* Convert from MSA interface to what old ReadSELEX() did: + * - copy our open fp, rather than opening file + * - verify that we're not reading a gzip or stdin + */ + if (feof(afp->f)) return NULL; + if (afp->do_gzip || afp->do_stdin) + Die("Can't read a SELEX format alignment from a pipe, stdin, or gzip'ed file"); + fp = afp->f; + ainfo = &base_ainfo; + + /*************************************************** + * First pass across file. + * Count seqs, get names, determine column info + * Determine what sorts of info are active in this file. + ***************************************************/ + + InitAinfo(ainfo); + /* get first line of the block + * (non-comment, non-blank) */ + do + { + if (fgets(buffer, LINEBUFLEN, fp) == NULL) + { squid_errno = SQERR_NODATA; return 0; } + strcpy(bufcpy, buffer); + if (*buffer == '#') + { + if (strncmp(buffer, "#=CS", 4) == 0) have_cs = 1; + else if (strncmp(buffer, "#=RF", 4) == 0) have_rf = 1; + } + } + while ((nptr = strtok(bufcpy, WHITESPACE)) == NULL || + (strchr(commentsyms, *nptr) != NULL)); + + blocknum = 0; + warn_names = FALSE; + while (!feof(fp)) + { + /* allocate for info about this block. */ + if (blocknum == 0) + blocks = (struct block_struc *) MallocOrDie (sizeof(struct block_struc)); + else + blocks = (struct block_struc *) ReallocOrDie (blocks, (blocknum+1) * sizeof(struct block_struc)); + blocks[blocknum].lcol = LINEBUFLEN+1; + blocks[blocknum].rcol = -1; + + currnum = 0; + while (nptr != NULL) /* becomes NULL when this block ends. */ + { + /* First block only: save names */ + if (blocknum == 0) + { + if (currnum == 0) + ainfo->sqinfo = (SQINFO *) MallocOrDie (sizeof(SQINFO)); + else + ainfo->sqinfo = (SQINFO *) ReallocOrDie (ainfo->sqinfo, (currnum + 1) * sizeof(SQINFO)); + + ainfo->sqinfo[currnum].flags = 0; + SetSeqinfoString(&(ainfo->sqinfo[currnum]), nptr, SQINFO_NAME); + } + else /* in each additional block: check names */ + { + if (strcmp(ainfo->sqinfo[currnum].name, nptr) != 0) + warn_names = TRUE; + } + currnum++; + + /* check rcol, lcol */ + if ((sptr = strtok(NULL, WHITESPACE)) != NULL) + { + /* is this the furthest left we've + seen word 2 in this block? */ + if (sptr - bufcpy < blocks[blocknum].lcol) + blocks[blocknum].lcol = sptr - bufcpy; + /* look for right side in buffer */ + for (sptr = buffer + strlen(buffer) - 1; + strchr(WHITESPACE, *sptr) != NULL; + sptr --) + /* do nothing */ ; + if (sptr - buffer > blocks[blocknum].rcol) + blocks[blocknum].rcol = sptr - buffer; + } + + /* get the next line; blank line means end of block */ + do + { + if (fgets(buffer, LINEBUFLEN, fp) == NULL) + { nptr = NULL; break; } + strcpy(bufcpy, buffer); + + if (strncmp(buffer, "#=SS", 4) == 0) ainfo->sqinfo[currnum-1].flags |= SQINFO_SS; + else if (strncmp(buffer, "#=SA", 4) == 0) ainfo->sqinfo[currnum-1].flags |= SQINFO_SA; + else if (strncmp(buffer, "#=CS", 4) == 0) have_cs = 1; + else if (strncmp(buffer, "#=RF", 4) == 0) have_rf = 1; + + if ((nptr = strtok(bufcpy, WHITESPACE)) == NULL) + break; + } while (strchr(commentsyms, *nptr) != NULL); + } + + + /* check that number of sequences matches expected */ + if (blocknum == 0) + num = currnum; + else if (currnum != num) + Die("Parse error in ReadSELEX()"); + blocknum++; + + /* get first line of next block + * (non-comment, non-blank) */ + do + { + if (fgets(buffer, LINEBUFLEN, fp) == NULL) { nptr = NULL; break; } + strcpy(bufcpy, buffer); + } + while ((nptr = strtok(bufcpy, WHITESPACE)) == NULL || + (strchr(commentsyms, *nptr) != NULL)); + } + + + /*************************************************** + * Get ready for second pass: + * figure out the length of the alignment + * malloc space + * rewind the file + ***************************************************/ + + alen = 0; + for (currblock = 0; currblock < blocknum; currblock++) + alen += blocks[currblock].rcol - blocks[currblock].lcol + 1; + + rewind(fp); + + /* allocations. we can't use AllocateAlignment because of + * the way we already used ainfo->sqinfo. + */ + aseqs = (char **) MallocOrDie (num * sizeof(char *)); + if (have_cs) + ainfo->cs = (char *) MallocOrDie ((alen+1) * sizeof(char)); + if (have_rf) + ainfo->rf = (char *) MallocOrDie ((alen+1) * sizeof(char)); + + + + for (i = 0; i < num; i++) + { + aseqs[i] = (char *) MallocOrDie ((alen+1) * sizeof(char)); + if (ainfo->sqinfo[i].flags & SQINFO_SS) + ainfo->sqinfo[i].ss = (char *) MallocOrDie ((alen+1) * sizeof(char)); + if (ainfo->sqinfo[i].flags & SQINFO_SA) + ainfo->sqinfo[i].sa = (char *) MallocOrDie ((alen+1) * sizeof(char)); + } + + ainfo->alen = alen; + ainfo->nseq = num; + ainfo->wgt = (float *) MallocOrDie (sizeof(float) * num); + FSet(ainfo->wgt, num, 1.0); + + /*************************************************** + * Second pass across file. Parse header; assemble sequences + ***************************************************/ + /* We've now made a complete first pass over the file. We know how + * many blocks it contains, we know the number of seqs in the first + * block, and we know every block has the same number of blocks; + * so we can be a bit more cavalier about error-checking as we + * make the second pass. + */ + + /* Look for header + */ + headnum = 0; + for (;;) + { + if (fgets(buffer, LINEBUFLEN, fp) == NULL) + Die("Parse error in ReadSELEX()"); + strcpy(bufcpy, buffer); + if ((nptr = strtok(bufcpy, WHITESPACE)) == NULL) continue; /* skip blank lines */ + + if (strcmp(nptr, "#=AU") == 0 && (sptr = strtok(NULL, "\n")) != NULL) + ainfo->au = Strdup(sptr); + else if (strcmp(nptr, "#=ID") == 0 && (sptr = strtok(NULL, "\n")) != NULL) + ainfo->name = Strdup(sptr); + else if (strcmp(nptr, "#=AC") == 0 && (sptr = strtok(NULL, "\n")) != NULL) + ainfo->acc = Strdup(sptr); + else if (strcmp(nptr, "#=DE") == 0 && (sptr = strtok(NULL, "\n")) != NULL) + ainfo->desc = Strdup(sptr); + else if (strcmp(nptr, "#=GA") == 0) + { + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=GA line in ReadSELEX()"); + ainfo->ga1 = atof(sptr); + + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=GA line in ReadSELEX()"); + ainfo->ga2 = atof(sptr); + + ainfo->flags |= AINFO_GA; + } + else if (strcmp(nptr, "#=TC") == 0) + { + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=TC line in ReadSELEX()"); + ainfo->tc1 = atof(sptr); + + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=TC line in ReadSELEX()"); + ainfo->tc2 = atof(sptr); + + ainfo->flags |= AINFO_TC; + } + else if (strcmp(nptr, "#=NC") == 0) + { + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=NC line in ReadSELEX()"); + ainfo->nc1 = atof(sptr); + + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=NC line in ReadSELEX()"); + ainfo->nc2 = atof(sptr); + + ainfo->flags |= AINFO_NC; + } + else if (strcmp(nptr, "#=SQ") == 0) /* per-sequence header info */ + { + /* first field is the name */ + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=SQ line in ReadSELEX()"); + if (strcmp(sptr, ainfo->sqinfo[headnum].name) != 0) warn_names = TRUE; + + /* second field is the weight */ + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=SQ line in ReadSELEX()"); + if (!IsReal(sptr)) + Die("Parse error in #=SQ line in ReadSELEX(): weight is not a number"); + ainfo->wgt[headnum] = atof(sptr); + + /* third field is database source id */ + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=SQ line in ReadSELEX(): incomplete line"); + SetSeqinfoString(&(ainfo->sqinfo[headnum]), sptr, SQINFO_ID); + + /* fourth field is database accession number */ + if ((sptr = strtok(NULL, WHITESPACE)) == NULL) + Die("Parse error in #=SQ line in ReadSELEX(): incomplete line"); + SetSeqinfoString(&(ainfo->sqinfo[headnum]), sptr, SQINFO_ACC); + + /* fifth field is start..stop::olen */ + if ((sptr = strtok(NULL, ".:")) == NULL) + Die("Parse error in #=SQ line in ReadSELEX(): incomplete line"); + SetSeqinfoString(&(ainfo->sqinfo[headnum]), sptr, SQINFO_START); + + if ((sptr = strtok(NULL, ".:")) == NULL) + Die("Parse error in #=SQ line in ReadSELEX(): incomplete line"); + SetSeqinfoString(&(ainfo->sqinfo[headnum]), sptr, SQINFO_STOP); + + if ((sptr = strtok(NULL, ":\t ")) == NULL) + Die("Parse error in #=SQ line in ReadSELEX(): incomplete line"); + SetSeqinfoString(&(ainfo->sqinfo[headnum]), sptr, SQINFO_OLEN); + + /* rest of line is optional description */ + if ((sptr = strtok(NULL, "\n")) != NULL) + SetSeqinfoString(&(ainfo->sqinfo[headnum]), sptr, SQINFO_DESC); + + headnum++; + } + else if (strcmp(nptr, "#=CS") == 0) break; + else if (strcmp(nptr, "#=RF") == 0) break; + else if (strchr(commentsyms, *nptr) == NULL) break; /* non-comment, non-header */ + } + + + currlen = 0; + for (currblock = 0 ; currblock < blocknum; currblock++) + { + /* parse the block */ + seqidx = 0; + while (nptr != NULL) + { + /* Consensus structure */ + if (strcmp(nptr, "#=CS") == 0) + { + if (! copy_alignment_line(ainfo->cs, currlen, strlen(nptr)-1, + buffer, blocks[currblock].lcol, blocks[currblock].rcol, (char) '.')) + Die("Parse error in #=CS line in ReadSELEX()"); + } + + /* Reference coordinates */ + else if (strcmp(nptr, "#=RF") == 0) + { + if (! copy_alignment_line(ainfo->rf, currlen, strlen(nptr)-1, + buffer, blocks[currblock].lcol, blocks[currblock].rcol, (char) '.')) + Die("Parse error in #=RF line in ReadSELEX()"); + } + /* Individual secondary structure */ + else if (strcmp(nptr, "#=SS") == 0) + { + if (! copy_alignment_line(ainfo->sqinfo[seqidx-1].ss, currlen, strlen(nptr)-1, + buffer, blocks[currblock].lcol, + blocks[currblock].rcol, (char) '.')) + Die("Parse error in #=SS line in ReadSELEX()"); + } + + /* Side chain % surface accessibility code */ + else if (strcmp(nptr, "#=SA") == 0) + { + if (! copy_alignment_line(ainfo->sqinfo[seqidx-1].sa, currlen, strlen(nptr)-1, + buffer, blocks[currblock].lcol, + blocks[currblock].rcol, (char) '.')) + Die("Parse error in #=SA line in ReadSELEX()"); + } + /* Aligned sequence; avoid unparsed machine comments */ + else if (strncmp(nptr, "#=", 2) != 0) + { + if (! copy_alignment_line(aseqs[seqidx], currlen, strlen(nptr)-1, + buffer, blocks[currblock].lcol, blocks[currblock].rcol, (char) '.')) + Die("Parse error in alignment line in ReadSELEX()"); + seqidx++; + } + + /* get next line */ + for (;;) + { + nptr = NULL; + if (fgets(buffer, LINEBUFLEN, fp) == NULL) break; /* EOF */ + strcpy(bufcpy, buffer); + if ((nptr = strtok(bufcpy, WHITESPACE)) == NULL) break; /* blank */ + if (strncmp(buffer, "#=", 2) == 0) break; /* machine comment */ + if (strchr(commentsyms, *nptr) == NULL) break; /* data */ + } + } /* end of a block */ + + currlen += blocks[currblock].rcol - blocks[currblock].lcol + 1; + + /* get line 1 of next block */ + for (;;) + { + if (fgets(buffer, LINEBUFLEN, fp) == NULL) break; /* no data */ + strcpy(bufcpy, buffer); + if ((nptr = strtok(bufcpy, WHITESPACE)) == NULL) continue; /* blank */ + if (strncmp(buffer, "#=", 2) == 0) break; /* machine comment */ + if (strchr(commentsyms, *nptr) == NULL) break; /* non-comment */ + } + } /* end of the file */ + + /* Lengths in sqinfo are for raw sequence (ungapped), + * and SS, SA are 0..rlen-1 not 0..alen-1. + * Only the seqs with structures come out of here with lengths set. + */ + for (seqidx = 0; seqidx < num; seqidx++) + { + int apos, rpos; + /* secondary structures */ + if (ainfo->sqinfo[seqidx].flags & SQINFO_SS) + { + for (apos = rpos = 0; apos < alen; apos++) + if (! isgap(aseqs[seqidx][apos])) + { + ainfo->sqinfo[seqidx].ss[rpos] = ainfo->sqinfo[seqidx].ss[apos]; + rpos++; + } + ainfo->sqinfo[seqidx].ss[rpos] = '\0'; + } + /* Surface accessibility */ + if (ainfo->sqinfo[seqidx].flags & SQINFO_SA) + { + for (apos = rpos = 0; apos < alen; apos++) + if (! isgap(aseqs[seqidx][apos])) + { + ainfo->sqinfo[seqidx].sa[rpos] = ainfo->sqinfo[seqidx].sa[apos]; + rpos++; + } + ainfo->sqinfo[seqidx].sa[rpos] = '\0'; + } + } + + /* NULL-terminate all the strings */ + if (ainfo->rf != NULL) ainfo->rf[alen] = '\0'; + if (ainfo->cs != NULL) ainfo->cs[alen] = '\0'; + for (seqidx = 0; seqidx < num; seqidx++) + aseqs[seqidx][alen] = '\0'; + + /* find raw sequence lengths for sqinfo */ + for (seqidx = 0; seqidx < num; seqidx++) + { + count = 0; + for (sptr = aseqs[seqidx]; *sptr != '\0'; sptr++) + if (!isgap(*sptr)) count++; + ainfo->sqinfo[seqidx].len = count; + ainfo->sqinfo[seqidx].flags |= SQINFO_LEN; + } + + + /*************************************************** + * Garbage collection and return + ***************************************************/ + free(blocks); + if (warn_names) +#ifdef CLUSTALO + Warning("sequences may be in different orders in blocks of %s?", afp->fname); +#else + Warn("sequences may be in different orders in blocks of %s?", afp->fname); +#endif + + /* Convert back to MSA structure. (Wasteful kludge.) + */ + msa = MSAFromAINFO(aseqs, ainfo); + MSAVerifyParse(msa); + FreeAlignment(aseqs, ainfo); + return msa; +} + + +/* Function: WriteSELEX() + * Date: SRE, Mon Jun 14 13:13:14 1999 [St. Louis] + * + * Purpose: Write a SELEX file in multiblock format. + * + * Args: fp - file that's open for writing + * msa - multiple sequence alignment object + * + * Returns: (void) + */ +void +WriteSELEX(FILE *fp, MSA *msa) +{ + actually_write_selex(fp, msa, 50); /* 50 char per block */ +} + +/* Function: WriteSELEXOneBlock() + * Date: SRE, Mon Jun 14 13:14:56 1999 [St. Louis] + * + * Purpose: Write a SELEX alignment file in Pfam's single-block + * format style. A wrapper for actually_write_selex(). + * + * Args: fp - file that's open for writing + * msa- alignment to write + * + * Returns: (void) + */ +void +WriteSELEXOneBlock(FILE *fp, MSA *msa) +{ + actually_write_selex(fp, msa, msa->alen); /* one big block */ +} + + +/* Function: actually_write_selex() + * Date: SRE, Mon Jun 14 12:54:46 1999 [St. Louis] + * + * Purpose: Write an alignment in SELEX format to an open + * file. This is the function that actually does + * the work. The API's WriteSELEX() and + * WriteSELEXOneBlock() are wrappers. + * + * Args: fp - file that's open for writing + * msa - alignment to write + * cpl - characters to write per line in alignment block + * + * Returns: (void) + */ +static void +actually_write_selex(FILE *fp, MSA *msa, int cpl) +{ + int i; + int len = 0; + int namewidth; + char *buf; + int currpos; + + buf = malloc(sizeof(char) * (cpl+101)); /* 100 chars allowed for name, etc. */ + + /* Figure out how much space we need for name + markup + * to keep the alignment in register, for easier human viewing -- + * even though Stockholm format doesn't care about visual + * alignment. + */ + namewidth = 0; + for (i = 0; i < msa->nseq; i++) + if ((len = strlen(msa->sqname[i])) > namewidth) + namewidth = len; + if (namewidth < 6) namewidth = 6; /* minimum space for markup tags */ + + /* Free text comments + */ + for (i = 0; i < msa->ncomment; i++) + fprintf(fp, "# %s\n", msa->comment[i]); + if (msa->ncomment > 0) fprintf(fp, "\n"); + + /* Per-file annotation + */ + if (msa->name != NULL) fprintf(fp, "#=ID %s\n", msa->name); + if (msa->acc != NULL) fprintf(fp, "#=AC %s\n", msa->acc); + if (msa->desc != NULL) fprintf(fp, "#=DE %s\n", msa->desc); + if (msa->au != NULL) fprintf(fp, "#=AU %s\n", msa->au); + + /* Thresholds are hacky. Pfam has two. Rfam has one. + */ + if (msa->cutoff_is_set[MSA_CUTOFF_GA1] && msa->cutoff_is_set[MSA_CUTOFF_GA2]) + fprintf(fp, "#=GA %.1f %.1f\n", msa->cutoff[MSA_CUTOFF_GA1], msa->cutoff[MSA_CUTOFF_GA2]); + else if (msa->cutoff_is_set[MSA_CUTOFF_GA1]) + fprintf(fp, "#=GA %.1f\n", msa->cutoff[MSA_CUTOFF_GA1]); + if (msa->cutoff_is_set[MSA_CUTOFF_NC1] && msa->cutoff_is_set[MSA_CUTOFF_NC2]) + fprintf(fp, "#=NC %.1f %.1f\n", msa->cutoff[MSA_CUTOFF_NC1], msa->cutoff[MSA_CUTOFF_NC2]); + else if (msa->cutoff_is_set[MSA_CUTOFF_NC1]) + fprintf(fp, "#=NC %.1f\n", msa->cutoff[MSA_CUTOFF_NC1]); + if (msa->cutoff_is_set[MSA_CUTOFF_TC1] && msa->cutoff_is_set[MSA_CUTOFF_TC2]) + fprintf(fp, "#=TC %.1f %.1f\n", msa->cutoff[MSA_CUTOFF_TC1], msa->cutoff[MSA_CUTOFF_TC2]); + else if (msa->cutoff_is_set[MSA_CUTOFF_TC1]) + fprintf(fp, "#=TC %.1f\n", msa->cutoff[MSA_CUTOFF_TC1]); + + /* Per-sequence annotation + */ + for (i = 0; i < msa->nseq; i++) + fprintf(fp, "#=SQ %-*.*s %6.4f %s %s %d..%d::%d %s\n", + namewidth, namewidth, msa->sqname[i], + msa->wgt[i], + "-", /* MSA has no ID field */ + (msa->sqacc != NULL && msa->sqacc[i] != NULL) ? msa->sqacc[i] : "-", + 0, 0, 0, /* MSA has no start, stop, olen field */ + (msa->sqdesc != NULL && msa->sqdesc[i] != NULL) ? msa->sqdesc[i] : "-"); + fprintf(fp, "\n"); + + /* Alignment section: + */ + for (currpos = 0; currpos < msa->alen; currpos += cpl) + { + if (currpos > 0) fprintf(fp, "\n"); + + if (msa->ss_cons != NULL) { + strncpy(buf, msa->ss_cons + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "%-*.*s %s\n", namewidth, namewidth, "#=CS", buf); + } + if (msa->rf != NULL) { + strncpy(buf, msa->rf + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "%-*.*s %s\n", namewidth, namewidth, "#=RF", buf); + } + for (i = 0; i < msa->nseq; i++) + { + strncpy(buf, msa->aseq[i] + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "%-*.*s %s\n", namewidth, namewidth, msa->sqname[i], buf); + + if (msa->ss != NULL && msa->ss[i] != NULL) { + strncpy(buf, msa->ss[i] + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "%-*.*s %s\n", namewidth, namewidth, "#=SS", buf); + } + if (msa->sa != NULL && msa->sa[i] != NULL) { + strncpy(buf, msa->sa[i] + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "%-*.*s %s\n", namewidth, namewidth, "#=SA", buf); + } + } + } + free(buf); +} + + +/* Function: copy_alignment_line() + * + * Purpose: Given a line from an alignment file, and bounds lcol,rcol + * on what part of it may be sequence, save the alignment into + * aseq starting at position apos. + * + * name_rcol is set to the rightmost column this aseqs's name + * occupies; if name_rcol >= lcol, we have a special case in + * which the name intrudes into the sequence zone. + */ +static int +copy_alignment_line(char *aseq, int apos, int name_rcol, + char *buffer, int lcol, int rcol, char gapsym) +{ + char *s1, *s2; + int i; + + s1 = aseq + apos; + s2 = buffer; /* be careful that buffer doesn't end before lcol! */ + for (i = 0; i < lcol; i++) + if (*s2) s2++; + + for (i = lcol; i <= rcol; i++) + { + if (*s2 == '\t') { +#ifdef CLUSTALO + Warning("TAB characters will corrupt a SELEX alignment! Please remove them first."); +#else + Warn("TAB characters will corrupt a SELEX alignment! Please remove them first."); +#endif + return 0; + } + if (name_rcol >= i) /* name intrusion special case: pad left w/ gaps */ + *s1 = gapsym; + /* short buffer special case: pad right w/ gaps */ + else if (*s2 == '\0' || *s2 == '\n') + *s1 = gapsym; + + else if (*s2 == ' ') /* new: disallow spaces as gap symbols */ + *s1 = gapsym; + + else /* normal case: copy buffer into aseq */ + *s1 = *s2; + + s1++; + if (*s2) s2++; + } + return 1; +} + + + + + +/* Function: DealignAseqs() + * + * Given an array of (num) aligned sequences aseqs, + * strip the gaps. Store the raw sequences in a new allocated array. + * + * Caller is responsible for free'ing the memory allocated to + * rseqs. + * + * Returns 1 on success. Returns 0 and sets squid_errno on + * failure. + */ +int +DealignAseqs(char **aseqs, int num, char ***ret_rseqs) +{ + char **rseqs; /* de-aligned sequence array */ + int idx; /* counter for sequences */ + int depos; /* position counter for dealigned seq*/ + int apos; /* position counter for aligned seq */ + int seqlen; /* length of aligned seq */ + + /* alloc space */ + rseqs = (char **) MallocOrDie (num * sizeof(char *)); + /* main loop */ + for (idx = 0; idx < num; idx++) + { + seqlen = strlen(aseqs[idx]); + /* alloc space */ + rseqs[idx] = (char *) MallocOrDie ((seqlen + 1) * sizeof(char)); + + /* strip gaps */ + depos = 0; + for (apos = 0; aseqs[idx][apos] != '\0'; apos++) + if (!isgap(aseqs[idx][apos])) + { + rseqs[idx][depos] = aseqs[idx][apos]; + depos++; + } + rseqs[idx][depos] = '\0'; + } + *ret_rseqs = rseqs; + return 1; +} + + +/* Function: IsSELEXFormat() + * + * Return TRUE if filename may be in SELEX format. + * + * Accuracy is sacrificed for speed; a TRUE return does + * *not* guarantee that the file will pass the stricter + * error-checking of ReadSELEX(). All it checks is that + * the first 500 non-comment lines of a file are + * blank, or if there's a second "word" on the line + * it looks like sequence (i.e., it's not kOtherSeq). + * + * Returns TRUE or FALSE. + */ +int +IsSELEXFormat(char *filename) +{ + FILE *fp; /* ptr to open sequence file */ + char buffer[LINEBUFLEN]; + char *sptr; /* ptr to first word */ + int linenum; + + + if ((fp = fopen(filename, "r")) == NULL) + { squid_errno = SQERR_NOFILE; return 0; } + + linenum = 0; + while (linenum < 500 && + fgets(buffer, LINEBUFLEN, fp) != NULL) + { + linenum++; + /* dead giveaways for extended SELEX */ + if (strncmp(buffer, "#=AU", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=ID", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=AC", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=DE", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=GA", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=TC", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=NC", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=SQ", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=SS", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=CS", 4) == 0) goto DONE; + else if (strncmp(buffer, "#=RF", 4) == 0) goto DONE; + + /* a comment? */ + if (strchr(commentsyms, *buffer) != NULL) continue; + + /* a blank line? */ + if ((sptr = strtok(buffer, WHITESPACE)) == NULL) continue; + + /* a one-word line (name only) + is possible, though rare */ + if ((sptr = strtok(NULL, "\n")) == NULL) continue; + + if (Seqtype(sptr) == kOtherSeq) {fclose(fp); return 0;} + } + + DONE: + fclose(fp); + return 1; +} + + + + + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/seqencode.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,176 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* seqencode.c + * + * Routines for creating and manipulating encoded sequence strings. + * RCS $Id: seqencode.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: seqencode.c,v 1.3 1999/05/02 21:55:27 eddy Exp) + */ +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "squid.h" + + +#ifdef MEMDEBUG +#include "dbmalloc.h" +#endif + /* seqcmp() + returns 0 if s1 == s2 + mismatch number otherwise */ +int +seqcmp(char *s1, char *s2, int allow) +{ + int mmat = 0; + + while ((*s1 != NTEND) && (*s2 != NTEND) && (mmat <= allow)) + { + if (!(ntmatch(*s1, *s2))) + mmat++;; + s1++; + s2++; + } + while ((*s1++ != NTEND) && (mmat <= allow)) + mmat++; + return(mmat); +} + /* seqncmp() + same as seqcmp but it looks at, + at most, n positions */ +int +seqncmp(char *s1, char *s2, int n, int allow) +{ + int mmat = 0; + + while ((*s2 != NTEND) && + (n-- != 0)) + { + if ((!(ntmatch(*s1, *s2))) && + (++mmat > allow)) + return(mmat); + s1++; + s2++; + } + while ((n-- != 0) && (*s1++ != NTEND) && (mmat <= allow)) + mmat++; + return (mmat); +} + + /* seqencode() + given a character text string str (A,C,G,T), + convert to an encoded seq string; + return 1 for success, 0 if fail */ +int +seqencode(char *codeseq, /* pre-allocated space for answer */ + char *str) /* character string to convert */ +{ + char *ptr; + int idx; + + ptr = codeseq; + while (*str != '\0') + { + if (islower((int) (*str))) *str = (char) toupper((int) (*str)); + for (idx = 0; *str != iupac[idx].sym && idx <= IUPACSYMNUM; idx++) + ; + if (idx > IUPACSYMNUM) + { + *ptr = (char) NTEND; + return 0; + } + else + *ptr = iupac[idx].code; + ptr++; + str++; + } + *ptr = NTEND; + return 1; +} + + +int +coded_revcomp(char *comp, char *seq) +{ + long bases; + char *bckp, *fwdp; + int idx; + long pos; + + bases = strlen(seq); + + fwdp = comp; + bckp = seq + bases -1; + for (pos = 0; pos < bases; pos++) + { + for (idx = 0; *bckp != iupac[idx].code && idx < IUPACSYMNUM; idx++); + if (idx > IUPACSYMNUM) + { + *fwdp = NTEND; + return 0; + } + else + *fwdp = iupac[idx].comp; + fwdp++; + bckp--; + } + *fwdp = NTEND; + return(1); +} + +int +seqdecode(char *str, char *codeseq) +{ + int idx; + int pos; + + pos = 0; + while (*codeseq != NTEND) + { + for (idx = 0; *codeseq != iupac[idx].code && idx < IUPACSYMNUM; idx++) + ; + if (idx > IUPACSYMNUM) + { + str[pos] = 'X'; + return 0; + } + else + str[pos] = iupac[idx].sym; + codeseq++; + pos++; + } + str[pos] = '\0'; + return 1; +} + +int +seqndecode( + char *str, /* pre-allocated string to write into */ + char *codeseq, /* sequence to decode */ + int n) /* how many bases to decode */ +{ + int idx; + int pos = 0; + + while (--n >= 0) + { + for (idx = 0; *codeseq != iupac[idx].code && idx < IUPACSYMNUM; idx++); + if (idx > IUPACSYMNUM) + { + str[pos] = 'X'; + return 0; + } + else + str[pos] = iupac[idx].sym; + codeseq++; + pos++; + } + str[pos] = '\0'; + return 1; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/shuffle.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,638 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* shuffle.c + * + * Routines for randomizing sequences. + * + * All routines are alphabet-independent (DNA, protein, RNA, whatever); + * they assume that input strings are purely alphabetical [a-zA-Z], and + * will return strings in all upper case [A-Z]. + * + * All return 1 on success, and 0 on failure; 0 status invariably + * means the input string was not alphabetical. + * + * StrShuffle() - shuffled string, preserve mono-symbol composition. + * StrDPShuffle() - shuffled string, preserve mono- and di-symbol composition. + * + * StrMarkov0() - random string, same zeroth order Markov properties. + * StrMarkov1() - random string, same first order Markov properties. + * + * StrReverse() - simple reversal of string + * StrRegionalShuffle() - mono-symbol shuffled string in regional windows + * + * There are also similar routines for shuffling alignments: + * + * AlignmentShuffle() - alignment version of StrShuffle(). + * AlignmentBootstrap() - sample with replacement; a bootstrap dataset. + * QRNAShuffle() - shuffle a pairwise alignment, preserving all gap positions. + * + * CVS $Id: shuffle.c,v 1.6 2002/10/09 14:26:09 eddy Exp) + */ + +#include <string.h> +#include <ctype.h> + +#include "squid.h" +#include "sre_random.h" + +/* Function: StrShuffle() + * + * Purpose: Returns a shuffled version of s2, in s1. + * (s1 and s2 can be identical, to shuffle in place.) + * + * Args: s1 - allocated space for shuffled string. + * s2 - string to shuffle. + * + * Return: 1 on success. + */ +int +StrShuffle(char *s1, char *s2) +{ + int len; + int pos; + char c; + + if (s1 != s2) strcpy(s1, s2); + for (len = strlen(s1); len > 1; len--) + { + pos = CHOOSE(len); + c = s1[pos]; + s1[pos] = s1[len-1]; + s1[len-1] = c; + } + return 1; +} + +/* Function: StrDPShuffle() + * Date: SRE, Fri Oct 29 09:15:17 1999 [St. Louis] + * + * Purpose: Returns a shuffled version of s2, in s1. + * (s1 and s2 may be identical; i.e. a string + * may be shuffled in place.) The shuffle is a + * "doublet-preserving" (DP) shuffle. Both + * mono- and di-symbol composition are preserved. + * + * Done by searching for a random Eulerian + * walk on a directed multigraph. + * Reference: S.F. Altschul and B.W. Erickson, Mol. Biol. + * Evol. 2:526-538, 1985. Quoted bits in my comments + * are from Altschul's outline of the algorithm. + * + * Args: s1 - RETURN: the string after it's been shuffled + * (space for s1 allocated by caller) + * s2 - the string to be shuffled + * + * Returns: 0 if string can't be shuffled (it's not all [a-zA-z] + * alphabetic. + * 1 on success. + */ +int +StrDPShuffle(char *s1, char *s2) +{ + int len; + int pos; /* a position in s1 or s2 */ + int x,y; /* indices of two characters */ + char **E; /* edge lists: E[0] is the edge list from vertex A */ + int *nE; /* lengths of edge lists */ + int *iE; /* positions in edge lists */ + int n; /* tmp: remaining length of an edge list to be shuffled */ + char sf; /* last character in s2 */ + char Z[26]; /* connectivity in last edge graph Z */ + int keep_connecting; /* flag used in Z connectivity algorithm */ + int is_eulerian; /* flag used for when we've got a good Z */ + + /* First, verify that the string is entirely alphabetic. + */ + len = strlen(s2); + for (pos = 0; pos < len; pos++) + if (! isalpha(s2[pos])) return 0; + + /* "(1) Construct the doublet graph G and edge ordering E + * corresponding to S." + * + * Note that these also imply the graph G; and note, + * for any list x with nE[x] = 0, vertex x is not part + * of G. + */ + E = MallocOrDie(sizeof(char *) * 26); + nE = MallocOrDie(sizeof(int) * 26); + for (x = 0; x < 26; x++) + { + E[x] = MallocOrDie(sizeof(char) * (len-1)); + nE[x] = 0; + } + + x = toupper(s2[0]) - 'A'; + for (pos = 1; pos < len; pos++) + { + y = toupper(s2[pos]) - 'A'; + E[x][nE[x]] = y; + nE[x]++; + x = y; + } + + /* Now we have to find a random Eulerian edge ordering. + */ + sf = toupper(s2[len-1]) - 'A'; + is_eulerian = 0; + while (! is_eulerian) + { + /* "(2) For each vertex s in G except s_f, randomly select + * one edge from the s edge list of E(S) to be the + * last edge of the s list in a new edge ordering." + * + * select random edges and move them to the end of each + * edge list. + */ + for (x = 0; x < 26; x++) + { + if (nE[x] == 0 || x == sf) continue; + + pos = CHOOSE(nE[x]); + y = E[x][pos]; + E[x][pos] = E[x][nE[x]-1]; + E[x][nE[x]-1] = y; + } + + /* "(3) From this last set of edges, construct the last-edge + * graph Z and determine whether or not all of its + * vertices are connected to s_f." + * + * a probably stupid algorithm for looking at the + * connectivity in Z: iteratively sweep through the + * edges in Z, and build up an array (confusing called Z[x]) + * whose elements are 1 if x is connected to sf, else 0. + */ + for (x = 0; x < 26; x++) Z[x] = 0; + Z[(int) sf] = keep_connecting = 1; + + while (keep_connecting) { + keep_connecting = 0; + for (x = 0; x < 26; x++) + { + y = E[x][nE[x]-1]; /* xy is an edge in Z */ + if (Z[x] == 0 && Z[y] == 1) /* x is connected to sf in Z */ + { + Z[x] = 1; + keep_connecting = 1; + } + } + } + + /* if any vertex in Z is tagged with a 0, it's + * not connected to sf, and we won't have a Eulerian + * walk. + */ + is_eulerian = 1; + for (x = 0; x < 26; x++) + { + if (nE[x] == 0 || x == sf) continue; + if (Z[x] == 0) { + is_eulerian = 0; + break; + } + } + + /* "(4) If any vertex is not connected in Z to s_f, the + * new edge ordering will not be Eulerian, so return to + * (2). If all vertices are connected in Z to s_f, + * the new edge ordering will be Eulerian, so + * continue to (5)." + * + * e.g. note infinite loop while is_eulerian is FALSE. + */ + } + + /* "(5) For each vertex s in G, randomly permute the remaining + * edges of the s edge list of E(S) to generate the s + * edge list of the new edge ordering E(S')." + * + * Essentially a StrShuffle() on the remaining nE[x]-1 elements + * of each edge list; unfortunately our edge lists are arrays, + * not strings, so we can't just call out to StrShuffle(). + */ + for (x = 0; x < 26; x++) + for (n = nE[x] - 1; n > 1; n--) + { + pos = CHOOSE(n); + y = E[x][pos]; + E[x][pos] = E[x][n-1]; + E[x][n-1] = y; + } + + /* "(6) Construct sequence S', a random DP permutation of + * S, from E(S') as follows. Start at the s_1 edge list. + * At each s_i edge list, add s_i to S', delete the + * first edge s_i,s_j of the edge list, and move to + * the s_j edge list. Continue this process until + * all edge lists are exhausted." + */ + iE = MallocOrDie(sizeof(int) * 26); + for (x = 0; x < 26; x++) iE[x] = 0; + + pos = 0; + x = toupper(s2[0]) - 'A'; + while (1) + { + s1[pos++] = 'A' + x; /* add s_i to S' */ + + y = E[x][iE[x]]; + iE[x]++; /* "delete" s_i,s_j from edge list */ + + x = y; /* move to s_j edge list. */ + + if (iE[x] == nE[x]) + break; /* the edge list is exhausted. */ + } + s1[pos++] = 'A' + sf; + s1[pos] = '\0'; + + /* Reality checks. + */ + if (x != sf) Die("hey, you didn't end on s_f."); + if (pos != len) Die("hey, pos (%d) != len (%d).", pos, len); + + /* Free and return. + */ + Free2DArray((void **) E, 26); + free(nE); + free(iE); + return 1; +} + + +/* Function: StrMarkov0() + * Date: SRE, Fri Oct 29 11:08:31 1999 [St. Louis] + * + * Purpose: Returns a random string s1 with the same + * length and zero-th order Markov properties + * as s2. + * + * s1 and s2 may be identical, to randomize s2 + * in place. + * + * Args: s1 - allocated space for random string + * s2 - string to base s1's properties on. + * + * Returns: 1 on success; 0 if s2 doesn't look alphabetical. + */ +int +StrMarkov0(char *s1, char *s2) +{ + int len; + int pos; + float p[26]; /* symbol probabilities */ + + /* First, verify that the string is entirely alphabetic. + */ + len = strlen(s2); + for (pos = 0; pos < len; pos++) + if (! isalpha(s2[pos])) return 0; + + /* Collect zeroth order counts and convert to frequencies. + */ + FSet(p, 26, 0.); + for (pos = 0; pos < len; pos++) + p[(int)(toupper(s2[pos]) - 'A')] += 1.0; + FNorm(p, 26); + + /* Generate a random string using those p's. + */ + for (pos = 0; pos < len; pos++) + s1[pos] = FChoose(p, 26) + 'A'; + s1[pos] = '\0'; + + return 1; +} + + +/* Function: StrMarkov1() + * Date: SRE, Fri Oct 29 11:22:20 1999 [St. Louis] + * + * Purpose: Returns a random string s1 with the same + * length and first order Markov properties + * as s2. + * + * s1 and s2 may be identical, to randomize s2 + * in place. + * + * Args: s1 - allocated space for random string + * s2 - string to base s1's properties on. + * + * Returns: 1 on success; 0 if s2 doesn't look alphabetical. + */ +int +StrMarkov1(char *s1, char *s2) +{ + int len; + int pos; + int x,y; + int i; /* initial symbol */ + float p[26][26]; /* symbol probabilities */ + + /* First, verify that the string is entirely alphabetic. + */ + len = strlen(s2); + for (pos = 0; pos < len; pos++) + if (! isalpha(s2[pos])) return 0; + + /* Collect first order counts and convert to frequencies. + */ + for (x = 0; x < 26; x++) FSet(p[x], 26, 0.); + + i = x = toupper(s2[0]) - 'A'; + for (pos = 1; pos < len; pos++) + { + y = toupper(s2[pos]) - 'A'; + p[x][y] += 1.0; + x = y; + } + for (x = 0; x < 26; x++) + FNorm(p[x], 26); + + /* Generate a random string using those p's. + */ + x = i; + s1[0] = x + 'A'; + for (pos = 1; pos < len; pos++) + { + y = FChoose(p[x], 26); + s1[pos] = y + 'A'; + x = y; + } + s1[pos] = '\0'; + + return 1; +} + + + +/* Function: StrReverse() + * Date: SRE, Thu Nov 20 10:54:52 1997 [St. Louis] + * + * Purpose: Returns a reversed version of s2, in s1. + * (s1 and s2 can be identical, to reverse in place) + * + * Args: s1 - allocated space for reversed string. + * s2 - string to reverse. + * + * Return: 1. + */ +int +StrReverse(char *s1, char *s2) +{ + int len; + int pos; + char c; + + len = strlen(s2); + for (pos = 0; pos < len/2; pos++) + { /* swap ends */ + c = s2[len-pos-1]; + s1[len-pos-1] = s2[pos]; + s1[pos] = c; + } + if (len%2) { s1[pos] = s2[pos]; } /* copy middle residue in odd-len s2 */ + s1[len] = '\0'; + return 1; +} + +/* Function: StrRegionalShuffle() + * Date: SRE, Thu Nov 20 11:02:34 1997 [St. Louis] + * + * Purpose: Returns a regionally shuffled version of s2, in s1. + * (s1 and s2 can be identical to regionally + * shuffle in place.) See [Pearson88]. + * + * Args: s1 - allocated space for regionally shuffled string. + * s2 - string to regionally shuffle + * w - window size (typically 10 or 20) + * + * Return: 1. + */ +int +StrRegionalShuffle(char *s1, char *s2, int w) +{ + int len; + char c; + int pos; + int i, j; + + if (s1 != s2) strcpy(s1, s2); + len = strlen(s1); + + for (i = 0; i < len; i += w) + for (j = MIN(len-1, i+w-1); j > i; j--) + { + pos = i + CHOOSE(j-i); + c = s1[pos]; + s1[pos] = s1[j]; + s1[j] = c; + } + return 1; +} + + +/* Function: AlignmentShuffle() + * Date: SRE, Sun Apr 22 18:37:15 2001 [St. Louis] + * + * Purpose: Returns a shuffled version of ali2, in ali1. + * (ali1 and ali2 can be identical, to shuffle + * in place.) The alignment columns are shuffled, + * preserving % identity within the columns. + * + * Args: ali1 - allocated space for shuffled alignment + * [0..nseq-1][0..alen-1] + * ali2 - alignment to be shuffled + * nseq - number of sequences in the alignment + * alen - length of alignment, in columns. + * + * Returns: int + */ +int +AlignmentShuffle(char **ali1, char **ali2, int nseq, int alen) +{ + int i; + int pos; + char c; + + if (ali1 != ali2) + { + for (i = 0; i < nseq; i++) strcpy(ali1[i], ali2[i]); + } + + for (i = 0; i < nseq; i++) + ali1[i][alen] = '\0'; + + for (; alen > 1; alen--) + { + pos = CHOOSE(alen); + for (i = 0; i < nseq; i++) + { + c = ali1[i][pos]; + ali1[i][pos] = ali1[i][alen-1]; + ali1[i][alen-1] = c; + } + } + + return 1; +} + +/* Function: AlignmentBootstrap() + * Date: SRE, Sun Apr 22 18:49:14 2001 [St. Louis] + * + * Purpose: Returns a bootstrapped alignment sample in ali1, + * constructed from ali2 by sampling columns with + * replacement. + * + * Unlike the other shuffling routines, ali1 and + * ali2 cannot be the same. ali2 is left unchanged. + * ali1 must be a properly allocated space for an + * alignment the same size as ali2. + * + * Args: ali1 - allocated space for bootstrapped alignment + * [0..nseq-1][0..alen-1] + * ali2 - alignment to be bootstrapped + * nseq - number of sequences in the alignment + * alen - length of alignment, in columns. + * + * Returns: 1 on success. + */ +int +AlignmentBootstrap(char **ali1, char **ali2, int nseq, int alen) +{ + int pos; + int col; + int i; + + for (pos = 0; pos < alen; pos++) + { + col = CHOOSE(alen); + for (i = 0; i < nseq; i++) + ali1[i][pos] = ali2[i][col]; + } + for (i = 0; i < nseq; i++) + ali1[i][alen] = '\0'; + + return 1; +} + + +/* Function: QRNAShuffle() + * Date: SRE, Mon Dec 10 10:14:12 2001 [St. Louis] + * + * Purpose: Shuffle a pairwise alignment x,y while preserving the + * position of gaps; return the shuffled alignment in xs, + * ys. + * + * Works by doing three separate + * shuffles, of (1) columns with residues in both + * x and y, (2) columns with residue in x and gap in y, + * and (3) columns with gap in x and residue in y. + * + * xs,x and ys,y may be identical: that is, to shuffle + * an alignment "in place", destroying the original + * alignment, just call: + * QRNAShuffle(x,y,x,y); + * + * Args: xs, ys: allocated space for shuffled pairwise ali of x,y [L+1] + * x, y: pairwise alignment to be shuffled [0..L-1] + * + * Returns: 1 on success, 0 on failure. + * The shuffled alignment is returned in xs, ys. + */ +int +QRNAShuffle(char *xs, char *ys, char *x, char *y) +{ + int L; + int *xycol, *xcol, *ycol; + int nxy, nx, ny; + int i; + int pos, c; + char xsym, ysym; + + if (xs != x) strcpy(xs, x); + if (ys != y) strcpy(ys, y); + + /* First, construct three arrays containing lists of the column positions + * of the three types of columns. (If a column contains gaps in both x and y, + * we've already simply copied it to the shuffled sequence.) + */ + L = strlen(x); + xycol = MallocOrDie(sizeof(int) * L); + xcol = MallocOrDie(sizeof(int) * L); + ycol = MallocOrDie(sizeof(int) * L); + nxy = nx = ny = 0; + + for (i = 0; i < L; i++) + { + if (isgap(x[i]) && isgap(y[i])) { continue; } + else if (! isgap(x[i]) && ! isgap(y[i])) { xycol[nxy] = i; nxy++; } + else if (isgap(x[i])) { ycol[ny] = i; ny++; } + else if (isgap(y[i])) { xcol[nx] = i; nx++; } + } + + /* Second, shuffle the sequences indirectly, via shuffling these arrays. + * Yow, careful with those indices, and with order of the statements... + */ + for (; nxy > 1; nxy--) { + pos = CHOOSE(nxy); + xsym = xs[xycol[pos]]; ysym = ys[xycol[pos]]; c = xycol[pos]; + xs[xycol[pos]] = xs[xycol[nxy-1]]; ys[xycol[pos]] = ys[xycol[nxy-1]]; xycol[pos] = xycol[nxy-1]; + xs[xycol[nxy-1]] = xsym; ys[xycol[nxy-1]] = ysym; xycol[pos] = xycol[nxy-1]; + } + for (; nx > 1; nx--) { + pos = CHOOSE(nx); + xsym = xs[xcol[pos]]; ysym = ys[xcol[pos]]; c = xcol[pos]; + xs[xcol[pos]] = xs[xcol[nx-1]]; ys[xcol[pos]] = ys[xcol[nx-1]]; xcol[pos] = xcol[nx-1]; + xs[xcol[nx-1]] = xsym; ys[xcol[nx-1]] = ysym; xcol[nx-1] = c; + } + for (; ny > 1; ny--) { + pos = CHOOSE(ny); + xsym = xs[ycol[pos]]; ysym = ys[ycol[pos]]; c = ycol[pos]; + xs[ycol[pos]] = xs[ycol[ny-1]]; ys[ycol[pos]] = ys[ycol[ny-1]]; ycol[pos] = ycol[ny-1]; + xs[ycol[ny-1]] = xsym; ys[ycol[ny-1]] = ysym; ycol[ny-1] = c; + } + + free(xycol); free(xcol); free(ycol); + return 1; +} + + +#ifdef TESTDRIVER +/* + * cc -g -o testdriver -DTESTDRIVER -L. shuffle.c -lsquid -lm + */ +int +main(int argc, char **argv) +{ + char s1[100]; + char s2[100]; + + sre_srandom(42); + strcpy(s2, "GGGGGGGGGGCCCCCCCCCC"); + /* strcpy(s2, "AGACATAAAGTTCCGTACTGCCGGGAT"); + */ + StrDPShuffle(s1, s2); + printf("DPshuffle: %s\n", s1); + StrMarkov0(s1,s2); + printf("Markov 0 : %s\n", s1); + StrMarkov1(s1,s2); + printf("Markov 1 : %s\n", s1); + + strcpy(s1, "ACGTACGT--------ACGTACGT----ACGTACGT"); + strcpy(s2, "ACGTACGTACGTACGT------------ACGTACGT"); + QRNAShuffle(s1,s2,s1,s2); + printf("QRNA : %s\n", s1); + printf(" : %s\n", s2); + + return 0; +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/sqerror.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,98 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* sqerror.c + * + * error handling for the squid library + * RCS $Id: sqerror.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: sqerror.c,v 1.4 1999/07/15 22:28:31 eddy Exp) + */ + + /* a global errno equivalent */ +int squid_errno; + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> + +#ifdef MEMDEBUG +#include "dbmalloc.h" +#endif + +/* Function: Die() + * + * Purpose: Print an error message and die. The arguments + * are formatted exactly like arguments to printf(). + * + * Return: None. Exits the program. + */ +/* VARARGS0 */ +void +Die(char *format, ...) +{ + va_list argp; + /* format the error mesg */ + fprintf(stderr, "\nFATAL: "); + va_start(argp, format); + vfprintf(stderr, format, argp); + va_end(argp); + fprintf(stderr, "\n"); + fflush(stderr); + /* exit */ + exit(1); +} + + + +/* Function: Warn() + * + * Purpose: Print an error message and return. The arguments + * are formatted exactly like arguments to printf(). + * + * Return: (void) + */ +/* VARARGS0 */ +void +#ifdef CLUSTALO +Warning(char *format, ...) +#else +Warn(char *format, ...) +#endif +{ + va_list argp; + /* format the error mesg */ + fprintf(stderr, "WARNING: "); + va_start(argp, format); + vfprintf(stderr, format, argp); + va_end(argp); + fprintf(stderr, "\n"); + fflush(stderr); +} + +/* Function: Panic() + * + * Purpose: Die from a lethal error that's not my problem, + * but instead a failure of a StdC/POSIX call that + * shouldn't fail. Call perror() to get the + * errno flag, then die. + * + * Usually called by the PANIC macro which adds + * the __FILE__ and __LINE__ information; see + * structs.h. + * + * Inspired by code in Donald Lewine's book, _POSIX + * Programmer's Guide_. + */ +void +Panic(char *file, int line) +{ + (void) fprintf(stderr, "\nPANIC [%s line %d] ", file, line); + (void) perror("Unusual error"); + exit(EXIT_FAILURE); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/sqfuncs.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,274 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +#ifndef SQFUNCSH_INCLUDED +#define SQFUNCSH_INCLUDED +/* sqfuncs.h + * + * Prototypes for squid library functions; + * also makes a good reference list for what the package contains. + * + * Warning: squid is a slowly evolving beast. Some functions are + * obsolete. Some functions are probably just wrong, dating to + * a primordial era before I knew anything about what I was doing. + * Some functions are both obsolete and wrong but still necessary + * to get legacy code to compile. + * + * CVS $Id: sqfuncs.h,v 1.28 2002/10/09 14:26:09 eddy Exp) + */ + +/* + * from aligneval.c + */ +extern float ComparePairAlignments(char *known1, char *known2, char *calc1, char *calc2); +extern float CompareRefPairAlignments(int *ref, char *known1, char *known2, char *calc1, char *calc2); +extern float CompareMultAlignments(char **kseqs, char **tseqs, int N); +extern float CompareRefMultAlignments(int *ref, char **kseqs, char **tseqs, int N); +extern float PairwiseIdentity(char *s1, char *s2); +extern float AlignmentIdentityBySampling(char **aseq, int L, int N, int nsample); +extern char *MajorityRuleConsensus(char **aseq, int nseq, int alen); + +/* + * from alignio.c + */ +extern void AllocAlignment(int nseq, int alen, char ***ret_aseq, AINFO *ainfo); +extern void InitAinfo(AINFO *ainfo); +extern void FreeAlignment(char **aseqs, AINFO *ainfo); +extern void SAMizeAlignment(char **aseq, int nseq, int alen); +extern void SAMizeAlignmentByGapFrac(char **aseq, int nseq, int alen, float maxgap); +extern int MakeAlignedString(char *aseq, int alen, char *ss, char **ret_s); +extern int MakeDealignedString(char *aseq, int alen, char *ss, char **ret_s); +extern int DealignedLength(char *aseq); +extern int WritePairwiseAlignment(FILE *ofp, char *aseq1, char *name1, int spos1, + char *aseq2, char *name2, int spos2, + int **pam, int indent); +extern int MingapAlignment(char **aseqs, AINFO *ainfo); +extern int RandomAlignment(char **rseqs, SQINFO *sqinfo, int nseq, float pop, float pex, + char ***ret_aseqs, AINFO *ainfo); +extern void AlignmentHomogenousGapsym(char **aseq, int nseq, int alen, char gapsym); + +/* from cluster.c + */ +extern int Cluster(float **mx, int N, enum clust_strategy mode, struct phylo_s **ret_tree); +extern struct phylo_s *AllocPhylo(int N); +extern void FreePhylo(struct phylo_s *tree, int N); +extern void MakeDiffMx(char **aseqs, int num, float ***ret_dmx); +extern void MakeIdentityMx(char **aseqs, int num, float ***ret_imx); +extern void PrintNewHampshireTree(FILE *fp, AINFO *ainfo, struct phylo_s *tree, int N); +extern void PrintPhylo(FILE *fp, AINFO *ainfo, struct phylo_s *tree, int N); + +/* + * from dayhoff.c + */ +extern int ParsePAMFile(FILE *fp, int ***ret_pam, float *ret_scale); +extern void ScalePAM(int **pam, int scale); + + +/* from file.c + */ +extern char *FileDirname(char *filename); +extern char *FileTail(char *file, int noextension); +extern char *FileSameDirectory(char *full, char *file); +extern char *FileConcat(char *dir, char *file); +extern char *FileAddSuffix(char *filename, char *sfx); +extern FILE *EnvFileOpen(char *fname, char *env, char **ret_dir); +extern int FileExists(char *filename); + + +/* from getopt.c + */ +extern int Getopt(int argc, char **argv, + struct opt_s *opt, int nopts, char *usage, + int *ret_optind, char **ret_optname, char **ret_optarg); + + +/* from hsregex.c + * Henry Spencer's regex() code + */ +extern int Strparse(char *rexp, char *s, int ntok); +extern void SqdClean(void); +extern sqd_regexp *sqd_regcomp(const char *re); +extern int sqd_regexec(sqd_regexp *rp, const char *s); +extern void sqd_regsub(const sqd_regexp *rp, const char *src, char *dst); +extern void sqd_regerror(char *message); + +/* from interleaved.c + */ +extern int IsInterleavedFormat(int format); +extern int ReadInterleaved(char *seqfile, + int (*skip_header)(FILE *), + int (*parse_header)(FILE *, AINFO *), + int (*is_dataline)(char *, char *), + char ***ret_aseqs, AINFO *ainfo); +extern int ReadAlignment(char *seqfile, int format, char ***ret_aseqs, AINFO *ainfo); + + +/* from revcomp.c + */ +extern char *revcomp(char *comp, char *seq); + +/* + * from selex.c + */ +extern int DealignAseqs(char **aseqs, int num, char ***ret_rseqs); +extern int IsSELEXFormat(char *filename); +extern int TruncateNames(char **names, int N); /* OBSOLETE? */ + +/* + * from seqencode.c + */ +extern int seqcmp(char *s1, char *s2, int allow); +extern int seqncmp(char *s1, char *s2, int n, int allow); +extern int seqencode(char *codeseq,char *str); +extern int coded_revcomp(char *comp, char *seq); +extern int seqdecode(char *str, char *codeseq); +extern int seqndecode(char *str, char *codeseq, int n); + +/* + * from shuffle.c + */ +extern int StrShuffle(char *s1, char *s2); +extern int StrDPShuffle(char *s1, char *s2); +extern int StrMarkov0(char *s1, char *s2); +extern int StrMarkov1(char *s1, char *s2); +extern int StrReverse(char *s1, char *s2); +extern int StrRegionalShuffle(char *s1, char *s2, int w); +extern int AlignmentShuffle(char **ali1, char **ali2, int nseq, int alen); +extern int AlignmentBootstrap(char **ali1, char **ali2, int nseq, int alen); +extern int QRNAShuffle(char *xs, char *ys, char *x, char *y); + +/* + * from sqerror.c + */ +extern void Die(char *format, ...); +#ifdef CLUSTALO +extern void Warning(char *format, ...); +#else +extern void Warn(char *format, ...); +#endif +extern void Panic(char *file, int line); + + +/* + * from sqio.c + */ +extern void FreeSequence(char *seq, SQINFO *sqinfo); +extern int SetSeqinfoString(SQINFO *sqinfo, char *sptr, int flag); +extern void SeqinfoCopy(SQINFO *sq1, SQINFO *sq2); +extern void ToDNA(char *seq); +extern void ToRNA(char *seq); +extern void ToIUPAC(char *seq, int is_aseq); +extern int ReadMultipleRseqs(char *seqfile, int fformat, char ***ret_rseqs, + SQINFO **ret_sqinfo, int *ret_num); +extern SQFILE *SeqfileOpen(char *filename, int format, char *env); +extern SQFILE *SeqfileOpenForIndexing(char *filename, int format, char *env, int ssimode); +extern int SeqfileFormat(FILE *fp); +extern void SeqfilePosition(SQFILE *sfp, SSIOFFSET *offset); +extern void SeqfileRewind(SQFILE *sfp); +extern void SeqfileClose(SQFILE *sfp); + +extern int ReadSeq(SQFILE *fp, int format, char **ret_seq, SQINFO *sqinfo); +extern int GCGBinaryToSequence(char *seq, int len); +extern int GCGchecksum(char *seq, int seqlen); +extern int GCGMultchecksum(char **seqs, int nseq); +extern void WriteSimpleFASTA(FILE *fp, char *seq, char *name, char *desc); +extern int WriteSeq(FILE *outf, int outfmt, char *seq, SQINFO *sqinfo); +extern int Seqtype(char *seq); +extern int GuessAlignmentSeqtype(char **aseq, int nseq); +extern int String2SeqfileFormat(char *s); +extern char *SeqfileFormat2String(int code); +extern SQINFO *MSAToSqinfo(MSA *msa); + +/* from squidcore.c + */ +extern void Banner(FILE *fp, char *banner); + + +/* from sre_ctype.c + */ +extern int sre_tolower(int c); +extern int sre_toupper(int c); + +/* from sre_math.c + */ +extern int Linefit(float *x, float *y, int N, + float *ret_a, float *ret_b, float *ret_r); +extern void WeightedLinefit(float *x, float *y, float *var, int N, + float *ret_m, float *ret_b); +extern double Gammln(double xx); +extern float **FMX2Alloc(int rows, int cols); +extern void FMX2Free(float **mx); +extern double **DMX2Alloc(int rows, int cols); +extern void DMX2Free(double **mx); +extern void FMX2Multiply(float **A, float **B, float **C, int m, int p, int n); +extern double IncompleteGamma(double a, double x); + +/* from sre_string.c + */ +#ifdef NOSTR +extern char *strstr(char *s, char *subs); +#endif +extern char *Strdup(char *s); +extern void StringChop(char *s); +extern int Strinsert(char *s1, char c, int pos); +extern int Strdelete(char *s1, int pos); +extern void s2lower(char *s); +extern void s2upper(char *s); +extern void *sre_malloc(char *file, int line, size_t size); +extern void *sre_realloc(char *file, int line, void *p, size_t size); +extern void Free2DArray(void **p, int dim1); +extern void Free3DArray(void ***p, int dim1, int dim2); +extern char *RandomSequence(char *alphabet, float *p, int n, int len); +extern char *sre_fgets(char **buf, int *n, FILE *fp); +extern int sre_strcat(char **dest, int ldest, char *src, int lsrc); +extern char *sre_strtok(char **s, char *delim, int *len); +extern char *sre_strdup(char *s, int n); +extern char *sre_strncat(char *s1, char *s2, int n); +extern int IsBlankline(char *s); + +/* from stack.c + */ +extern struct intstack_s *InitIntStack(void); +extern void PushIntStack(struct intstack_s *stack, int data); +extern int PopIntStack(struct intstack_s *stack, int *ret_data); +extern void ReverseIntStack(struct intstack_s *stack); +extern int FreeIntStack( struct intstack_s *stack ); + +/* + * from translate.c + */ +extern char *Translate(char *seq, char **code); + +/* + * from types.c + */ +extern int IsInt(char *s); +extern int IsReal(char *s); +extern void Byteswap(char *swap, int nbytes); +#ifndef USE_HOST_BYTESWAP_FUNCTIONS +extern sqd_uint16 sre_ntoh16(sqd_uint16 netshort); +extern sqd_uint32 sre_ntoh32(sqd_uint32 netlong); +extern sqd_uint16 sre_hton16(sqd_uint16 hostshort); +extern sqd_uint32 sre_hton32(sqd_uint32 hostlong); +#endif /*!USE_HOST_BYTESWAP_FUNCTIONS*/ +extern sqd_uint64 sre_ntoh64(sqd_uint64 net_int64); +extern sqd_uint64 sre_hton64(sqd_uint64 host_int64); + +/* + * from weight.c + */ +extern void GSCWeights(char **aseq, int nseq, int alen, float *wgt); +extern void VoronoiWeights(char **aseq, int nseq, int alen, float *wgt); +extern void BlosumWeights(char **aseq, int nseq, int alen, float blosumlevel, float *wgt); +extern void PositionBasedWeights(char **aseq, int nseq, int alen, float *wgt); +extern void FilterAlignment(MSA *msa, float cutoff, MSA **ret_new); +extern void SampleAlignment(MSA *msa, int sample, MSA **ret_new); +extern void SingleLinkCluster(char **aseq, int nseq, int alen, float maxid, + int **ret_c, int *ret_nc); +#endif /* SQFUNCSH_INCLUDED */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/sqio.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,2033 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* File: sqio.c + * From: ureadseq.c in Don Gilbert's sequence i/o package + * + * Reads and writes nucleic/protein sequence in various + * formats. Data files may have multiple sequences. + * + * Heavily modified from READSEQ package + * Copyright (C) 1990 by D.G. Gilbert + * Biology Dept., Indiana University, Bloomington, IN 47405 + * email: gilbertd@bio.indiana.edu + * Thanks Don! + * + * SRE: Modifications as noted. Fri Jul 3 09:44:54 1992 + * Packaged for squid, Thu Oct 1 10:07:11 1992 + * ANSI conversion in full swing, Mon Jul 12 12:22:21 1993 + * + * CVS $Id: sqio.c,v 1.29 2002/08/26 23:10:52 eddy Exp) + * + ***************************************************************** + * Basic API for single sequence reading: + * + * SQFILE *sqfp; + * char *seqfile; + * int format; - see squid.h for formats; example: SQFILE_FASTA + * char *seq; + * SQINFO sqinfo; + * + * if ((sqfp = SeqfileOpen(seqfile, format, "BLASTDB")) == NULL) + * Die("Failed to open sequence database file %s\n%s\n", seqfile, usage); + * while (ReadSeq(sqfp, sqfp->format, &seq, &sqinfo)) { + * do_stuff; + * FreeSequence(seq, &sqinfo); + * } + * SeqfileClose(sqfp); + * + ***************************************************************** + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +#ifndef SEEK_SET +#include <unistd.h> +#endif + +#include "squid.h" +#include "msa.h" +#include "ssi.h" + +static void SeqfileGetLine(SQFILE *V); + +#define kStartLength 500 + +static char *aminos = "ABCDEFGHIKLMNPQRSTVWXYZ*"; +static char *primenuc = "ACGTUN"; +static char *protonly = "EFIPQZ"; + +static SQFILE *seqfile_open(char *filename, int format, char *env, int ssimode); + +/* Function: SeqfileOpen() + * + * Purpose : Open a sequence database file and prepare for reading + * sequentially. + * + * Args: filename - name of file to open + * format - format of file + * env - environment variable for path (e.g. BLASTDB) + * ssimode - -1, SSI_OFFSET_I32, or SSI_OFFSET_I64 + * + * Returns opened SQFILE ptr, or NULL on failure. + */ +SQFILE * +SeqfileOpen(char *filename, int format, char *env) +{ + return seqfile_open(filename, format, env, -1); +} +SQFILE * +SeqfileOpenForIndexing(char *filename, int format, char *env, int ssimode) +{ + return seqfile_open(filename, format, env, ssimode); +} +static SQFILE * +seqfile_open(char *filename, int format, char *env, int ssimode) +{ + SQFILE *dbfp; + + dbfp = (SQFILE *) MallocOrDie (sizeof(SQFILE)); + + dbfp->ssimode = ssimode; + dbfp->rpl = -1; /* flag meaning "unset" */ + dbfp->lastrpl = 0; + dbfp->maxrpl = 0; + dbfp->bpl = -1; /* flag meaning "unset" */ + dbfp->lastbpl = 0; + dbfp->maxbpl = 0; + + /* Open our file handle. + * Three possibilities: + * 1. normal file open + * 2. filename = "-"; read from stdin + * 3. filename = "*.gz"; read thru pipe from gzip + * If we're reading from stdin or a pipe, we can't reliably + * back up, so we can't do two-pass parsers like the interleaved alignment + * formats. + */ + if (strcmp(filename, "-") == 0) + { + dbfp->f = stdin; + dbfp->do_stdin = TRUE; + dbfp->do_gzip = FALSE; + dbfp->fname = sre_strdup("[STDIN]", -1); + } +#ifndef SRE_STRICT_ANSI + /* popen(), pclose() aren't portable to non-POSIX systems; disable */ + else if (Strparse("^.*\\.gz$", filename, 0)) + { + char cmd[256]; + + /* Note that popen() will return "successfully" + * if file doesn't exist, because gzip works fine + * and prints an error! So we have to check for + * existence of file ourself. + */ + if (! FileExists(filename)) + Die("%s: file does not exist", filename); + + if (strlen(filename) + strlen("gzip -dc ") >= 256) + Die("filename > 255 char in SeqfileOpen()"); + sprintf(cmd, "gzip -dc %s", filename); + if ((dbfp->f = popen(cmd, "r")) == NULL) + return NULL; + + dbfp->do_stdin = FALSE; + dbfp->do_gzip = TRUE; + dbfp->fname = sre_strdup(filename, -1); + } +#endif /*SRE_STRICT_ANSI*/ + else + { + if ((dbfp->f = fopen(filename, "r")) == NULL && + (dbfp->f = EnvFileOpen(filename, env, NULL)) == NULL) + return NULL; + + dbfp->do_stdin = FALSE; + dbfp->do_gzip = FALSE; + dbfp->fname = sre_strdup(filename, -1); + } + + + /* Invoke autodetection if we haven't already been told what + * to expect. + */ + if (format == SQFILE_UNKNOWN) + { + if (dbfp->do_stdin == TRUE || dbfp->do_gzip) + Die("Can't autodetect sequence file format from a stdin or gzip pipe"); + format = SeqfileFormat(dbfp->f); + if (format == SQFILE_UNKNOWN) + Die("Can't determine format of sequence file %s", dbfp->fname); + } + + /* The hack for sequential access of an interleaved alignment file: + * read the alignment in, we'll copy sequences out one at a time. + */ + dbfp->msa = NULL; + dbfp->afp = NULL; + dbfp->format = format; + dbfp->linenumber = 0; + dbfp->buf = NULL; + dbfp->buflen = 0; + if (IsAlignmentFormat(format)) + { + /* We'll be reading from the MSA interface. Copy our data + * to the MSA afp's structure. + */ + dbfp->afp = MallocOrDie(sizeof(MSAFILE)); + dbfp->afp->f = dbfp->f; /* just a ptr, don't close */ + dbfp->afp->do_stdin = dbfp->do_stdin; + dbfp->afp->do_gzip = dbfp->do_gzip; + dbfp->afp->fname = dbfp->fname; /* just a ptr, don't free */ + dbfp->afp->format = dbfp->format; /* e.g. format */ + dbfp->afp->linenumber = dbfp->linenumber; /* e.g. 0 */ + dbfp->afp->buf = NULL; + dbfp->afp->buflen = 0; + + if ((dbfp->msa = MSAFileRead(dbfp->afp)) == NULL) + Die("Failed to read any alignment data from file %s", dbfp->fname); + /* hack: overload/reuse msa->lastidx; indicates + next seq to return upon a ReadSeq() call */ + dbfp->msa->lastidx = 0; + + return dbfp; + } + + /* Load the first line. + */ + SeqfileGetLine(dbfp); + return dbfp; +} + +/* Function: SeqfilePosition() + * + * Purpose: Move to a particular offset in a seqfile. + * Will not work on alignment files. + */ +void +SeqfilePosition(SQFILE *sqfp, SSIOFFSET *offset) +{ + if (sqfp->do_stdin || sqfp->do_gzip || IsAlignmentFormat(sqfp->format)) + Die("SeqfilePosition() failed: in a nonrewindable data file or stream"); + + if (SSISetFilePosition(sqfp->f, offset) != 0) + Die("SSISetFilePosition failed, but that shouldn't happen."); + SeqfileGetLine(sqfp); +} + + +/* Function: SeqfileRewind() + * + * Purpose: Set a sequence file back to the first sequence. + * + * Won't work on alignment files. Although it would + * seem that it could (just set msa->lastidx back to 0), + * that'll fail on "multiple multiple" alignment file formats + * (e.g. Stockholm). + */ +void +SeqfileRewind(SQFILE *sqfp) +{ + if (sqfp->do_stdin || sqfp->do_gzip) + Die("SeqfileRewind() failed: in a nonrewindable data file or stream"); + + rewind(sqfp->f); + SeqfileGetLine(sqfp); +} + +/* Function: SeqfileLineParameters() + * Date: SRE, Thu Feb 15 17:00:41 2001 [St. Louis] + * + * Purpose: After all the sequences have been read from the file, + * but before closing it, retrieve overall bytes-per-line and + * residues-per-line info. If non-zero, these mean that + * the file contains homogeneous sequence line lengths (except + * the last line in each record). + * + * If either of bpl or rpl is determined to be inhomogeneous, + * both are returned as 0. + * + * Args: *sqfp - an open but fully read sequence file + * ret_bpl - RETURN: bytes per line, or 0 if inhomogeneous + * ret_rpl - RETURN: residues per line, or 0 if inhomogenous. + * + * Returns: void + */ +void +SeqfileLineParameters(SQFILE *V, int *ret_bpl, int *ret_rpl) +{ + if (V->rpl > 0 && V->maxrpl == V->rpl && + V->bpl > 0 && V->maxbpl == V->bpl) { + *ret_bpl = V->bpl; + *ret_rpl = V->rpl; + } else { + *ret_bpl = 0; + *ret_rpl = 0; + } +} + + +void +SeqfileClose(SQFILE *sqfp) +{ + /* note: don't test for sqfp->msa being NULL. Now that + * we're holding afp open and allowing access to multi-MSA + * databases (e.g. Stockholm format, Pfam), msa ends + * up being NULL when we run out of alignments. + */ + if (sqfp->afp != NULL) { + if (sqfp->msa != NULL) MSAFree(sqfp->msa); + if (sqfp->afp->buf != NULL) free(sqfp->afp->buf); + free(sqfp->afp); + } +#ifndef SRE_STRICT_ANSI /* gunzip functionality only on POSIX systems */ + if (sqfp->do_gzip) pclose(sqfp->f); +#endif + else if (! sqfp->do_stdin) fclose(sqfp->f); + if (sqfp->buf != NULL) free(sqfp->buf); + if (sqfp->fname != NULL) free(sqfp->fname); + free(sqfp); +} + + +/* Function: SeqfileGetLine() + * Date: SRE, Tue Jun 22 09:15:49 1999 [Sanger Centre] + * + * Purpose: read a line from a sequence file into V->buf + * If the fgets() is NULL, sets V->buf[0] to '\0'. + * + * Args: V + * + * Returns: void + */ +static void +SeqfileGetLine(SQFILE *V) +{ + if (V->ssimode >= 0) + if (0 != SSIGetFilePosition(V->f, V->ssimode, &(V->ssioffset))) + Die("SSIGetFilePosition() failed"); + if (sre_fgets(&(V->buf), &(V->buflen), V->f) == NULL) + *(V->buf) = '\0'; + V->linenumber++; +} + + +void +FreeSequence(char *seq, SQINFO *sqinfo) +{ + if (seq != NULL) free(seq); + if (sqinfo->flags & SQINFO_SS) free(sqinfo->ss); + if (sqinfo->flags & SQINFO_SA) free(sqinfo->sa); +} + +int +SetSeqinfoString(SQINFO *sqinfo, char *sptr, int flag) +{ + int len; + int pos; + + /* silently ignore NULL. */ + if (sptr == NULL) return 1; + + while (*sptr == ' ') sptr++; /* ignore leading whitespace */ + for (pos = strlen(sptr)-1; pos >= 0; pos--) + if (! isspace((int) sptr[pos])) break; + sptr[pos+1] = '\0'; /* ignore trailing whitespace */ + + switch (flag) { + case SQINFO_NAME: + if (*sptr != '-') + { + strncpy(sqinfo->name, sptr, SQINFO_NAMELEN-1); + sqinfo->name[SQINFO_NAMELEN-1] = '\0'; + sqinfo->flags |= SQINFO_NAME; + } + break; + + case SQINFO_ID: + if (*sptr != '-') + { + strncpy(sqinfo->id, sptr, SQINFO_NAMELEN-1); + sqinfo->id[SQINFO_NAMELEN-1] = '\0'; + sqinfo->flags |= SQINFO_ID; + } + break; + + case SQINFO_ACC: + if (*sptr != '-') + { + strncpy(sqinfo->acc, sptr, SQINFO_NAMELEN-1); + sqinfo->acc[SQINFO_NAMELEN-1] = '\0'; + sqinfo->flags |= SQINFO_ACC; + } + break; + + case SQINFO_DESC: + if (*sptr != '-') + { + if (sqinfo->flags & SQINFO_DESC) /* append? */ + { + len = strlen(sqinfo->desc); + if (len < SQINFO_DESCLEN-2) /* is there room? */ + { + strncat(sqinfo->desc, " ", SQINFO_DESCLEN-1-len); len++; + strncat(sqinfo->desc, sptr, SQINFO_DESCLEN-1-len); + } + } + else /* else copy */ + strncpy(sqinfo->desc, sptr, SQINFO_DESCLEN-1); + sqinfo->desc[SQINFO_DESCLEN-1] = '\0'; + sqinfo->flags |= SQINFO_DESC; + } + break; + + case SQINFO_START: + if (!IsInt(sptr)) { squid_errno = SQERR_FORMAT; return 0; } + sqinfo->start = atoi(sptr); + if (sqinfo->start != 0) sqinfo->flags |= SQINFO_START; + break; + + case SQINFO_STOP: + if (!IsInt(sptr)) { squid_errno = SQERR_FORMAT; return 0; } + sqinfo->stop = atoi(sptr); + if (sqinfo->stop != 0) sqinfo->flags |= SQINFO_STOP; + break; + + case SQINFO_OLEN: + if (!IsInt(sptr)) { squid_errno = SQERR_FORMAT; return 0; } + sqinfo->olen = atoi(sptr); + if (sqinfo->olen != 0) sqinfo->flags |= SQINFO_OLEN; + break; + + default: + Die("Invalid flag %d to SetSeqinfoString()", flag); + } + return 1; +} + +void +SeqinfoCopy(SQINFO *sq1, SQINFO *sq2) +{ + sq1->flags = sq2->flags; + if (sq2->flags & SQINFO_NAME) strcpy(sq1->name, sq2->name); + if (sq2->flags & SQINFO_ID) strcpy(sq1->id, sq2->id); + if (sq2->flags & SQINFO_ACC) strcpy(sq1->acc, sq2->acc); + if (sq2->flags & SQINFO_DESC) strcpy(sq1->desc, sq2->desc); + if (sq2->flags & SQINFO_LEN) sq1->len = sq2->len; + if (sq2->flags & SQINFO_START) sq1->start = sq2->start; + if (sq2->flags & SQINFO_STOP) sq1->stop = sq2->stop; + if (sq2->flags & SQINFO_OLEN) sq1->olen = sq2->olen; + if (sq2->flags & SQINFO_TYPE) sq1->type = sq2->type; + if (sq2->flags & SQINFO_SS) sq1->ss = Strdup(sq2->ss); + if (sq2->flags & SQINFO_SA) sq1->sa = Strdup(sq2->sa); +} + +/* Function: ToDNA() + * + * Purpose: Convert a sequence to DNA. + * U --> T + */ +void +ToDNA(char *seq) +{ + for (; *seq != '\0'; seq++) + { + if (*seq == 'U') *seq = 'T'; + else if (*seq == 'u') *seq = 't'; + } +} + +/* Function: ToRNA() + * + * Purpose: Convert a sequence to RNA. + * T --> U + */ +void +ToRNA(char *seq) +{ + for (; *seq != '\0'; seq++) + { + if (*seq == 'T') *seq = 'U'; + else if (*seq == 't') *seq = 'u'; + } +} + + +/* Function: ToIUPAC() + * + * Purpose: Convert X's, o's, other junk in a nucleic acid sequence to N's, + * to comply with IUPAC code. If is_aseq is TRUE, will allow gap + * characters though, so we can call ToIUPAC() on aligned seqs. + * + * NUCLEOTIDES is defined in squid.h as: + * "ACGTUNRYMKSWHBVDacgtunrymkswhbvd" + * gap chars allowed by isgap() are defined in squid.h as: + * " ._-~" + * + * WU-BLAST's pressdb will + * choke on X's, for instance, necessitating conversion + * of certain genome centers' data. + */ +void +ToIUPAC(char *seq, int is_aseq) +{ + if (is_aseq) { + for (; *seq != '\0'; seq++) + if (strchr(NUCLEOTIDES, *seq) == NULL && ! isgap(*seq)) *seq = 'N'; + } else { + for (; *seq != '\0'; seq++) + if (strchr(NUCLEOTIDES, *seq) == NULL) *seq = 'N'; + } +} + + +/* Function: addseq() + * + * Purpose: Add a line of sequence to the growing string in V. + * + * In the seven supported unaligned formats, all sequence + * lines may contain whitespace that must be filtered out; + * four formats (PIR, EMBL, Genbank, GCG) include coordinates + * that must be filtered out. Thus an (!isdigit && !isspace) + * test on each character before we accept it. + */ +static void +addseq(char *s, struct ReadSeqVars *V) +{ + char *s0; + char *sq; + int rpl; /* valid residues per line */ + int bpl; /* characters per line */ + + if (V->ssimode == -1) + { /* Normal mode: keeping the seq */ + /* Make sure we have enough room. We know that s is <= buflen, + * so just make sure we've got room for a whole new buflen worth + * of sequence. + */ + if (V->seqlen + V->buflen > V->maxseq) { + V->maxseq += MAX(V->buflen, kStartLength); + V->seq = ReallocOrDie (V->seq, V->maxseq+1); + } + + sq = V->seq + V->seqlen; + while (*s != 0) { +#ifdef CLUSTALO + if (! isdigit((int) *s) && ! isspace((int) *s) && isprint((int) *s)) { +#else + if (! isdigit((int) *s) && ! isspace((int) *s)) { +#endif + *sq = *s; + sq++; + } + s++; + } + V->seqlen = sq - V->seq; + } + else /* else: indexing mode, discard the seq */ + { + s0 = s; + rpl = 0; + while (*s != 0) { + if (! isdigit((int) *s) && ! isspace((int) *s)) { + rpl++; + } + s++; + } + V->seqlen += rpl; + bpl = s - s0; + + /* Keep track of the global rpl, bpl for the file. + * This is overly complicated because we have to + * allow the last line of each record (e.g. the last addseq() call + * on each sequence) to have a different length - and sometimes + * we'll have one-line sequence records, too. Thus we only + * do something with the global V->rpl when we have *passed over* + * a line - we keep the last line's rpl in last_rpl. And because + * a file might consist entirely of single-line records, we keep + * a third guy, maxrpl, that tells us the maximum rpl of any line + * in the file. If we reach the end of file and rpl is still unset, + * we'll set it to maxrpl. If we reach eof and rpl is set, but is + * less than maxrpl, that's a weird case where a last line in some + * record is longer than every other line. + */ + if (V->rpl != 0) { /* 0 means we already know rpl is invalid */ + if (V->lastrpl > 0) { /* we're on something that's not the first line */ + if (V->rpl > 0 && V->lastrpl != V->rpl) V->rpl = 0; + else if (V->rpl == -1) V->rpl = V->lastrpl; + } + V->lastrpl = rpl; + if (rpl > V->maxrpl) V->maxrpl = rpl; /* make sure we check max length of final lines */ + } + if (V->bpl != 0) { /* 0 means we already know bpl is invalid */ + if (V->lastbpl > 0) { /* we're on something that's not the first line */ + if (V->bpl > 0 && V->lastbpl != V->bpl) V->bpl = 0; + else if (V->bpl == -1) V->bpl = V->lastbpl; + } + V->lastbpl = bpl; + if (bpl > V->maxbpl) V->maxbpl = bpl; /* make sure we check max length of final lines */ + } + } /* end of indexing mode of addseq(). */ + +} + +static void +readLoop(int addfirst, int (*endTest)(char *,int *), struct ReadSeqVars *V) +{ + int addend = 0; + int done = 0; + + V->seqlen = 0; + V->lastrpl = V->lastbpl = 0; + if (addfirst) { + if (V->ssimode >= 0) V->d_off = V->ssioffset; + addseq(V->buf, V); + } else if (V->ssimode >= 0) + if (0 != SSIGetFilePosition(V->f, V->ssimode, &(V->d_off))) + Die("SSIGetFilePosition() failed"); + + do { + SeqfileGetLine(V); + /* feof() alone is a bug; files not necessarily \n terminated */ + if (*(V->buf) == '\0' && feof(V->f)) + done = TRUE; + done |= (*endTest)(V->buf, &addend); + if (addend || !done) + addseq(V->buf, V); + } while (!done); +} + + +static int +endPIR(char *s, int *addend) +{ + *addend = 0; + if ((strncmp(s, "///", 3) == 0) || + (strncmp(s, "ENTRY", 5) == 0)) + return 1; + else + return 0; +} + +static void +readPIR(struct ReadSeqVars *V) +{ + char *sptr; + /* load first line of entry */ + while (!feof(V->f) && strncmp(V->buf, "ENTRY", 5) != 0) { + SeqfileGetLine(V); + } + if (feof(V->f)) return; + if (V->ssimode >= 0) V->r_off = V->ssioffset; + + if ((sptr = strtok(V->buf + 15, "\n\t ")) != NULL) + { + SetSeqinfoString(V->sqinfo, sptr, SQINFO_NAME); + SetSeqinfoString(V->sqinfo, sptr, SQINFO_ID); + } + do { + SeqfileGetLine(V); + if (!feof(V->f) && strncmp(V->buf, "TITLE", 5) == 0) + SetSeqinfoString(V->sqinfo, V->buf+15, SQINFO_DESC); + else if (!feof(V->f) && strncmp(V->buf, "ACCESSION", 9) == 0) + { + if ((sptr = strtok(V->buf+15, " \t\n")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_ACC); + } + } while (! feof(V->f) && (strncmp(V->buf,"SEQUENCE", 8) != 0)); + SeqfileGetLine(V); /* skip next line, coords */ + + readLoop(0, endPIR, V); + + /* reading a real PIR-CODATA database file, we keep the source coords + */ + V->sqinfo->start = 1; + V->sqinfo->stop = V->seqlen; + V->sqinfo->olen = V->seqlen; + V->sqinfo->flags |= SQINFO_START | SQINFO_STOP | SQINFO_OLEN; + + /* get next line + */ + while (!feof(V->f) && strncmp(V->buf, "ENTRY", 5) != 0) { + SeqfileGetLine(V); + } +} + + + +static int +endIG(char *s, int *addend) +{ + *addend = 1; /* 1 or 2 occur in line w/ bases */ + return((strchr(s,'1')!=NULL) || (strchr(s,'2')!=NULL)); +} + +static void +readIG(struct ReadSeqVars *V) +{ + char *nm; + /* position past ';' comments */ + do { + SeqfileGetLine(V); + } while (! (feof(V->f) || ((*V->buf != 0) && (*V->buf != ';')) )); + + if (!feof(V->f)) + { + if ((nm = strtok(V->buf, "\n\t ")) != NULL) + SetSeqinfoString(V->sqinfo, nm, SQINFO_NAME); + + readLoop(0, endIG, V); + } + + while (!(feof(V->f) || ((*V->buf != '\0') && (*V->buf == ';')))) + SeqfileGetLine(V); +} + +static int +endStrider(char *s, int *addend) +{ + *addend = 0; + return (strstr( s, "//") != NULL); +} + +static void +readStrider(struct ReadSeqVars *V) +{ + char *nm; + + while ((!feof(V->f)) && (*V->buf == ';')) + { + if (strncmp(V->buf,"; DNA sequence", 14) == 0) + { + if ((nm = strtok(V->buf+16, ",\n\t ")) != NULL) + SetSeqinfoString(V->sqinfo, nm, SQINFO_NAME); + } + SeqfileGetLine(V); + } + + if (! feof(V->f)) + readLoop(1, endStrider, V); + + /* load next line + */ + while ((!feof(V->f)) && (*V->buf != ';')) + SeqfileGetLine(V); +} + + +static int +endGB(char *s, int *addend) +{ + *addend = 0; + return ((strstr(s,"//") != NULL) || (strstr(s,"LOCUS") == s)); +} + +static void +readGenBank(struct ReadSeqVars *V) +{ + char *sptr; + int in_definition; + + /* We'll map three genbank identifiers onto names: + * LOCUS -> sqinfo.name + * ACCESSION -> sqinfo.acc [primary accession only] + * VERSION -> sqinfo.id + * We don't currently store the GI number, or secondary accessions. + */ + while (strncmp(V->buf, "LOCUS", 5) != 0) { + SeqfileGetLine(V); + } + if (V->ssimode >= 0) V->r_off = V->ssioffset; + + if ((sptr = strtok(V->buf+12, "\n\t ")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_NAME); + + in_definition = FALSE; + while (! feof(V->f)) + { + SeqfileGetLine(V); + if (! feof(V->f) && strstr(V->buf, "DEFINITION") == V->buf) + { + if ((sptr = strtok(V->buf+12, "\n")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_DESC); + in_definition = TRUE; + } + else if (! feof(V->f) && strstr(V->buf, "ACCESSION") == V->buf) + { + if ((sptr = strtok(V->buf+12, "\n\t ")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_ACC); + in_definition = FALSE; + } + else if (! feof(V->f) && strstr(V->buf, "VERSION") == V->buf) + { + if ((sptr = strtok(V->buf+12, "\n\t ")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_ID); + in_definition = FALSE; + } + else if (strncmp(V->buf,"ORIGIN", 6) != 0) + { + if (in_definition) + SetSeqinfoString(V->sqinfo, V->buf, SQINFO_DESC); + } + else + break; + } + + readLoop(0, endGB, V); + + /* reading a real GenBank database file, we keep the source coords + */ + V->sqinfo->start = 1; + V->sqinfo->stop = V->seqlen; + V->sqinfo->olen = V->seqlen; + V->sqinfo->flags |= SQINFO_START | SQINFO_STOP | SQINFO_OLEN; + + + while (!(feof(V->f) || ((*V->buf!=0) && (strstr(V->buf,"LOCUS") == V->buf)))) + SeqfileGetLine(V); + /* SRE: V->s now holds "//", so sequential + reads are wedged: fixed Tue Jul 13 1993 */ + while (!feof(V->f) && strstr(V->buf, "LOCUS ") != V->buf) + SeqfileGetLine(V); +} + +static int +endGCGdata(char *s, int *addend) +{ + *addend = 0; + return (*s == '>'); +} + +static void +readGCGdata(struct ReadSeqVars *V) +{ + int binary = FALSE; /* whether data are binary or not */ + int blen = 0; /* length of binary sequence */ + + /* first line contains ">>>>" followed by name */ + if (Strparse(">>>>([^ ]+) .+2BIT +Len: ([0-9]+)", V->buf, 2)) + { + binary = TRUE; + SetSeqinfoString(V->sqinfo, sqd_parse[1], SQINFO_NAME); + blen = atoi(sqd_parse[2]); + } + else if (Strparse(">>>>([^ ]+) .+ASCII +Len: [0-9]+", V->buf, 1)) + SetSeqinfoString(V->sqinfo, sqd_parse[1], SQINFO_NAME); + else + Die("bogus GCGdata format? %s", V->buf); + + /* second line contains free text description */ + SeqfileGetLine(V); + SetSeqinfoString(V->sqinfo, V->buf, SQINFO_DESC); + + if (binary) { + /* allocate for blen characters +3... (allow for 3 bytes of slop) */ + if (blen >= V->maxseq) { + V->maxseq = blen; + if ((V->seq = (char *) realloc (V->seq, sizeof(char)*(V->maxseq+4)))==NULL) + Die("malloc failed"); + } + /* read (blen+3)/4 bytes from file */ + if (fread(V->seq, sizeof(char), (blen+3)/4, V->f) < (size_t) ((blen+3)/4)) + Die("fread failed"); + V->seqlen = blen; + /* convert binary code to seq */ + GCGBinaryToSequence(V->seq, blen); + } + else readLoop(0, endGCGdata, V); + + while (!(feof(V->f) || ((*V->buf != 0) && (*V->buf == '>')))) + SeqfileGetLine(V); +} + +static int +endPearson(char *s, int *addend) +{ + *addend = 0; + return(*s == '>'); +} + +static void +readPearson(struct ReadSeqVars *V) +{ + char *sptr; + + if (V->ssimode >= 0) V->r_off = V->ssioffset; + + if (*V->buf != '>') + Die("\ +File %s does not appear to be in FASTA format at line %d.\n\ +You may want to specify the file format on the command line.\n\ +Usually this is done with an option --informat <fmt>.\n", + V->fname, V->linenumber); + + if ((sptr = strtok(V->buf+1, "\n\t ")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_NAME); + if ((sptr = strtok(NULL, "\n")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_DESC); + + readLoop(0, endPearson, V); + + while (!(feof(V->f) || ((*V->buf != 0) && (*V->buf == '>')))) { + SeqfileGetLine(V); + } +} + + +static int +endEMBL(char *s, int *addend) +{ + *addend = 0; + /* Some people (Berlin 5S rRNA database, f'r instance) use + * an extended EMBL format that attaches extra data after + * the sequence -- watch out for that. We use the fact that + * real EMBL sequence lines begin with five spaces. + * + * We can use this as the sole end test because readEMBL() will + * advance to the next ID line before starting to read again. + */ + return (strncmp(s," ",5) != 0); +/* return ((strstr(s,"//") != NULL) || (strstr(s,"ID ") == s)); */ +} + +static void +readEMBL(struct ReadSeqVars *V) +{ + char *sptr; + + /* make sure we have first line */ + while (!feof(V->f) && strncmp(V->buf, "ID ", 4) != 0) { + SeqfileGetLine(V); + } + if (V->ssimode >= 0) V->r_off = V->ssioffset; + + if ((sptr = strtok(V->buf+5, "\n\t ")) != NULL) + { + SetSeqinfoString(V->sqinfo, sptr, SQINFO_NAME); + SetSeqinfoString(V->sqinfo, sptr, SQINFO_ID); + } + + do { + SeqfileGetLine(V); + if (!feof(V->f) && strstr(V->buf, "AC ") == V->buf) + { + if ((sptr = strtok(V->buf+5, "; \t\n")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_ACC); + } + else if (!feof(V->f) && strstr(V->buf, "DE ") == V->buf) + { + if ((sptr = strtok(V->buf+5, "\n")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_DESC); + } + } while (! feof(V->f) && strncmp(V->buf,"SQ",2) != 0); + + readLoop(0, endEMBL, V); + + /* Hack for Staden experiment files: convert - to N + */ + if (V->ssimode == -1) /* if we're in ssi mode, we're not keeping the seq */ + for (sptr = V->seq; *sptr != '\0'; sptr++) + if (*sptr == '-') *sptr = 'N'; + + /* reading a real EMBL database file, we keep the source coords + */ + V->sqinfo->start = 1; + V->sqinfo->stop = V->seqlen; + V->sqinfo->olen = V->seqlen; + V->sqinfo->flags |= SQINFO_START | SQINFO_STOP | SQINFO_OLEN; + + /* load next record's ID line */ + while (!feof(V->f) && strncmp(V->buf, "ID ", 4) != 0) { + SeqfileGetLine(V); + } + +} + + +static int +endZuker(char *s, int *addend) +{ + *addend = 0; + return( *s == '(' ); +} + +static void +readZuker(struct ReadSeqVars *V) +{ + char *sptr; + + SeqfileGetLine(V); /*s == "seqLen seqid string..."*/ + + if ((sptr = strtok(V->buf+6, " \t\n")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_NAME); + + if ((sptr = strtok(NULL, "\n")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_DESC); + + readLoop(0, endZuker, V); + + while (!(feof(V->f) | ((*V->buf != '\0') & (*V->buf == '(')))) + SeqfileGetLine(V); +} + +static void +readUWGCG(struct ReadSeqVars *V) +{ + char *si; + char *sptr; + int done; + + V->seqlen = 0; + + /*writeseq: " %s Length: %d (today) Check: %d ..\n" */ + /*drop above or ".." from id*/ + if ((si = strstr(V->buf," Length: ")) != NULL) *si = 0; + else if ((si = strstr(V->buf,"..")) != NULL) *si = 0; + + if ((sptr = strtok(V->buf, "\n\t ")) != NULL) + SetSeqinfoString(V->sqinfo, sptr, SQINFO_NAME); + + do { + done = feof(V->f); + SeqfileGetLine(V); + if (! done) addseq(V->buf, V); + } while (!done); +} + + +/* Function: ReadSeq() + * + * Purpose: Read next sequence from an open database file. + * Return the sequence and associated info. + * + * Args: fp - open sequence database file pointer + * format - format of the file (previously determined + * by call to SeqfileFormat()). + * Currently unused, since we carry it in V. + * ret_seq - RETURN: sequence + * sqinfo - RETURN: filled in w/ other information + * + * Limitations: uses squid_errno, so it's not threadsafe. + * + * Return: 1 on success, 0 on failure. + * ret_seq and some field of sqinfo are allocated here, + * The preferred call mechanism to properly free the memory is: + * + * SQINFO sqinfo; + * char *seq; + * + * ReadSeq(fp, format, &seq, &sqinfo); + * ... do something... + * FreeSequence(seq, &sqinfo); + */ +int +ReadSeq(SQFILE *V, int format, char **ret_seq, SQINFO *sqinfo) +{ + int gotuw; + + squid_errno = SQERR_OK; + + /* Here's the hack for sequential access of sequences from + * the multiple sequence alignment formats + */ + if (IsAlignmentFormat(V->format)) + { + if (V->msa->lastidx >= V->msa->nseq) + { /* out of data. try to read another alignment */ + MSAFree(V->msa); + if ((V->msa = MSAFileRead(V->afp)) == NULL) + return 0; + V->msa->lastidx = 0; + } + /* copy and dealign the appropriate aligned seq */ +/* AW: stopping squid from dealigning sequences and corresponding info */ +#ifdef CLUSTALO + V->seq = sre_strdup(V->msa->aseq[V->msa->lastidx], V->msa->alen); +#else + MakeDealignedString(V->msa->aseq[V->msa->lastidx], V->msa->alen, + V->msa->aseq[V->msa->lastidx], &(V->seq)); +#endif + V->seqlen = strlen(V->seq); + + /* Extract sqinfo stuff for this sequence from the msa. + * Tedious; code that should be cleaned. + */ + sqinfo->flags = 0; + if (V->msa->sqname[V->msa->lastidx] != NULL) + SetSeqinfoString(sqinfo, V->msa->sqname[V->msa->lastidx], SQINFO_NAME); + if (V->msa->sqacc != NULL && V->msa->sqacc[V->msa->lastidx] != NULL) + SetSeqinfoString(sqinfo, V->msa->sqacc[V->msa->lastidx], SQINFO_ACC); + if (V->msa->sqdesc != NULL && V->msa->sqdesc[V->msa->lastidx] != NULL) + SetSeqinfoString(sqinfo, V->msa->sqdesc[V->msa->lastidx], SQINFO_DESC); + if (V->msa->ss != NULL && V->msa->ss[V->msa->lastidx] != NULL) { +/* AW: stopping squid from dealigning sequences and corresponding info */ +#ifdef CLUSTALO + sqinfo->ss = sre_strdup(V->msa->ss[V->msa->lastidx], V->msa->alen); +#else + MakeDealignedString(V->msa->aseq[V->msa->lastidx], V->msa->alen, + V->msa->ss[V->msa->lastidx], &(sqinfo->ss)); +#endif + sqinfo->flags |= SQINFO_SS; + } + if (V->msa->sa != NULL && V->msa->sa[V->msa->lastidx] != NULL) { +/* AW: stopping squid from dealigning sequences and corresponding info */ +#ifdef CLUSTALO + sqinfo->sa = sre_strdup(V->msa->sa[V->msa->lastidx], V->msa->alen); +#else + MakeDealignedString(V->msa->aseq[V->msa->lastidx], V->msa->alen, + V->msa->sa[V->msa->lastidx], &(sqinfo->sa)); +#endif + sqinfo->flags |= SQINFO_SA; + } + V->msa->lastidx++; + } + else { + if (feof(V->f)) return 0; + + if (V->ssimode == -1) { /* normal mode */ + V->seq = (char*) calloc (kStartLength+1, sizeof(char)); + V->maxseq = kStartLength; + } else { /* index mode: discarding seq */ + V->seq = NULL; + V->maxseq = 0; + } + V->seqlen = 0; + V->sqinfo = sqinfo; + V->sqinfo->flags = 0; + + switch (V->format) { + case SQFILE_IG : readIG(V); break; + case SQFILE_STRIDER : readStrider(V); break; + case SQFILE_GENBANK : readGenBank(V); break; + case SQFILE_FASTA : readPearson(V); break; + case SQFILE_EMBL : readEMBL(V); break; + case SQFILE_ZUKER : readZuker(V); break; + case SQFILE_PIR : readPIR(V); break; + case SQFILE_GCGDATA : readGCGdata(V); break; + + case SQFILE_GCG : + do { /* skip leading comments on GCG file */ + gotuw = (strstr(V->buf,"..") != NULL); + if (gotuw) readUWGCG(V); + SeqfileGetLine(V); + } while (! feof(V->f)); + break; + + case SQFILE_IDRAW: /* SRE: no attempt to read idraw postscript */ + default: + squid_errno = SQERR_FORMAT; + free(V->seq); + return 0; + } + if (V->seq != NULL) /* (it can be NULL in indexing mode) */ + V->seq[V->seqlen] = 0; /* stick a string terminator on it */ + } + + /* Cleanup + */ + sqinfo->len = V->seqlen; + sqinfo->flags |= SQINFO_LEN; + *ret_seq = V->seq; + if (squid_errno == SQERR_OK) return 1; else return 0; +} + +/* Function: SeqfileFormat() + * Date: SRE, Tue Jun 22 10:58:58 1999 [Sanger Centre] + * + * Purpose: Determine format of an open file. + * Returns format code. + * Rewinds the file. + * + * Autodetects the following unaligned formats: + * SQFILE_FASTA + * SQFILE_GENBANK + * SQFILE_EMBL + * SQFILE_GCG + * SQFILE_GCGDATA + * SQFILE_PIR + * Also autodetects the following alignment formats: + * MSAFILE_STOCKHOLM + * MSAFILE_MSF + * MSAFILE_CLUSTAL + * MSAFILE_SELEX + * MSAFILE_PHYLIP + * + * Can't autodetect MSAFILE_A2M, calls it SQFILE_FASTA. + * MSAFileFormat() does the opposite. + * + * Args: sfp - open SQFILE + * + * Return: format code, or SQFILE_UNKNOWN if unrecognized + */ +int +SeqfileFormat(FILE *fp) +{ + char *buf; + int len; + int fmt = SQFILE_UNKNOWN; + int ndataline; + char *bufcpy, *s, *s1, *s2; + int has_junk; + + buf = NULL; + len = 0; + ndataline = 0; + has_junk = FALSE; + while (sre_fgets(&buf, &len, fp) != NULL) + { + if (IsBlankline(buf)) continue; + + /* Well-behaved formats identify themselves in first nonblank line. + */ + if (ndataline == 0) + { + if (strncmp(buf, ">>>>", 4) == 0 && strstr(buf, "Len: ")) + { fmt = SQFILE_GCGDATA; goto DONE; } + + if (buf[0] == '>') + { fmt = SQFILE_FASTA; goto DONE; } + + if (strncmp(buf, "!!AA_SEQUENCE", 13) == 0 || + strncmp(buf, "!!NA_SEQUENCE", 13) == 0) + { fmt = SQFILE_GCG; goto DONE; } + + if (strncmp(buf, "# STOCKHOLM 1.", 14) == 0) + { fmt = MSAFILE_STOCKHOLM; goto DONE; } + + if (strncmp(buf, "CLUSTAL", 7) == 0 && + strstr(buf, "multiple sequence alignment") != NULL) + { fmt = MSAFILE_CLUSTAL; goto DONE; } + + if (strncmp(buf, "!!AA_MULTIPLE_ALIGNMENT", 23) == 0 || + strncmp(buf, "!!NA_MULTIPLE_ALIGNMENT", 23) == 0) + { fmt = MSAFILE_MSF; goto DONE; } + + /* PHYLIP id: also just a good bet */ + bufcpy = sre_strdup(buf, -1); + s = bufcpy; + if ((s1 = sre_strtok(&s, WHITESPACE, NULL)) != NULL && + (s2 = sre_strtok(&s, WHITESPACE, NULL)) != NULL && + IsInt(s1) && + IsInt(s2)) + { free(bufcpy); fmt = MSAFILE_PHYLIP; goto DONE; } + free(bufcpy); + } + + /* We trust that other formats identify themselves soon. + */ + /* dead giveaways for extended SELEX */ + if (strncmp(buf, "#=AU", 4) == 0 || + strncmp(buf, "#=ID", 4) == 0 || + strncmp(buf, "#=AC", 4) == 0 || + strncmp(buf, "#=DE", 4) == 0 || + strncmp(buf, "#=GA", 4) == 0 || + strncmp(buf, "#=TC", 4) == 0 || + strncmp(buf, "#=NC", 4) == 0 || + strncmp(buf, "#=SQ", 4) == 0 || + strncmp(buf, "#=SS", 4) == 0 || + strncmp(buf, "#=CS", 4) == 0 || + strncmp(buf, "#=RF", 4) == 0) + { fmt = MSAFILE_SELEX; goto DONE; } + + if (strncmp(buf, "///", 3) == 0 || strncmp(buf, "ENTRY ", 6) == 0) + { fmt = SQFILE_PIR; goto DONE; } + + /* a ha, diagnostic of an (old) MSF file */ + if ((strstr(buf, "..") != NULL) && + (strstr(buf, "MSF:") != NULL) && + (strstr(buf, "Check:")!= NULL)) + { fmt = MSAFILE_MSF; goto DONE; } + + /* unaligned GCG (must follow MSF test!) */ + if (strstr(buf, " Check: ") != NULL && strstr(buf, "..") != NULL) + { fmt = SQFILE_GCG; goto DONE; } + + if (strncmp(buf,"LOCUS ",6) == 0 || strncmp(buf,"ORIGIN ",6) == 0) + { fmt = SQFILE_GENBANK; goto DONE; } + + if (strncmp(buf,"ID ",5) == 0 || strncmp(buf,"SQ ",5) == 0) + { fmt = SQFILE_EMBL; goto DONE; } + + /* But past here, we're being desperate. A simple SELEX file is + * very difficult to detect; we can only try to disprove it. + */ + s = buf; + if ((s1 = sre_strtok(&s, WHITESPACE, NULL)) == NULL) continue; /* skip blank lines */ + if (strchr("#%", *s1) != NULL) continue; /* skip comment lines */ + + /* Disproof 1. Noncomment, nonblank lines in a SELEX file + * must have at least two space-delimited fields (name/seq) + */ + if ((s2 = sre_strtok(&s, WHITESPACE, NULL)) == NULL) + has_junk = TRUE; + + /* Disproof 2. + * The sequence field should look like a sequence. + */ + if (s2 != NULL && Seqtype(s2) == kOtherSeq) + has_junk = TRUE; + + ndataline++; + if (ndataline == 300) break; /* only look at first 300 lines */ + } + + if (ndataline == 0) + Die("Sequence file contains no data"); + + /* If we've made it this far, we've run out of data, but there + * was at least one line of it; check if we've + * disproven SELEX. If not, cross our fingers, pray, and guess SELEX. + */ + if (has_junk == TRUE) fmt = SQFILE_UNKNOWN; + else fmt = MSAFILE_SELEX; + + DONE: + if (buf != NULL) free(buf); + rewind(fp); + return fmt; +} + +/* Function: GCGBinaryToSequence() + * + * Purpose: Convert a GCG 2BIT binary string to DNA sequence. + * 0 = C 1 = T 2 = A 3 = G + * 4 nts/byte + * + * Args: seq - binary sequence. Converted in place to DNA. + * len - length of DNA. binary is (len+3)/4 bytes + */ +int +GCGBinaryToSequence(char *seq, int len) +{ + int bpos; /* position in binary */ + int spos; /* position in sequence */ + char twobit; + int i; + + for (bpos = (len-1)/4; bpos >= 0; bpos--) + { + twobit = seq[bpos]; + spos = bpos*4; + + for (i = 3; i >= 0; i--) + { + switch (twobit & 0x3) { + case 0: seq[spos+i] = 'C'; break; + case 1: seq[spos+i] = 'T'; break; + case 2: seq[spos+i] = 'A'; break; + case 3: seq[spos+i] = 'G'; break; + } + twobit = twobit >> 2; + } + } + seq[len] = '\0'; + return 1; +} + + +/* Function: GCGchecksum() + * Date: SRE, Mon May 31 11:13:21 1999 [St. Louis] + * + * Purpose: Calculate a GCG checksum for a sequence. + * Code provided by Steve Smith of Genetics + * Computer Group. + * + * Args: seq - sequence to calculate checksum for. + * may contain gap symbols. + * len - length of sequence (usually known, + * so save a strlen() call) + * + * Returns: GCG checksum. + */ +int +GCGchecksum(char *seq, int len) +{ + int i; /* position in sequence */ + int chk = 0; /* calculated checksum */ + + for (i = 0; i < len; i++) + chk = (chk + (i % 57 + 1) * (sre_toupper((int) seq[i]))) % 10000; + return chk; +} + + +/* Function: GCGMultchecksum() + * + * Purpose: GCG checksum for a multiple alignment: sum of + * individual sequence checksums (including their + * gap characters) modulo 10000. + * + * Implemented using spec provided by Steve Smith of + * Genetics Computer Group. + * + * Args: seqs - sequences to be checksummed; aligned or not + * nseq - number of sequences + * + * Return: the checksum, a number between 0 and 9999 + */ +int +GCGMultchecksum(char **seqs, int nseq) +{ + int chk = 0; + int idx; + + for (idx = 0; idx < nseq; idx++) + chk = (chk + GCGchecksum(seqs[idx], strlen(seqs[idx]))) % 10000; + return chk; +} + + + + +/* Function: Seqtype() + * + * Purpose: Returns a (very good) guess about type of sequence: + * kDNA, kRNA, kAmino, or kOtherSeq. + * + * Modified from, and replaces, Gilbert getseqtype(). + */ +int +Seqtype(char *seq) +{ + int saw; /* how many non-gap characters I saw */ + char c; + int po = 0; /* count of protein-only */ + int nt = 0; /* count of t's */ + int nu = 0; /* count of u's */ + int na = 0; /* count of nucleotides */ + int aa = 0; /* count of amino acids */ + int no = 0; /* count of others */ + + /* Look at the first 300 non-gap characters + */ + +#ifdef CLUSTALO + /* VGGNGDDYLSGGTGNDTL is recognized as unknown using squid's default + * approach. + * We change it to the following: + + * 1. counting: ignore gaps and not alpha characters. if protein-only then + * count as such (po). otherwise decide if amino-acid (aa) or nucleic-acid + * (na) or unknown (no) + * + * 2. determine type: if we saw more unknown than aa or na, return unknown. + * if encountered protein-only return protein-only. otherwise decide based + * on majority. (if aa==na return na) + */ + for (saw = 0; *seq != '\0' && saw < 300; seq++) { + c = sre_toupper((int) *seq); + int unknown = 1; + + if (isgap(c) || ! isalpha((int) c)) { + continue; + } + + if (strchr(protonly, c)) { + po++; + unknown = 0; + } + + if (strchr(aminos,c)) { + aa++; + unknown = 0; + } + + if (strchr(primenuc,c)) { + na++; + unknown = 0; + + if (c == 'T') + nt++; + else if (c == 'U') + nu++; + } + + if (unknown) { + no ++; + } + + saw++; + } + + if (no > aa && no > na) + return kOtherSeq; + + if (po > 0 || aa>na) + return kAmino; + + if (na >= aa) { + if (nu > nt) + return kRNA; + else + return kDNA; + } + + return kOtherSeq; + + +#else + for (saw = 0; *seq != '\0' && saw < 300; seq++) + { + c = sre_toupper((int) *seq); + if (! isgap(c)) + { + if (strchr(protonly, c)) po++; + else if (strchr(primenuc,c)) { + na++; + if (c == 'T') nt++; + else if (c == 'U') nu++; + } + else if (strchr(aminos,c)) aa++; + else if (isalpha((int) c)) no++; + saw++; + } + } + + if (no > 0) return kOtherSeq; + else if (po > 0) return kAmino; + else if (na > aa) { + if (nu > nt) return kRNA; + else return kDNA; + } + else return kAmino; /* ooooh. risky. */ +#endif + +} + + +/* Function: GuessAlignmentSeqtype() + * Date: SRE, Wed Jul 7 09:42:34 1999 [St. Louis] + * + * Purpose: Try to guess whether an alignment is protein + * or nucleic acid; return a code for the + * type (kRNA, kDNA, or kAmino). + * + * Args: aseq - array of aligned sequences. (Could also + * be an rseq unaligned sequence array) + * nseq - number of aseqs + * + * Returns: kRNA, kDNA, kAmino; + * kOtherSeq if inconsistency is detected. + */ +int +GuessAlignmentSeqtype(char **aseq, int nseq) +{ + int idx; + int nrna = 0; + int ndna = 0; + int namino = 0; + int nother = 0; + + for (idx = 0; idx < nseq; idx++) + switch (Seqtype(aseq[idx])) { + case kRNA: nrna++; break; + case kDNA: ndna++; break; + case kAmino: namino++; break; + default: nother++; + } + + /* Unambiguous decisions: + */ + if (nother) return kOtherSeq; + if (namino == nseq) return kAmino; + if (ndna == nseq) return kDNA; + if (nrna == nseq) return kRNA; + + /* Ambiguous decisions: + */ + if (namino == 0) return kRNA; /* it's nucleic acid, but seems mixed RNA/DNA */ + return kAmino; /* some amino acid seen; others probably short seqs, some + of which may be entirely ACGT (ala,cys,gly,thr). We + could be a little more sophisticated: U would be a giveaway + that we're not in protein seqs */ +} + +/* Function: WriteSimpleFASTA() + * Date: SRE, Tue Nov 16 18:06:00 1999 [St. Louis] + * + * Purpose: Just write a FASTA format sequence to a file; + * minimal interface, mostly for quick and dirty programs. + * + * Args: fp - open file handle (stdout, possibly) + * seq - sequence to output + * name - name for the sequence + * desc - optional description line, or NULL. + * + * Returns: void + */ +void +WriteSimpleFASTA(FILE *fp, char *seq, char *name, char *desc) +{ + char buf[61]; + int len; + int pos; + + len = strlen(seq); + buf[60] = '\0'; + fprintf(fp, ">%s %s\n", name, desc != NULL ? desc : ""); + for (pos = 0; pos < len; pos += 60) + { + strncpy(buf, seq+pos, 60); + fprintf(fp, "%s\n", buf); + } +} + +int +WriteSeq(FILE *outf, int outform, char *seq, SQINFO *sqinfo) +{ + int numline = 0; + int lines = 0, spacer = 0, width = 50, tab = 0; + int i, j, l, l1, ibase; + char endstr[10]; + char s[100]; /* buffer for sequence */ + char ss[100]; /* buffer for structure */ + int checksum = 0; + int seqlen; + int which_case; /* 0 = do nothing. 1 = upper case. 2 = lower case */ + int dostruc; /* TRUE to print structure lines*/ + + which_case = 0; + dostruc = FALSE; + seqlen = (sqinfo->flags & SQINFO_LEN) ? sqinfo->len : strlen(seq); + + if (IsAlignmentFormat(outform)) + Die("Tried to write an aligned format with WriteSeq() -- bad, bad."); + + + strcpy( endstr,""); + l1 = 0; + checksum = GCGchecksum(seq, seqlen); + + switch (outform) { + case SQFILE_UNKNOWN: /* no header, just sequence */ + strcpy(endstr,"\n"); /* end w/ extra blank line */ + break; + + case SQFILE_GENBANK: + fprintf(outf,"LOCUS %s %d bp\n", + sqinfo->name, seqlen); + fprintf(outf,"ACCESSION %s\n", + (sqinfo->flags & SQINFO_ACC) ? sqinfo->acc : "."); + fprintf(outf,"DEFINITION %s\n", + (sqinfo->flags & SQINFO_DESC) ? sqinfo->desc : "."); + fprintf(outf,"VERSION %s\n", + (sqinfo->flags & SQINFO_ID) ? sqinfo->id : "."); + fprintf(outf,"ORIGIN \n"); + spacer = 11; + numline = 1; + strcpy(endstr, "\n//"); + break; + + case SQFILE_GCGDATA: + fprintf(outf, ">>>>%s 9/95 ASCII Len: %d\n", sqinfo->name, seqlen); + fprintf(outf, "%s\n", (sqinfo->flags & SQINFO_DESC) ? sqinfo->desc : "-"); + break; + + case SQFILE_PIR: + fprintf(outf, "ENTRY %s\n", + (sqinfo->flags & SQINFO_ID) ? sqinfo->id : sqinfo->name); + fprintf(outf, "TITLE %s\n", + (sqinfo->flags & SQINFO_DESC) ? sqinfo->desc : "-"); + fprintf(outf, "ACCESSION %s\n", + (sqinfo->flags & SQINFO_ACC) ? sqinfo->acc : "-"); + fprintf(outf, "SUMMARY #Length %d #Checksum %d\n", + sqinfo->len, checksum); + fprintf(outf, "SEQUENCE\n"); + fprintf(outf, " 5 10 15 20 25 30\n"); + spacer = 2; /* spaces after every residue */ + numline = 1; /* number lines w/ coords */ + width = 30; /* 30 aa per line */ + strcpy(endstr, "\n///"); + break; + + case SQFILE_SQUID: + fprintf(outf, "NAM %s\n", sqinfo->name); + if (sqinfo->flags & (SQINFO_ID | SQINFO_ACC | SQINFO_START | SQINFO_STOP | SQINFO_OLEN)) + fprintf(outf, "SRC %s %s %d..%d::%d\n", + (sqinfo->flags & SQINFO_ID) ? sqinfo->id : "-", + (sqinfo->flags & SQINFO_ACC) ? sqinfo->acc : "-", + (sqinfo->flags & SQINFO_START) ? sqinfo->start : 0, + (sqinfo->flags & SQINFO_STOP) ? sqinfo->stop : 0, + (sqinfo->flags & SQINFO_OLEN) ? sqinfo->olen : 0); + if (sqinfo->flags & SQINFO_DESC) + fprintf(outf, "DES %s\n", sqinfo->desc); + if (sqinfo->flags & SQINFO_SS) + { + fprintf(outf, "SEQ +SS\n"); + dostruc = TRUE; /* print structure lines too */ + } + else + fprintf(outf, "SEQ\n"); + numline = 1; /* number seq lines w/ coords */ + strcpy(endstr, "\n++"); + break; + + case SQFILE_EMBL: + fprintf(outf,"ID %s\n", + (sqinfo->flags & SQINFO_ID) ? sqinfo->id : sqinfo->name); + fprintf(outf,"AC %s\n", + (sqinfo->flags & SQINFO_ACC) ? sqinfo->acc : "-"); + fprintf(outf,"DE %s\n", + (sqinfo->flags & SQINFO_DESC) ? sqinfo->desc : "-"); + fprintf(outf,"SQ %d BP\n", seqlen); + strcpy(endstr, "\n//"); /* 11Oct90: bug fix*/ + tab = 5; /** added 31jan91 */ + spacer = 11; /** added 31jan91 */ + break; + + case SQFILE_GCG: + fprintf(outf,"%s\n", sqinfo->name); + if (sqinfo->flags & SQINFO_ACC) + fprintf(outf,"ACCESSION %s\n", sqinfo->acc); + if (sqinfo->flags & SQINFO_DESC) + fprintf(outf,"DEFINITION %s\n", sqinfo->desc); + fprintf(outf," %s Length: %d (today) Check: %d ..\n", + sqinfo->name, seqlen, checksum); + spacer = 11; + numline = 1; + strcpy(endstr, "\n"); /* this is insurance to help prevent misreads at eof */ + break; + + case SQFILE_STRIDER: /* ?? map ?*/ + fprintf(outf,"; ### from DNA Strider ;-)\n"); + fprintf(outf,"; DNA sequence %s, %d bases, %d checksum.\n;\n", + sqinfo->name, seqlen, checksum); + strcpy(endstr, "\n//"); + break; + + /* SRE: Don had Zuker default to Pearson, which is not + intuitive or helpful, since Zuker's MFOLD can't read + Pearson format. More useful to use kIG */ + case SQFILE_ZUKER: + which_case = 1; /* MFOLD requires upper case. */ + /*FALLTHRU*/ + case SQFILE_IG: + fprintf(outf,";%s %s\n", + sqinfo->name, + (sqinfo->flags & SQINFO_DESC) ? sqinfo->desc : ""); + fprintf(outf,"%s\n", sqinfo->name); + strcpy(endstr,"1"); /* == linear dna */ + break; + + case SQFILE_RAW: /* Raw: no header at all. */ + break; + + default : + case SQFILE_FASTA: + fprintf(outf,">%s %s\n", sqinfo->name, + (sqinfo->flags & SQINFO_DESC) ? sqinfo->desc : ""); + break; + } + + if (which_case == 1) s2upper(seq); + if (which_case == 2) s2lower(seq); + + + width = MIN(width,100); + for (i=0, l=0, ibase = 1, lines = 0; i < seqlen; ) { + if (l1 < 0) l1 = 0; + else if (l1 == 0) { + if (numline) fprintf(outf,"%8d ",ibase); + for (j=0; j<tab; j++) fputc(' ',outf); + } + if ((spacer != 0) && ((l+1) % spacer == 1)) + { s[l] = ' '; ss[l] = ' '; l++; } + s[l] = seq[i]; + ss[l] = (sqinfo->flags & SQINFO_SS) ? sqinfo->ss[i] : '.'; + l++; i++; + l1++; /* don't count spaces for width*/ + if (l1 == width || i == seqlen) { + s[l] = ss[l] = '\0'; + l = 0; l1 = 0; + if (dostruc) + { + fprintf(outf, "%s\n", s); + if (numline) fprintf(outf," "); + for (j=0; j<tab; j++) fputc(' ',outf); + if (i == seqlen) fprintf(outf,"%s%s\n",ss,endstr); + else fprintf(outf,"%s\n",ss); + } + else + { + if (i == seqlen) fprintf(outf,"%s%s\n",s,endstr); + else fprintf(outf,"%s\n",s); + } + lines++; + ibase = i+1; + } + } + return lines; +} + + +/* Function: ReadMultipleRseqs() + * + * Purpose: Open a data file and + * parse it into an array of rseqs (raw, unaligned + * sequences). + * + * Caller is responsible for free'ing memory allocated + * to ret_rseqs, ret_weights, and ret_names. + * + * Weights are currently only supported for MSF format. + * Sequences read from all other formats will be assigned + * weights of 1.0. If the caller isn't interested in + * weights, it passes NULL as ret_weights. + * + * Returns 1 on success. Returns 0 on failure and sets + * squid_errno to indicate the cause. + */ +int +ReadMultipleRseqs(char *seqfile, + int fformat, + char ***ret_rseqs, + SQINFO **ret_sqinfo, + int *ret_num) +{ + SQINFO *sqinfo; /* array of sequence optional info */ + SQFILE *dbfp; /* open ptr for sequential access of file */ + char **rseqs; /* sequence array */ + int numalloced; /* num of seqs currently alloced for */ + int num; + + + num = 0; + numalloced = 16; + rseqs = (char **) MallocOrDie (numalloced * sizeof(char *)); + sqinfo = (SQINFO *) MallocOrDie (numalloced * sizeof(SQINFO)); + if ((dbfp = SeqfileOpen(seqfile, fformat, NULL)) == NULL) return 0; + + while (ReadSeq(dbfp, dbfp->format, &rseqs[num], &(sqinfo[num]))) + { + num++; + if (num == numalloced) /* more seqs coming, alloc more room */ + { + numalloced += 16; + rseqs = (char **) ReallocOrDie (rseqs, numalloced*sizeof(char *)); + sqinfo = (SQINFO *) ReallocOrDie (sqinfo, numalloced * sizeof(SQINFO)); + } + } + SeqfileClose(dbfp); + + *ret_rseqs = rseqs; + *ret_sqinfo = sqinfo; + *ret_num = num; + return 1; +} + + +/* Function: String2SeqfileFormat() + * Date: SRE, Sun Jun 27 15:25:54 1999 [TW 723 over Canadian Shield] + * + * Purpose: Convert a string (e.g. from command line option arg) + * to a format code. Case insensitive. Return + * MSAFILE_UNKNOWN/SQFILE_UNKNOWN if string is bad. + * Uses codes defined in squid.h (unaligned formats) and + * msa.h (aligned formats). + * + * Args: s - string to convert; e.g. "stockholm" + * + * Returns: format code; e.g. MSAFILE_STOCKHOLM + */ +int +String2SeqfileFormat(char *s) +{ + char *s2; + int code = SQFILE_UNKNOWN; + + if (s == NULL) return SQFILE_UNKNOWN; + s2 = sre_strdup(s, -1); + s2upper(s2); + + if (strcmp(s2, "FASTA") == 0) code = SQFILE_FASTA; +#ifdef CLUSTALO + if (strcmp(s2, "FA") == 0) code = SQFILE_FASTA; + else if (strcmp(s2, "VIENNA") == 0) code = SQFILE_VIENNA; + else if (strcmp(s2, "VIE") == 0) code = SQFILE_VIENNA; +#endif + else if (strcmp(s2, "GENBANK") == 0) code = SQFILE_GENBANK; +#ifdef CLUSTALO + else if (strcmp(s2, "GB") == 0) code = SQFILE_GENBANK; +#endif + else if (strcmp(s2, "EMBL") == 0) code = SQFILE_EMBL; + else if (strcmp(s2, "GCG") == 0) code = SQFILE_GCG; + else if (strcmp(s2, "GCGDATA") == 0) code = SQFILE_GCGDATA; + else if (strcmp(s2, "RAW") == 0) code = SQFILE_RAW; + else if (strcmp(s2, "IG") == 0) code = SQFILE_IG; + else if (strcmp(s2, "STRIDER") == 0) code = SQFILE_STRIDER; + else if (strcmp(s2, "IDRAW") == 0) code = SQFILE_IDRAW; + else if (strcmp(s2, "ZUKER") == 0) code = SQFILE_ZUKER; + else if (strcmp(s2, "PIR") == 0) code = SQFILE_PIR; + else if (strcmp(s2, "SQUID") == 0) code = SQFILE_SQUID; + else if (strcmp(s2, "STOCKHOLM") == 0) code = MSAFILE_STOCKHOLM; +#ifdef CLUSTALO + else if (strcmp(s2, "ST") == 0) code = MSAFILE_STOCKHOLM; + else if (strcmp(s2, "STK") == 0) code = MSAFILE_STOCKHOLM; +#endif + else if (strcmp(s2, "SELEX") == 0) code = MSAFILE_SELEX; + else if (strcmp(s2, "MSF") == 0) code = MSAFILE_MSF; + else if (strcmp(s2, "CLUSTAL") == 0) code = MSAFILE_CLUSTAL; +#ifdef CLUSTALO + else if (strcmp(s2, "CLU") == 0) code = MSAFILE_CLUSTAL; +#endif + else if (strcmp(s2, "A2M") == 0) code = MSAFILE_A2M; + else if (strcmp(s2, "PHYLIP") == 0) code = MSAFILE_PHYLIP; +#ifdef CLUSTALO + else if (strcmp(s2, "PHY") == 0) code = MSAFILE_PHYLIP; +#endif + else if (strcmp(s2, "EPS") == 0) code = MSAFILE_EPS; +#ifdef CLUSTALO + else code = SQFILE_UNKNOWN; +#endif + free(s2); + return code; +} +char * +SeqfileFormat2String(int code) +{ + switch (code) { + case SQFILE_UNKNOWN: return "unknown"; + case SQFILE_FASTA: return "FASTA"; +#ifdef CLUSTALO + case SQFILE_VIENNA: return "Vienna"; +#endif + case SQFILE_GENBANK: return "Genbank"; + case SQFILE_EMBL: return "EMBL"; + case SQFILE_GCG: return "GCG"; + case SQFILE_GCGDATA: return "GCG data library"; + case SQFILE_RAW: return "raw"; + case SQFILE_IG: return "Intelligenetics"; + case SQFILE_STRIDER: return "MacStrider"; + case SQFILE_IDRAW: return "Idraw Postscript"; + case SQFILE_ZUKER: return "Zuker"; + case SQFILE_PIR: return "PIR"; + case SQFILE_SQUID: return "SQUID"; + case MSAFILE_STOCKHOLM: return "Stockholm"; + case MSAFILE_SELEX: return "SELEX"; + case MSAFILE_MSF: return "MSF"; + case MSAFILE_CLUSTAL: return "Clustal"; + case MSAFILE_A2M: return "a2m"; + case MSAFILE_PHYLIP: return "Phylip"; + case MSAFILE_EPS: return "EPS"; + default: + Die("Bad code passed to MSAFormat2String()"); + } + /*NOTREACHED*/ + return NULL; +} + + +/* Function: MSAToSqinfo() + * Date: SRE, Tue Jul 20 14:36:56 1999 [St. Louis] + * + * Purpose: Take an MSA and generate a SQINFO array suitable + * for use in annotating the unaligned sequences. + * Return the array. + * + * Permanent temporary code. sqinfo was poorly designed. + * it must eventually be replaced, but the odds + * of this happening soon are nil, so I have to deal. + * + * Args: msa - the alignment + * + * Returns: ptr to allocated sqinfo array. + * Freeing is ghastly: free in each individual sqinfo[i] + * with FreeSequence(NULL, &(sqinfo[i])), then + * free(sqinfo). + */ +SQINFO * +MSAToSqinfo(MSA *msa) +{ + int idx; + SQINFO *sqinfo; + + sqinfo = MallocOrDie(sizeof(SQINFO) * msa->nseq); + + for (idx = 0; idx < msa->nseq; idx++) + { + sqinfo[idx].flags = 0; + SetSeqinfoString(&(sqinfo[idx]), + msa->sqname[idx], SQINFO_NAME); + SetSeqinfoString(&(sqinfo[idx]), + MSAGetSeqAccession(msa, idx), SQINFO_ACC); + SetSeqinfoString(&(sqinfo[idx]), + MSAGetSeqDescription(msa, idx), SQINFO_DESC); + + if (msa->ss != NULL && msa->ss[idx] != NULL) { + MakeDealignedString(msa->aseq[idx], msa->alen, + msa->ss[idx], &(sqinfo[idx].ss)); + sqinfo[idx].flags |= SQINFO_SS; + } + + if (msa->sa != NULL && msa->sa[idx] != NULL) { + MakeDealignedString(msa->aseq[idx], msa->alen, + msa->sa[idx], &(sqinfo[idx].sa)); + sqinfo[idx].flags |= SQINFO_SA; + } + + sqinfo[idx].len = DealignedLength(msa->aseq[idx]); + sqinfo[idx].flags |= SQINFO_LEN; + } + return sqinfo; +} + + + +/* cc -o sqio_test -DA_QUIET_DAY -L. sqio.c -lsquid */ +#ifdef A_QUIET_DAY +#include "ssi.h" +int +main(int argc, char **argv) +{ + FILE *fp; + char *filename; + char *buf; + int len; + int mode = 3; + SSIOFFSET off; + + filename = argv[1]; + + if (mode == 1) { + buf = malloc(sizeof(char) * 256); + if ((fp = fopen(filename, "r")) == NULL) + Die("open of %s failed", filename); + while (fgets(buf, 255, fp) != NULL) + ; + fclose(fp); + free(buf); + } else if (mode == 2) { + if ((fp = fopen(filename, "r")) == NULL) + Die("open of %s failed", filename); + buf = NULL; len = 0; + while (sre_fgets(&buf, &len, fp) != NULL) + SSIGetFilePosition(fp, SSI_OFFSET_I32, &off); + fclose(fp); + free(buf); + } else if (mode == 3) { + SQFILE *dbfp; + SQINFO info; + + if ((dbfp = SeqfileOpen(filename, SQFILE_FASTA, NULL)) == NULL) + Die("open of %s failed", filename); + while (ReadSeq(dbfp, dbfp->format, &buf, &info)) { + SSIGetFilePosition(dbfp->f, SSI_OFFSET_I32, &off); + FreeSequence(buf, &info); + } + SeqfileClose(dbfp); + } + +} + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/squid.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,531 @@ +/* Generated automatically from squid.h.in by configure. */ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +#ifndef SQUIDH_INCLUDED +#define SQUIDH_INCLUDED + +/* squid.h + * Header file for my library of sequence functions. + * + * CVS $Id: squid.h.in,v 1.5 2002/10/09 14:26:09 eddy Exp) + */ + +#include <stdio.h> +#include <math.h> +#include <stdlib.h> +#include <unistd.h> /* for sysconf() #define's */ + + +#if DEBUGLEVEL > 0 +#include <assert.h> /* for SQD_DASSERT1(), etc. */ +#endif + +/* include clustal's config.h */ +#ifdef CLUSTALO +#include "config.h" +#define CLUSTALO 1 +#else +#include "clustal-omega-config.h" +#define CLUSTALO 1 +#endif + +#ifdef CLUSTALO +/* we don't want squidconf.h but our own config header. but, there are + * some checks, espcially at the end of squidconf.h might be + * necessary for squid to work. They follow after the inclusion of + * config.h + */ +#undef DEBUG + +/* squidconf.h checks: + */ +#if defined HAVE_NTOHL && defined HAVE_NTOHS && defined HAVE_HTONS && defined HAVE_HTONL +#define USE_HOST_BYTESWAP_FUNCTIONS 1 +#endif +/* On 64-bit machines like Alphas, strtoull doesn't exist, strotul will work + */ +#if SIZEOF_UNSIGNED_LONG == 8 && defined HAVE_STRTOUL && ! defined HAVE_STRTOULL +#define strtoull strtoul +#endif + +#if defined HAVE_FTELLO && defined HAVE_FSEEKO && SIZEOF_OFF_T == 8 +#define HAS_64BIT_FILE_OFFSETS 1 +#elif defined HAVE_FTELLO64 && defined HAVE_FSEEKO64 && SIZEOF_OFF64_T == 8 +#define HAS_64BIT_FILE_OFFSETS 1 +#elif defined HAVE_FTELL64 && defined HAVE_FSEEK64 +#define HAS_64BIT_FILE_OFFSETS 1 +#elif defined ARITHMETIC_FPOS_T && SIZEOF_FPOS_T == 8 +#define HAS_64BIT_FILE_OFFSETS 1 +#else +#undef HAS_64BIT_FILE_OFFSETS +#endif + +/* The following check seems like nonsense to me (AW), therefore */ +#if 0 +/* Stuff to work around Tru64 not having strtoull() - + * on systems with 64-bit longs, we can use strtoul() + */ +#undef HAVE_STRTOULL +#if ! defined HAVE_STRTOULL && SIZEOF_UNSIGNED_LONG == 8 +#define strtoull strtoul +#endif +#endif + +#else /* CLUSTALO */ +#include "squidconf.h" /* #define's generated by ./configure script */ +#endif + +/***************************************************************** + * Integers of guaranteed size. (used for instance in gsi.c, gsi2.c) + * These are set by the ./configure script; if they show up as FIXME, + * they must be manually edited to appropriate type definitions. You + * do need 64-bit integers in the current code; email me if this + * prevents you from compiling SQUID and tell me your system (I don't + * know of any systems that don't have 64-bit integers these days). + *****************************************************************/ +typedef unsigned short sqd_uint16; +typedef unsigned int sqd_uint32; +typedef unsigned long sqd_uint64; + +#ifdef USE_HOST_BYTESWAP_FUNCTIONS +#include <sys/types.h> /* only for ntohl() and friends. */ +#include <netinet/in.h> /* only for ntohl() and friends. */ +#define sre_ntoh16(x) ntohs(x); +#define sre_ntoh32(x) ntohl(x); +#define sre_hton16(x) htons(x); +#define sre_hton32(x) htonl(x); +#endif /* USE_HOST_BYTESWAP_FUNCTIONS */ + +/* Library version info is made available as a global to + * any interested program. These are defined in iupac.c + * with the other globals. + */ +extern char squid_version[]; /* version number */ +extern char squid_date[]; /* date of release */ +extern int squid_errno; /* error codes */ + + + +/**************************************************** + * Error codes returned by squid library functions (squid_errno) + ****************************************************/ + +#define SQERR_OK 0 /* no error */ +#define SQERR_UNKNOWN 1 /* generic error, unidentified */ +#define SQERR_NODATA 2 /* unexpectedly NULL stream */ +#define SQERR_MEM 3 /* malloc or realloc failed */ +#define SQERR_NOFILE 4 /* file not found */ +#define SQERR_FORMAT 5 /* file format not recognized */ +#define SQERR_PARAMETER 6 /* bad parameter passed to func */ +#define SQERR_DIVZERO 7 /* error in sre_math.c */ +#define SQERR_INCOMPAT 8 /* incompatible parameters */ +#define SQERR_EOD 9 /* end-of-data (often normal) */ + +/**************************************************** + * Single sequence information + ****************************************************/ +#define SQINFO_NAMELEN 64 +#define SQINFO_DESCLEN 128 + +struct seqinfo_s { + int flags; /* what extra data are available */ + char name[SQINFO_NAMELEN];/* up to 63 characters of name */ + char id[SQINFO_NAMELEN]; /* up to 63 char of database identifier */ + char acc[SQINFO_NAMELEN]; /* up to 63 char of database accession # */ + char desc[SQINFO_DESCLEN];/* up to 127 char of description */ + int len; /* length of this seq */ + int start; /* (1..len) start position on source seq */ + int stop; /* (1..len) end position on source seq */ + int olen; /* original length of source seq */ + int type; /* kRNA, kDNA, kAmino, or kOther */ + char *ss; /* 0..len-1 secondary structure string */ + char *sa; /* 0..len-1 % side chain surface access. */ +}; +typedef struct seqinfo_s SQINFO; + +#define SQINFO_NAME (1 << 0) +#define SQINFO_ID (1 << 1) +#define SQINFO_ACC (1 << 2) +#define SQINFO_DESC (1 << 3) +#define SQINFO_START (1 << 4) +#define SQINFO_STOP (1 << 5) +#define SQINFO_LEN (1 << 6) +#define SQINFO_TYPE (1 << 7) +#define SQINFO_OLEN (1 << 8) +#define SQINFO_SS (1 << 9) +#define SQINFO_SA (1 << 10) + + +/**************************************************** + * Sequence alphabet: see also iupac.c + ****************************************************/ + /* IUPAC symbols defined globally in iupac.c */ +struct iupactype { + char sym; /* character representation */ + char symcomp; /* complement (regular char */ + char code; /* my binary rep */ + char comp; /* binary encoded complement */ +}; +extern struct iupactype iupac[]; +#define IUPACSYMNUM 17 + +extern char *stdcode1[]; /* 1-letter amino acid translation code */ +extern char *stdcode3[]; /* 3-letter amino acid translation code */ +extern float dnafq[]; /* nucleotide occurrence frequencies */ +extern float aafq[]; /* amino acid occurrence frequencies */ +extern char aa_alphabet[]; /* amino acid alphabet */ +extern int aa_index[]; /* convert 0..19 indices to 0..26 */ + + /* valid symbols in IUPAC code */ +#define NUCLEOTIDES "ACGTUNRYMKSWHBVDacgtunrymkswhbvd" +#define AMINO_ALPHABET "ACDEFGHIKLMNPQRSTVWY" +#define DNA_ALPHABET "ACGT" +#define RNA_ALPHABET "ACGU" +#define WHITESPACE " \t\n" + +#define isgap(c) ((c) == ' ' || (c) == '.' || (c) == '_' || (c) == '-' || (c) == '~') + + +/**************************************************** + * Sequence i/o: originally from Don Gilbert's readseq + ****************************************************/ +#include "msa.h" /* for multiple sequence alignment support */ + + /* buffer size for reading in lines from sequence files*/ +#define LINEBUFLEN 4096 + +/* sequence types parsed by Seqtype() */ +/* note that these must match hmmAMINO and hmmNUCLEIC in HMMER */ +#define kOtherSeq 0 /* hmmNOTSETYET */ +#define kDNA 1 +#define kRNA 2 /* hmmNUCLEIC */ +#define kAmino 3 /* hmmAMINO */ + +/* Unaligned sequence file formats recognized + * Coexists with definitions of multiple alignment formats in msa.h: + * >100 reserved for alignment formats + * <100 reserved for unaligned formats + * 0 reserved for unknown + * + * Some "legacy" formats are supported only when explicitly + * requested; not autodetected by SeqfileFormat(). + * + * DON'T REASSIGN THESE CODES. They're written into + * GSI index files. You can use new ones, but reassigning + * the sense of old ones will break GSI indices. + * Alignment format codes were reassigned with the creation + * of msa.c, but before Stockholm format, there were no + * indexed alignment databases. + */ +#define SQFILE_UNKNOWN 0 /* unknown format */ +#define SQFILE_IG 1 /* Intelligenetics (!) */ +#define SQFILE_GENBANK 2 /* GenBank flatfile */ + /* 3 was A2M. Now an alignment format */ +#define SQFILE_EMBL 4 /* EMBL or Swissprot flatfile */ +#define SQFILE_GCG 5 /* GCG single sequence files */ +#define SQFILE_STRIDER 6 /* MacStrider (!!) */ +#define SQFILE_FASTA 7 /* FASTA format: default */ +#define SQFILE_ZUKER 8 /* Zuker MFOLD format (legacy) */ +#define SQFILE_IDRAW 9 /* Idraw-style PostScript (legacy) */ + /* 10 was SELEX. Now alignment format */ + /* 11 was MSF. Now alignment format */ +#define SQFILE_PIR 12 /* PIR format */ +#define SQFILE_RAW 13 /* raw sequence */ +#define SQFILE_SQUID 14 /* my obsolete squid format */ + /* 15 was kXPearson, extended FASTA; withdrawn */ +#define SQFILE_GCGDATA 16 /* GCG data library file */ + /* 17 was Clustal. Now alignment format*/ +#ifdef CLUSTALO +#define SQFILE_VIENNA 18 /* Vienna format: concatenated fasta */ +#endif +#define IsUnalignedFormat(fmt) ((fmt) && (fmt) < 100) + +#include "ssi.h" + +struct ReadSeqVars { + FILE *f; /* open file pointer */ + char *fname; /* name of file; used for diagnostics */ + int linenumber; /* what line are we on in the file */ + + char *buf; /* dynamically allocated sre_fgets() buffer */ + int buflen; /* allocation length for buf */ + + int ssimode; /* SSI_OFFSET_I32 or SSI_OFFSET_I64 */ + SSIOFFSET ssioffset; /* disk offset to last line read into buf */ + SSIOFFSET r_off; /* offset to start of record */ + SSIOFFSET d_off; /* offset to start of sequence data */ + + int rpl; /* residues per data line for this file; -1 if unset, 0 if invalid */ + int lastrpl; /* rpl on last line seen */ + int maxrpl; /* max rpl on any line of the file */ + int bpl; /* bytes per data line; -1 if unset, 0 if invalid */ + int lastbpl; /* bpl on last line seen */ + int maxbpl; /* max bpl on any line of the file */ + + char *seq; /* growing sequence during parse */ + SQINFO *sqinfo; /* name, id, etc, gathered during parse */ + char *sp; + int seqlen; /* current sequence length */ + int maxseq; /* current allocation length for seq */ + + int format; /* format of seqfile we're reading. */ + int do_gzip; /* TRUE if f is a pipe from gzip -dc */ + int do_stdin; /* TRUE if f is stdin */ + + /* An (important) hack for sequential access of multiple alignment files: + * we read the whole alignment in, + * and then copy it one sequence at a time into seq and sqinfo. + * It is active if msa is non NULL. + * msa->lastidx is reused/overloaded: used to keep track of what + * seq we'll return next. + * afp->format is the real format, while SQFILE->format is kMSA. + * Because we keep it in the SQFILE structure, + * ReadSeq() and friends are always reentrant for multiple seqfiles. + */ + MSA *msa; + MSAFILE *afp; +}; +typedef struct ReadSeqVars SQFILE; + + +/**************************************************** + * Cluster analysis and phylogenetic tree support + ****************************************************/ + +/* struct phylo_s - a phylogenetic tree + * + * For N sequences, there will generally be an array of 0..N-2 + * phylo_s structures representing the nodes of a tree. + * [0] is the root. The indexes of left and + * right children are somewhat confusing so be careful. The + * indexes can have values of 0..2N-2. If they are 0..N-1, they + * represent pointers to individual sequences. If they are + * >= N, they represent pointers to a phylo_s structure + * at (index - N). + */ +struct phylo_s { + int parent; /* index of parent, N..2N-2, or -1 for root */ + int left; /* index of one of the branches, 0..2N-2 */ + int right; /* index of other branch, 0..2N-2 */ + float diff; /* difference score between seqs */ + float lblen; /* left branch length */ + float rblen; /* right branch length */ + char *is_in; /* 0..N-1 flag array, 1 if seq included */ + int incnum; /* number of seqs included at this node */ +}; + + +/* Strategies for cluster analysis; cluster by mean distance, + * minimum distance, or maximum distance. + */ +enum clust_strategy { CLUSTER_MEAN, CLUSTER_MAX, CLUSTER_MIN }; + +/**************************************************** + * Generic data structure support + ****************************************************/ + +/* a struct intstack_s implements a pushdown stack for storing + * single integers. + */ +struct intstack_s { + int data; + struct intstack_s *nxt; +}; + +/**************************************************** + * Binary nucleotide alphabet support + ****************************************************/ + +/* Binary encoding of the IUPAC code for nucleotides + * + * four-bit "word", permitting rapid degenerate matching + * A C G T/U + * 0 0 1 0 + */ +#define NTA 8 +#define NTC 4 +#define NTG 2 +#define NTT 1 +#define NTU 1 +#define NTN 15 /* A|C|G|T */ +#define NTR 10 /* A|G */ +#define NTY 5 /* C|T */ +#define NTM 12 /* A|C */ +#define NTK 3 /* G|T */ +#define NTS 6 /* C|G */ +#define NTW 9 /* A|T */ +#define NTH 13 /* A|C|T */ +#define NTB 7 /* C|G|T */ +#define NTV 14 /* A|C|G */ +#define NTD 11 /* A|G|T */ +#define NTGAP 16 /* GAP */ +#define NTEND 0 /* null string terminator */ + +/* ntmatch(): bitwise comparison of two nuc's + * note that it's sensitive to the order; + * probe may be degenerate but target should not be + */ +#define ntmatch(probe, target) ((probe & target) == target) + +/**************************************************** + * Support for a portable, flexible Getopt() + ****************************************************/ + +/* Structure: opt_s + * + * Structure for declaring options to a main(). + */ +struct opt_s { + char *name; /* name of option, e.g. "--option1" or "-o" */ + int single; /* TRUE if a single letter option */ + int argtype; /* for typechecking, e.g. sqdARG_INT */ +}; + /* acceptable argtype's... */ +#define sqdARG_NONE 0 /* no argument */ +#define sqdARG_INT 1 /* something that atoi() can grok */ +#define sqdARG_FLOAT 2 /* something that atof() can grok */ +#define sqdARG_CHAR 3 /* require single character or digit */ +#define sqdARG_STRING 4 /* anything goes */ + +/**************************************************** + * Support for convenient Perl-y regexp matching + * See hsregexp.c for copyright notice: this code is derived + * from Henry Spencer's freely distributed regexp library. + ****************************************************/ + +#define NSUBEXP 10 +typedef struct sqd_regexp { + char *startp[NSUBEXP]; + char *endp[NSUBEXP]; + char regstart; /* Internal use only. */ + char reganch; /* Internal use only. */ + char *regmust; /* Internal use only. */ + int regmlen; /* Internal use only. */ + char program[1]; /* Unwarranted chumminess with compiler. */ +} sqd_regexp; + +/* Strparse() defines and manages these. + * sqd_parse[0] contains the substring that matched the pattern. + * sqd_parse[1-9] contain substrings matched with ()'s. + */ +extern char *sqd_parse[10]; + +/**************************************************** + * Portable detection of multiprocessor # of CPUs. + * #include <unistd.h> + * long foo = SQD_NPROC; + * returns the number of available processors. + * if foo == -1, we failed. + ****************************************************/ + +/* Our problem here is that POSIX apparently doesn't specify + * a standard for how to get sysconf() to report the number of + * processors on-line. _SC_NPROCESSORS_ONLN is specified + * by SVR4.0MP. Thanks to W. Gish for help here. + */ +#undef SQD_NPROC +#ifdef _SC_NPROCESSORS_ONLN /* Sun Solaris, Digital UNIX */ +#define SQD_NPROC sysconf(_SC_NPROCESSORS_ONLN) +#else +#ifdef _SC_NPROC_ONLN /* Silicon Graphics IRIX */ +#define SQD_NPROC sysconf(_SC_NPROC_ONLN) +#else /* FreeBSD, Linux don't support getting ncpu via sysconf() */ +#define SQD_NPROC -1 +#endif +#endif + +/**************************************************** + * Three levels of debugging printf's and assert's + * level 1: little impact on verbosity or performance + * level 2: moderate impact + * level 3: high impact + * Example: + * SQD_DPRINTF3(("Matrix row %d col %d = %f\n", i, j, val)); + * Note the double parentheses; these are important. + ****************************************************/ + +#ifndef DEBUGLEVEL +#define DEBUGLEVEL 0 +#endif + +#if (DEBUGLEVEL >= 1) +#define SQD_DPRINTF1(x) printf x +#define SQD_DASSERT1(x) assert x +#else +#define SQD_DPRINTF1(x) +#define SQD_DASSERT1(x) +#endif +#if (DEBUGLEVEL >= 2) +#define SQD_DPRINTF2(x) printf x +#define SQD_DASSERT2(x) assert x +#else +#define SQD_DPRINTF2(x) +#define SQD_DASSERT2(x) +#endif +#if (DEBUGLEVEL >= 3) +#define SQD_DPRINTF3(x) printf x +#define SQD_DASSERT3(x) assert x +#else +#define SQD_DPRINTF3(x) +#define SQD_DASSERT3(x) +#endif + +/* PANIC is called for failures of Std C/POSIX functions, + * instead of my own functions. Panic() calls perror() and exits + * abnormally. + */ +#define PANIC Panic(__FILE__, __LINE__) + +/* Malloc/realloc calls are wrapped + */ +#define MallocOrDie(x) sre_malloc(__FILE__, __LINE__, (x)) +#define ReallocOrDie(x,y) sre_realloc(__FILE__, __LINE__, (x), (y)) + +/**************************************************** + * Miscellaneous macros and defines + ****************************************************/ + +#define SQDCONST_E 2.71828182845904523536028747135 +#define SQDCONST_PI 3.14159265358979323846264338328 + + /* must declare swapfoo to use SWAP() */ +#define SWAP(a,b) {swapfoo = b; b = a; a = swapfoo;} +#define ScalarsEqual(a,b) (fabs((a)-(b)) < 1e-7) + +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +/* For convenience and (one hopes) clarity in boolean tests: + */ +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +/* Somewhere, there is a universe in which Unix vendors comply + * with the ANSI C standard. Unfortunately, it is not ours: + */ +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif +#ifndef EXIT_FAILURE +#define EXIT_FAILURE 1 +#endif + +#include "sqfuncs.h" /* squid function declarations */ +#include "sre_random.h" /* random number generator and samplers */ +#include "vectorops.h" /* vector operations */ +#endif /* SQUIDH_INCLUDED */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/squidcore.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,52 @@ +/************************************************************ + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + ************************************************************/ + +/* squidcore.c + * SRE, Sun Jun 20 17:19:04 1999 [Graeme's kitchen] + * + * Core functions for SQUID library. + * RCS $Id: squidcore.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: squidcore.c,v 1.1 1999/07/15 22:24:41 eddy Exp) + */ + +#include <stdio.h> +#include "version.h" + +/* Function: Banner() + * Date: SRE, Sun Jun 20 17:19:41 1999 [Graeme's kitchen] + * + * Purpose: Print a package version and copyright banner. + * Used by all the main()'s. + * + * Expects to be able to pick up defined macros: + * macro example + * ------ -------------- + * PACKAGE "HMMER" + * RELEASE "2.0.42" + * RELEASEDATE "April 1 1999" + * COPYRIGHT "Copyright (C) 1992-1999 Washington University School of Medicine" + * LICENSE "HMMER is freely distributed under the GNU General Public License (GPL)." + * + * This gives us a general mechanism to update release information + * without changing multiple points in the code; we can also override + * SQUID release data with another package's release data (e.g. + * HMMER) just by redefining macros. + * + * Args: fp - where to print it + * banner - one-line program description, e.g.: + * "foobar - make bars from foo with elan" + * Returns: (void) + */ +void +Banner(FILE *fp, char *banner) +{ + fprintf(fp, "%s\n%s %s (%s)\n%s\n%s\n", banner, PACKAGE, RELEASE, RELEASEDATE, COPYRIGHT, LICENSE); + fprintf(fp, "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n"); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/sre_ctype.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,34 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* sre_ctype.c + * + * For portability. Some systems have functions tolower, toupper + * as macros (for instance, MIPS M-2000 RISC/os!) + * + * RCS $Id: sre_ctype.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: sre_ctype.c,v 1.3 2001/09/02 23:43:19 eddy Exp) + */ + +#include <ctype.h> +#include "squid.h" + +int +sre_tolower(int c) +{ + if (isupper(c)) return tolower(c); + else return c; +} + +int +sre_toupper(int c) +{ + if (islower(c)) return toupper(c); + else return c; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/sre_math.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,331 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* sre_math.c + * + * Portability for and extensions to C math library. + * RCS $Id: sre_math.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: sre_math.c,v 1.12 2002/10/09 14:26:09 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include "squid.h" + + +/* Function: Linefit() + * + * Purpose: Given points x[0..N-1] and y[0..N-1], fit to + * a straight line y = a + bx. + * a, b, and the linear correlation coefficient r + * are filled in for return. + * + * Args: x - x values of data + * y - y values of data + * N - number of data points + * ret_a - RETURN: intercept + * ret_b - RETURN: slope + * ret_r - RETURN: correlation coefficient + * + * Return: 1 on success, 0 on failure. + */ +int +Linefit(float *x, float *y, int N, float *ret_a, float *ret_b, float *ret_r) +{ + float xavg, yavg; + float sxx, syy, sxy; + int i; + + /* Calculate averages, xavg and yavg + */ + xavg = yavg = 0.0; + for (i = 0; i < N; i++) + { + xavg += x[i]; + yavg += y[i]; + } + xavg /= (float) N; + yavg /= (float) N; + + sxx = syy = sxy = 0.0; + for (i = 0; i < N; i++) + { + sxx += (x[i] - xavg) * (x[i] - xavg); + syy += (y[i] - yavg) * (y[i] - xavg); + sxy += (x[i] - xavg) * (y[i] - yavg); + } + *ret_b = sxy / sxx; + *ret_a = yavg - xavg*(*ret_b); + *ret_r = sxy / (sqrt(sxx) * sqrt(syy)); + return 1; +} + + +/* Function: WeightedLinefit() + * + * Purpose: Given points x[0..N-1] and y[0..N-1] with + * variances (measurement errors) var[0..N-1], + * fit to a straight line y = mx + b. + * + * Method: Algorithm from Numerical Recipes in C, [Press88]. + * + * Return: (void) + * ret_m contains slope; ret_b contains intercept + */ +void +WeightedLinefit(float *x, float *y, float *var, int N, float *ret_m, float *ret_b) +{ + int i; + double s; + double sx, sy; + double sxx, sxy; + double delta; + double m, b; + + s = sx = sy = sxx = sxy = 0.; + for (i = 0; i < N; i++) + { + s += 1./var[i]; + sx += x[i] / var[i]; + sy += y[i] / var[i]; + sxx += x[i] * x[i] / var[i]; + sxy += x[i] * y[i] / var[i]; + } + + delta = s * sxx - (sx * sx); + b = (sxx * sy - sx * sxy) / delta; + m = (s * sxy - sx * sy) / delta; + + *ret_m = m; + *ret_b = b; +} + + +/* Function: Gammln() + * + * Returns the natural log of the gamma function of x. + * x is > 0.0. + * + * Adapted from a public domain implementation in the + * NCBI core math library. Thanks to John Spouge and + * the NCBI. (According to the NCBI, that's Dr. John + * "Gammas Galore" Spouge to you, pal.) + */ +double +Gammln(double x) +{ + int i; + double xx, tx; + double tmp, value; + static double cof[11] = { + 4.694580336184385e+04, + -1.560605207784446e+05, + 2.065049568014106e+05, + -1.388934775095388e+05, + 5.031796415085709e+04, + -9.601592329182778e+03, + 8.785855930895250e+02, + -3.155153906098611e+01, + 2.908143421162229e-01, + -2.319827630494973e-04, + 1.251639670050933e-10 + }; + + /* Protect against x=0. We see this in Dirichlet code, + * for terms alpha = 0. This is a severe hack but it is effective + * and (we think?) safe. (due to GJM) + */ + if (x <= 0.0) return 999999.; + + xx = x - 1.0; + tx = tmp = xx + 11.0; + value = 1.0; + for (i = 10; i >= 0; i--) /* sum least significant terms first */ + { + value += cof[i] / tmp; + tmp -= 1.0; + } + value = log(value); + tx += 0.5; + value += 0.918938533 + (xx+0.5)*log(tx) - tx; + return value; +} + + +/* 2D matrix operations + */ +float ** +FMX2Alloc(int rows, int cols) +{ + float **mx; + int r; + + mx = (float **) MallocOrDie(sizeof(float *) * rows); + mx[0] = (float *) MallocOrDie(sizeof(float) * rows * cols); + for (r = 1; r < rows; r++) + mx[r] = mx[0] + r*cols; + return mx; +} +void +FMX2Free(float **mx) +{ + free(mx[0]); + free(mx); +} +double ** +DMX2Alloc(int rows, int cols) +{ + double **mx; + int r; + + mx = (double **) MallocOrDie(sizeof(double *) * rows); + mx[0] = (double *) MallocOrDie(sizeof(double) * rows * cols); + for (r = 1; r < rows; r++) + mx[r] = mx[0] + r*cols; + return mx; +} +void +DMX2Free(double **mx) +{ + free(mx[0]); + free(mx); +} +/* Function: FMX2Multiply() + * + * Purpose: Matrix multiplication. + * Multiply an m x p matrix A by a p x n matrix B, + * giving an m x n matrix C. + * Matrix C must be a preallocated matrix of the right + * size. + */ +void +FMX2Multiply(float **A, float **B, float **C, int m, int p, int n) +{ + int i, j, k; + + for (i = 0; i < m; i++) + for (j = 0; j < n; j++) + { + C[i][j] = 0.; + for (k = 0; k < p; k++) + C[i][j] += A[i][p] * B[p][j]; + } +} + + +/* Function: IncompleteGamma() + * + * Purpose: Returns 1 - P(a,x) where: + * P(a,x) = \frac{1}{\Gamma(a)} \int_{0}^{x} t^{a-1} e^{-t} dt + * = \frac{\gamma(a,x)}{\Gamma(a)} + * = 1 - \frac{\Gamma(a,x)}{\Gamma(a)} + * + * Used in a chi-squared test: for a X^2 statistic x + * with v degrees of freedom, call: + * p = IncompleteGamma(v/2., x/2.) + * to get the probability p that a chi-squared value + * greater than x could be obtained by chance even for + * a correct model. (i.e. p should be large, say + * 0.95 or more). + * + * Method: Based on ideas from Numerical Recipes in C, Press et al., + * Cambridge University Press, 1988. + * + * Args: a - for instance, degrees of freedom / 2 [a > 0] + * x - for instance, chi-squared statistic / 2 [x >= 0] + * + * Return: 1 - P(a,x). + */ +double +IncompleteGamma(double a, double x) +{ + int iter; /* iteration counter */ + + if (a <= 0.) Die("IncompleteGamma(): a must be > 0"); + if (x < 0.) Die("IncompleteGamma(): x must be >= 0"); + + /* For x > a + 1 the following gives rapid convergence; + * calculate 1 - P(a,x) = \frac{\Gamma(a,x)}{\Gamma(a)}: + * use a continued fraction development for \Gamma(a,x). + */ + if (x > a+1) + { + double oldp; /* previous value of p */ + double nu0, nu1; /* numerators for continued fraction calc */ + double de0, de1; /* denominators for continued fraction calc */ + + nu0 = 0.; /* A_0 = 0 */ + de0 = 1.; /* B_0 = 1 */ + nu1 = 1.; /* A_1 = 1 */ + de1 = x; /* B_1 = x */ + + oldp = nu1; + for (iter = 1; iter < 100; iter++) + { + /* Continued fraction development: + * set A_j = b_j A_j-1 + a_j A_j-2 + * B_j = b_j B_j-1 + a_j B_j-2 + * We start with A_2, B_2. + */ + /* j = even: a_j = iter-a, b_j = 1 */ + /* A,B_j-2 are in nu0, de0; A,B_j-1 are in nu1,de1 */ + nu0 = nu1 + ((double)iter - a) * nu0; + de0 = de1 + ((double)iter - a) * de0; + + /* j = odd: a_j = iter, b_j = x */ + /* A,B_j-2 are in nu1, de1; A,B_j-1 in nu0,de0 */ + nu1 = x * nu0 + (double) iter * nu1; + de1 = x * de0 + (double) iter * de1; + + /* rescale */ + if (de1 != 0.) + { + nu0 /= de1; + de0 /= de1; + nu1 /= de1; + de1 = 1.; + } + /* check for convergence */ + if (fabs((nu1-oldp)/nu1) < 1.e-7) + return nu1 * exp(a * log(x) - x - Gammln(a)); + + oldp = nu1; + } + Die("IncompleteGamma(): failed to converge using continued fraction approx"); + } + else /* x <= a+1 */ + { + double p; /* current sum */ + double val; /* current value used in sum */ + + /* For x <= a+1 we use a convergent series instead: + * P(a,x) = \frac{\gamma(a,x)}{\Gamma(a)}, + * where + * \gamma(a,x) = e^{-x}x^a \sum_{n=0}{\infty} \frac{\Gamma{a}}{\Gamma{a+1+n}} x^n + * which looks appalling but the sum is in fact rearrangeable to + * a simple series without the \Gamma functions: + * = \frac{1}{a} + \frac{x}{a(a+1)} + \frac{x^2}{a(a+1)(a+2)} ... + * and it's obvious that this should converge nicely for x <= a+1. + */ + + p = val = 1. / a; + for (iter = 1; iter < 10000; iter++) + { + val *= x / (a+(double)iter); + p += val; + + if (fabs(val/p) < 1.e-7) + return 1. - p * exp(a * log(x) - x - Gammln(a)); + } + Die("IncompleteGamma(): failed to converge using series approx"); + } + /*NOTREACHED*/ + return 0.; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/sre_random.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,313 @@ +/* sre_random.c + * + * Portable random number generator, and sampling routines. + * + * SRE, Tue Oct 1 15:24:11 2002 [St. Louis] + * CVS $Id: sre_random.c,v 1.1 2002/10/09 14:26:09 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include "sre_random.h" + +static int sre_randseed = 42; /* default seed for sre_random() */ + +/* Function: sre_random() + * + * Purpose: Return a uniform deviate x, 0.0 <= x < 1.0. + * + * sre_randseed is a static variable, set + * by sre_srandom(). When it is non-zero, + * we re-seed. + * + * Implements L'Ecuyer's algorithm for combining output + * of two linear congruential generators, plus a Bays-Durham + * shuffle. This is essentially ran2() from Numerical Recipes, + * sans their nonhelpful Rand/McNally-esque code obfuscation. + * + * Overflow errors are avoided by Schrage's algorithm: + * az % m = a(z%q) - r(z/q) (+m if <0) + * where q=m/a, r=m%a + * + * Requires that long int's have at least 32 bits. + * This function uses statics and is NOT THREADSAFE. + * + * Reference: Press et al. Numerical Recipes in C, 1992. + * + * Reliable and portable, but slow. Benchmarks on wrasse, + * using Linux gcc and Linux glibc rand() (see randspeed, in Testsuite): + * sre_random(): 0.5 usec/call + * rand(): 0.2 usec/call + */ +double +sre_random(void) +{ + static long rnd1; /* random number from LCG1 */ + static long rnd2; /* random number from LCG2 */ + static long rnd; /* random number we return */ + static long tbl[64]; /* table for Bays/Durham shuffle */ + long x,y; + int i; + + /* Magic numbers a1,m1, a2,m2 from L'Ecuyer, for 2 LCGs. + * q,r derive from them (q=m/a, r=m%a) and are needed for Schrage's algorithm. + */ + long a1 = 40014; + long m1 = 2147483563; + long q1 = 53668; + long r1 = 12211; + + long a2 = 40692; + long m2 = 2147483399; + long q2 = 52774; + long r2 = 3791; + + if (sre_randseed > 0) + { + rnd1 = sre_randseed; + rnd2 = sre_randseed; + /* Fill the table for Bays/Durham */ + for (i = 0; i < 64; i++) { + x = a1*(rnd1%q1); /* LCG1 in action... */ + y = r1*(rnd1/q1); + rnd1 = x-y; + if (rnd1 < 0) rnd1 += m1; + + x = a2*(rnd2%q2); /* LCG2 in action... */ + y = r2*(rnd2/q2); + rnd2 = x-y; + if (rnd2 < 0) rnd2 += m2; + + tbl[i] = rnd1-rnd2; + if (tbl[i] < 0) tbl[i] += m1; + } + sre_randseed = 0; /* drop the flag. */ + }/* end of initialization*/ + + + x = a1*(rnd1%q1); /* LCG1 in action... */ + y = r1*(rnd1/q1); + rnd1 = x-y; + if (rnd1 < 0) rnd1 += m1; + + x = a2*(rnd2%q2); /* LCG2 in action... */ + y = r2*(rnd2/q2); + rnd2 = x-y; + if (rnd2 < 0) rnd2 += m2; + + /* Choose our random number from the table... */ + i = (int) (((double) rnd / (double) m1) * 64.); + rnd = tbl[i]; + /* and replace with a new number by L'Ecuyer. */ + tbl[i] = rnd1-rnd2; + if (tbl[i] < 0) tbl[i] += m1; + + return ((double) rnd / (double) m1); +} + +/* Function: sre_srandom() + * + * Purpose: Initialize with a random seed. Seed must be + * >= 0 to work; we silently enforce this. + */ +void +sre_srandom(int seed) +{ + if (seed < 0) seed = -1 * seed; + if (seed == 0) seed = 42; + sre_randseed = seed; +} + +/* Function: sre_random_positive() + * Date: SRE, Wed Apr 17 13:34:32 2002 [St. Louis] + * + * Purpose: Assure 0 < x < 1 (positive uniform deviate) + */ +double +sre_random_positive(void) +{ + double x; + do { x = sre_random(); } while (x == 0.0); + return x; +} + +/* Function: ExponentialRandom() + * Date: SRE, Mon Sep 6 21:24:29 1999 [St. Louis] + * + * Purpose: Pick an exponentially distributed random variable + * 0 > x >= infinity + * + * Args: (void) + * + * Returns: x + */ +double +ExponentialRandom(void) +{ + double x; + + do x = sre_random(); while (x == 0.0); + return -log(x); +} + +/* Function: Gaussrandom() + * + * Pick a Gaussian-distributed random variable + * with some mean and standard deviation, and + * return it. + * + * Based on RANLIB.c public domain implementation. + * Thanks to the authors, Barry W. Brown and James Lovato, + * University of Texas, M.D. Anderson Cancer Center, Houston TX. + * Their implementation is from Ahrens and Dieter, "Extensions + * of Forsythe's method for random sampling from the normal + * distribution", Math. Comput. 27:927-937 (1973). + * + * Impenetrability of the code is to be blamed on its FORTRAN/f2c lineage. + * + */ +double +Gaussrandom(double mean, double stddev) +{ + static double a[32] = { + 0.0,3.917609E-2,7.841241E-2,0.11777,0.1573107,0.1970991,0.2372021,0.2776904, 0.3186394,0.36013,0.4022501,0.4450965,0.4887764,0.5334097,0.5791322, + 0.626099,0.6744898,0.7245144,0.7764218,0.8305109,0.8871466,0.9467818, + 1.00999,1.077516,1.150349,1.229859,1.318011,1.417797,1.534121,1.67594, + 1.862732,2.153875 + }; + static double d[31] = { + 0.0,0.0,0.0,0.0,0.0,0.2636843,0.2425085,0.2255674,0.2116342,0.1999243, + 0.1899108,0.1812252,0.1736014,0.1668419,0.1607967,0.1553497,0.1504094, + 0.1459026,0.14177,0.1379632,0.1344418,0.1311722,0.128126,0.1252791, + 0.1226109,0.1201036,0.1177417,0.1155119,0.1134023,0.1114027,0.1095039 + }; + static double t[31] = { + 7.673828E-4,2.30687E-3,3.860618E-3,5.438454E-3,7.0507E-3,8.708396E-3, + 1.042357E-2,1.220953E-2,1.408125E-2,1.605579E-2,1.81529E-2,2.039573E-2, + 2.281177E-2,2.543407E-2,2.830296E-2,3.146822E-2,3.499233E-2,3.895483E-2, + 4.345878E-2,4.864035E-2,5.468334E-2,6.184222E-2,7.047983E-2,8.113195E-2, + 9.462444E-2,0.1123001,0.136498,0.1716886,0.2276241,0.330498,0.5847031 + }; + static double h[31] = { + 3.920617E-2,3.932705E-2,3.951E-2,3.975703E-2,4.007093E-2,4.045533E-2, + 4.091481E-2,4.145507E-2,4.208311E-2,4.280748E-2,4.363863E-2,4.458932E-2, + 4.567523E-2,4.691571E-2,4.833487E-2,4.996298E-2,5.183859E-2,5.401138E-2, + 5.654656E-2,5.95313E-2,6.308489E-2,6.737503E-2,7.264544E-2,7.926471E-2, + 8.781922E-2,9.930398E-2,0.11556,0.1404344,0.1836142,0.2790016,0.7010474 + }; + static long i; + static double snorm,u,s,ustar,aa,w,y,tt; + + u = sre_random(); + s = 0.0; + if(u > 0.5) s = 1.0; + u += (u-s); + u = 32.0*u; + i = (long) (u); + if(i == 32) i = 31; + if(i == 0) goto S100; + /* + * START CENTER + */ + ustar = u-(double)i; + aa = *(a+i-1); +S40: + if(ustar <= *(t+i-1)) goto S60; + w = (ustar-*(t+i-1))**(h+i-1); +S50: + /* + * EXIT (BOTH CASES) + */ + y = aa+w; + snorm = y; + if(s == 1.0) snorm = -y; + return (stddev*snorm + mean); +S60: + /* + * CENTER CONTINUED + */ + u = sre_random(); + w = u*(*(a+i)-aa); + tt = (0.5*w+aa)*w; + goto S80; +S70: + tt = u; + ustar = sre_random(); +S80: + if(ustar > tt) goto S50; + u = sre_random(); + if(ustar >= u) goto S70; + ustar = sre_random(); + goto S40; +S100: + /* + * START TAIL + */ + i = 6; + aa = *(a+31); + goto S120; +S110: + aa += *(d+i-1); + i += 1; +S120: + u += u; + if(u < 1.0) goto S110; + u -= 1.0; +S140: + w = u**(d+i-1); + tt = (0.5*w+aa)*w; + goto S160; +S150: + tt = u; +S160: + ustar = sre_random(); + if(ustar > tt) goto S50; + u = sre_random(); + if(ustar >= u) goto S150; + u = sre_random(); + goto S140; +} + + +/* Functions: DChoose(), FChoose() + * + * Purpose: Make a random choice from a normalized distribution. + * DChoose() is for double-precision vectors; + * FChoose() is for single-precision float vectors. + * Returns the number of the choice. + */ +int +DChoose(double *p, int N) +{ + double roll; /* random fraction */ + double sum; /* integrated prob */ + int i; /* counter over the probs */ + + roll = sre_random(); + sum = 0.0; + for (i = 0; i < N; i++) + { + sum += p[i]; + if (roll < sum) return i; + } + return (int) (sre_random() * N); /* bulletproof */ +} +int +FChoose(float *p, int N) +{ + float roll; /* random fraction */ + float sum; /* integrated prob */ + int i; /* counter over the probs */ + + roll = sre_random(); + sum = 0.0; + for (i = 0; i < N; i++) + { + sum += p[i]; + if (roll < sum) return i; + } + return (int) (sre_random() * N); /* bulletproof */ +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/sre_random.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,18 @@ +/* sre_random.h + * Header file for sre_random.c + * + * SRE, Tue Oct 1 15:24:29 2002 + * CVS $Id: sre_random.h,v 1.1 2002/10/09 14:26:09 eddy Exp) + */ + +extern double sre_random(void); +extern void sre_srandom(int seed); +extern double sre_random_positive(void); +extern double ExponentialRandom(void); +extern double Gaussrandom(double mean, double stddev); +extern int DChoose(double *p, int N); +extern int FChoose(float *p, int N); + +#define CHOOSE(a) ((int) (sre_random() * (a))) + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/sre_string.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,523 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* sre_string.c + * + * my library of extra string functions. Some for portability + * across UNIXes + * + * RCS $Id: sre_string.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: sre_string.c,v 1.11 2001/06/07 16:59:37 eddy Exp) + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <ctype.h> +#include "squid.h" + +/* Function: Strdup() + * + * Purpose: Implementation of the common (but non-ANSI) function + * strdup(). Robust against being passed a NULL pointer. + * + */ +char * +Strdup(char *s) +{ + char *new; + if (s == NULL) return NULL; + if ((new = (char *) malloc (strlen(s) +1)) == NULL) return NULL; + strcpy(new, s); + return new; +} + +/* Function: StringChop() + * Date: SRE, Wed Oct 29 12:10:02 1997 [TWA 721] + * + * Purpose: Chop trailing whitespace off of a string. + */ +void +StringChop(char *s) +{ + int i; + + i = strlen(s) - 1; /* set i at last char in string */ + while (i >= 0 && isspace((int) s[i])) i--; /* i now at last non-whitespace char, or -1 */ + s[i+1] = '\0'; +} + +int +Strinsert(char *s1, /* string to insert a char into */ + char c, /* char to insert */ + int pos) /* position in s1 to insert c at */ +{ + char oldc; + char *s; + + for (s = s1 + pos; c; s++) + { + /* swap current char for inserted one */ + oldc = *s; /* pick up current */ + *s = c; /* put down inserted one */ + c = oldc; /* old becomes next to insert */ + } + *s = '\0'; + + return 1; +} + + +int +Strdelete(char *s1, /* string to delete a char from */ + int pos) /* position of char to delete 0..n-1 */ +{ + char *s; + + for (s = s1 + pos; *s; s++) + *s = *(s + 1); + + return 1; +} + +void +s2lower(char *s) +{ + for (; *s != '\0'; s++) + *s = sre_tolower((int) *s); +} + +void +s2upper(char *s) +{ + for (; *s != '\0'; s++) + *s = sre_toupper((int) *s); +} + + +void * +sre_malloc(char *file, int line, size_t size) +{ + void *ptr; + + SQD_DPRINTF3(("MALLOC: %d bytes (file %s line %d)\n", size, file, line)); + if ((ptr = malloc (size)) == NULL) + Die("malloc of %ld bytes failed: file %s line %d", size, file, line); + return ptr; +} + +void * +sre_realloc(char *file, int line, void *p, size_t size) +{ + void *ptr; + + if ((ptr = realloc(p, size)) == NULL) + Die("realloc of %ld bytes failed: file %s line %d", size, file, line); + return ptr; +} + + + +/* Function: Free2DArray(), Free3DArray() + * Date: SRE, Tue Jun 1 14:47:14 1999 [St. Louis] + * + * Purpose: Convenience functions for free'ing 2D + * and 3D pointer arrays. Tolerates any of the + * pointers being NULL, to allow "sparse" + * arrays. + * + * Args: p - array to be freed + * dim1 - n for first dimension + * dim2 - n for second dimension + * + * e.g. a 2d array is indexed p[0..dim1-1][] + * a 3D array is indexed p[0..dim1-1][0..dim2-1][] + * + * Returns: void + * + * Diagnostics: (void) + * "never fails" + */ +void +Free2DArray(void **p, int dim1) +{ + int i; + + if (p != NULL) { + for (i = 0; i < dim1; i++) + if (p[i] != NULL) free(p[i]); + free(p); + } +} +void +Free3DArray(void ***p, int dim1, int dim2) +{ + int i, j; + + if (p != NULL) { + for (i = 0; i < dim1; i++) + if (p[i] != NULL) { + for (j = 0; j < dim2; j++) + if (p[i][j] != NULL) free(p[i][j]); + free(p[i]); + } + free(p); + } +} + + +/* Function: RandomSequence() + * + * Purpose: Generate an iid symbol sequence according + * to some alphabet, alphabet_size, probability + * distribution, and length. Return the + * sequence. + * + * Args: alphabet - e.g. "ACGT" + * p - probability distribution [0..n-1] + * n - number of symbols in alphabet + * len - length of generated sequence + * + * Return: ptr to random sequence, or NULL on failure. + */ +char * +RandomSequence(char *alphabet, float *p, int n, int len) +{ + char *s; + int x; + + s = (char *) MallocOrDie (sizeof(char) * (len+1)); + for (x = 0; x < len; x++) + s[x] = alphabet[FChoose(p,n)]; + s[x] = '\0'; + return s; +} + +/* Function: sre_fgets() + * Date: SRE, Thu May 13 10:56:28 1999 [St. Louis] + * + * Purpose: Dynamic allocation version of fgets(), + * capable of reading unlimited line lengths. + * + * Args: buf - ptr to a string (may be reallocated) + * n - ptr to current allocated length of buf, + * (may be changed) + * fp - open file ptr for reading + * + * Before the first call to sre_fgets(), + * buf should be initialized to NULL and n to 0. + * They're a linked pair, so don't muck with the + * allocation of buf or the value of n while + * you're still doing sre_fgets() calls with them. + * + * Returns: ptr to the buffer on success. + * NULL on EOF (buf isn't to be used in this case) + * sre_fgets() *always* results in an allocation + * in buf. + * + * The reason to have it return a ptr to buf + * is that it makes wrapper macros easy; see + * MSAFileGetLine() for an example. + * + * Example: char *buf; + * int n; + * FILE *fp; + * + * fp = fopen("my_file", "r"); + * buf = NULL; + * n = 0; + * while (sre_fgets(&buf, &n, fp) != NULL) + * { + * do stuff with buf; + * } + */ +char * +sre_fgets(char **buf, int *n, FILE *fp) +{ + char *s; + int len; + int pos; + + if (*n == 0) + { + *buf = MallocOrDie(sizeof(char) * 128); + *n = 128; + } + + /* Simple case 1. We're sitting at EOF, or there's an error. + * fgets() returns NULL, so we return NULL. + */ + if (fgets(*buf, *n, fp) == NULL) return NULL; + + /* Simple case 2. fgets() got a string, and it reached EOF. + * return success status, so caller can use + * the last line; on the next call we'll + * return the 0 for the EOF. + */ + if (feof(fp)) return *buf; + + /* Simple case 3. We got a complete string, with \n, + * and don't need to extend the buffer. + */ + len = strlen(*buf); + if ((*buf)[len-1] == '\n') return *buf; + + /* The case we're waiting for. We have an incomplete string, + * and we have to extend the buffer one or more times. Make + * sure we overwrite the previous fgets's \0 (hence +(n-1) + * in first step, rather than 128, and reads of 129, not 128). + */ + pos = (*n)-1; + while (1) { + *n += 128; + *buf = ReallocOrDie(*buf, sizeof(char) * (*n)); + s = *buf + pos; + if (fgets(s, 129, fp) == NULL) return *buf; + len = strlen(s); + if (s[len-1] == '\n') return *buf; + pos += 128; + } + /*NOTREACHED*/ +} + +/* Function: sre_strcat() + * Date: SRE, Thu May 13 09:36:32 1999 [St. Louis] + * + * Purpose: Dynamic memory version of strcat(). + * appends src to the string that dest points to, + * extending allocation for dest if necessary. + * + * One timing experiment (100 successive appends of + * 1-255 char) shows sre_strcat() has about a 20% + * overhead relative to strcat(). However, if optional + * length info is passed, sre_strcat() is about 30% + * faster than strcat(). + * + * Args: dest - ptr to string (char **), '\0' terminated + * ldest - length of dest, if known; or -1 if length unknown. + * src - string to append to dest, '\0' terminated + * lsrc - length of src, if known; or -1 if length unknown. + * + * dest may be NULL, in which case this is + * the equivalent of dest = Strdup(src). + * + * src may also be NULL, in which case + * dest is unmodified (but why would you want to pass + * a NULL src?) + * + * if both dest and src are NULL, dest is + * unmodified; it stays NULL. + * + * the length parameters are optional. If a -1 + * is passed, sre_strcat() will call strlen() to + * determine the length itself. Passing length + * info saves the strlen() calls and can speed things + * up if lots of successive appends need to be done. + * + * Returns: new length of dest (>=0 on success); + * dest is (probably) reallocated, and modified + * to a longer string, '\0' terminated. + */ +int +sre_strcat(char **dest, int ldest, char *src, int lsrc) +{ + int len1, len2; + + if (ldest < 0) len1 = ((*dest == NULL) ? 0 : strlen(*dest)); + else len1 = ldest; + + if (lsrc < 0) len2 = (( src == NULL) ? 0 : strlen(src)); + else len2 = lsrc; + + if (len2 == 0) return len1; + + if (*dest == NULL) *dest = MallocOrDie(sizeof(char) * (len2+1)); + else *dest = ReallocOrDie(*dest, sizeof(char) * (len1+len2+1)); + + memcpy((*dest)+len1, src, len2+1); + return len1+len2; +} + +/* Function: sre_strtok() + * Date: SRE, Wed May 19 16:30:20 1999 [St. Louis] + * + * Purpose: Thread-safe version of strtok(). + * + * Returns ptr to next token in a string: skips + * until it reaches a character that is not in the delim + * string, and sets beginning of token. Skips to + * next delim character (or '\0') to set the end; replaces that + * character with '\0'. + * If there's still more string left, sets s to point to next + * character after the '\0' that was written, so successive + * calls extract tokens in succession. If there was no string + * left, s points at the terminal '\0'. + * + * If no token is found, returns NULL. + * + * Also returns the length of the token, which + * may save us a strlen() call in some applications. + * + * Limitations: + * *s can't be a constant string, since we write to it. + * + * Example: + * char *tok; + * int len; + * char *s; + * char buf[50] = "This is a sentence."; + * + * s = buf; + * tok = sre_strtok(&s, " ", &len); + * tok is "This"; s is "is a sentence."; len is 4. + * tok = sre_strtok(&s, " ", &len); + * tok is "is"; s is " a sentence."; len is 2. + * tok = sre_strtok(&s, " ", &len); + * tok is "a"; s is "sentence."; len is 1. + * tok = sre_strtok(&s, " ", &len); + * tok is "sentence."; s is "\0"; len is 9. + * tok = sre_strtok(&s, " ", &len); + * tok is NULL; s is "\0", len is undefined. + * + * Args: s - a tmp, modifiable ptr to string + * delim - characters that delimits tokens + * len - RETURN: length of token; pass NULL if not wanted + * + * Returns: ptr to next token, or NULL if there aren't any. + */ +char * +sre_strtok(char **s, char *delim, int *len) +{ + char *begin, *end; + int n; + + begin = *s; + begin += strspn(begin, delim); + if (! *begin) return NULL; + + n = strcspn(begin, delim); + end = begin + n; + if (*end == '\0') { *s = end;} + else { + *end = '\0'; + *s = end+1; + } + + if (len != NULL) *len = n; + return begin; +} + + + +/* Function: sre_strdup() + * Date: SRE, Wed May 19 17:57:28 1999 [St. Louis] + * + * Purpose: A version of the common but non-ANSI strdup() + * function. Can pass len, if known, to save a + * strlen() call. + * + * Args: s - string to duplicate + * n - length of string, if known; -1 if unknown. + * + * Returns: allocated copy of string. + * NULL on failure. + */ +char * +sre_strdup(char *s, int n) +{ + char *new; + + if (s == NULL) return NULL; + if (n < 0) n = strlen(s); + new = MallocOrDie (sizeof(char) * (n+1)); + strcpy(new, s); + return new; +} + + +/* Function: sre_strncpy() + * Date: SRE, Tue Jun 22 10:10:46 1999 [Sanger Centre] + * + * Purpose: a strncpy() that makes sure it adds a trailing \0. + * + * Args: s1 - string to copy to (allocated n+1 or larger) + * s2 - string to copy from + * n - number of chars to copy + * + * Returns: s1. + * Done only for consistency with strncpy(). Not clear + * why it's useful for a strncpy() to return s1. + */ +char * +sre_strncpy(char *s1, char *s2, int n) +{ + strncpy(s1,s2,n); + s1[n] = '\0'; + return s1; +} + +/* Function: IsBlankline() + * Date: SRE, Fri Jun 18 14:36:08 1999 [St. Louis] + * + * Purpose: Returns TRUE if string consists solely of whitespace. + * + * Args: s - string to check + */ +int +IsBlankline(char *s) +{ + for (; *s != '\0'; s++) + if (! isspace(*s)) return FALSE; + return TRUE; +} + + + +#ifdef CUBS_WIN +/* A timing test for sre_strcat() + * cc -O2 -g sre_string.c sre_ctype.c sqerror.c sre_math.c hsregex.c -lm + * 15.200u - 5.360u = 9.84u if sre_strcat() with no length info passed + * 13.660u - 5.360u = 8.30u if strcat(), with a single malloc(). + * 11.370u - 5.360u = 6.01u if sre_strcat() with length info passed. + */ +int main(void) +{ + float p[4] = {0.25, 0.25, 0.25, 0.25}; + int buflen; + int len; + int nappends; + int nstrings; + char *s1 = NULL; + char *s2; + int i; + + nappends = 100; + nstrings = 1000; + while (nstrings--) + { + /* s1 = malloc(sizeof(char) * (255*nappends+1)); + s1[0] = '\0'; + */ + + s1 = NULL; + len = 0; + for (i = 0; i < nappends; i++) + { + buflen = CHOOSE(255) + 1; + s2 = RandomSequence("ACGT", p, 4, buflen); + + /* strcat(s1,s2); */ + if ((len = sre_strcat(&s1, len, s2, buflen)) < 0) exit(1); + free(s2); + } + free(s1); + } + exit(0); +} +#endif /*CUBS_WIN*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/ssi.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,1537 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include "squid.h" +#include "ssi.h" +#ifdef CLUSTALO +#include <limits.h> +#endif + +static sqd_uint32 v20magic = 0xf3f3e9b1; /* SSI 1.0: "ssi1" + 0x80808080 */ +static sqd_uint32 v20swap = 0xb1e9f3f3; /* byteswapped */ + +static int read_i16(FILE *fp, sqd_uint16 *ret_result); +static int read_i32(FILE *fp, sqd_uint32 *ret_result); +static int read_i64(FILE *fp, sqd_uint64 *ret_result); +static int read_offset(FILE *fp, char mode, SSIOFFSET *ret_offset); +static int write_i16(FILE *fp, sqd_uint16 n); +static int write_i32(FILE *fp, sqd_uint32 n); +static int write_i64(FILE *fp, sqd_uint64 n); +static int write_offset(FILE *fp, SSIOFFSET *offset); +static int binary_search(SSIFILE *sfp, char *key, int klen, SSIOFFSET *base, + sqd_uint32 recsize, sqd_uint32 maxidx); +static int indexfile_position(SSIFILE *sfp, SSIOFFSET *base, sqd_uint32 len, + sqd_uint32 n); +static void clear_ssifile(SSIFILE *sfp); +static sqd_uint64 current_index_size(SSIINDEX *g); +static int activate_external_sort(SSIINDEX *g); +static int load_indexfile(SSIFILE *sfp); +static int parse_pkey_info(char *buf, char mode, struct ssipkey_s *pkey); +static int parse_skey_info(char *buf, struct ssiskey_s *skey); + +/* Function: SSIOpen() + * Date: SRE, Sun Dec 31 12:40:03 2000 [St. Louis] + * + * Purpose: Opens the SSI index file {filename} and returns + * a SSIFILE * stream thru {ret_sfp}. + * The caller must eventually close this stream using + * SSIClose(). More than one index file can be open + * at once. + * + * Args: filename - full path to a SSI index file + * + * Returns: Returns 0 on success, nonzero on failure. + */ +int +SSIOpen(char *filename, SSIFILE **ret_sfp) +{ + SSIFILE *sfp = NULL; + int status; + if ((sfp = malloc(sizeof(SSIFILE))) == NULL) return SSI_ERR_MALLOC; + if ((sfp->fp = fopen(filename, "rb")) == NULL) { + free(sfp); + return SSI_ERR_NOFILE; + } + status = load_indexfile(sfp); + *ret_sfp = sfp; + return status; +} +/* load_indexfile(): given a SSIFILE structure with an open and positioned + * stream (fp) -- but no other data loaded -- read the next SSIFILE + * in from disk. We use this routine without its SSIOpen() wrapper + * as part of the external mergesort when creating large indices. + */ +static int +load_indexfile(SSIFILE *sfp) +{ + sqd_uint32 magic; + sqd_uint16 i; /* counter over files */ + int status; /* overall return status if an error is thrown */ + + status = SSI_ERR_BADFORMAT; /* default: almost every kind of error is a bad format error */ + + sfp->filename = NULL; + sfp->fileformat = NULL; + sfp->fileflags = NULL; + sfp->bpl = NULL; + sfp->rpl = NULL; + sfp->nfiles = 0; + if (! read_i32(sfp->fp, &magic)) {status = SSI_ERR_BADMAGIC; goto FAILURE; } + if (magic != v20magic && magic != v20swap) {status = SSI_ERR_BADMAGIC; goto FAILURE; } + if (! read_i32(sfp->fp, &(sfp->flags))) goto FAILURE; + + /* If we have 64-bit offsets, make sure we can deal with them. + */ +#ifndef HAS_64BIT_FILE_OFFSETS + if ((sfp->flags & SSI_USE64_INDEX) || + (sfp->flags & SSI_USE64)) + { status = SSI_ERR_NO64BIT; goto FAILURE; } +#endif + + sfp->imode = (sfp->flags & SSI_USE64_INDEX) ? SSI_OFFSET_I64 : SSI_OFFSET_I32; + sfp->smode = (sfp->flags & SSI_USE64) ? SSI_OFFSET_I64 : SSI_OFFSET_I32; + + if (! read_i16(sfp->fp, &(sfp->nfiles))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->nprimary))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->nsecondary))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->flen))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->plen))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->slen))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->frecsize))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->precsize))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->srecsize))) goto FAILURE; + + if (! read_offset(sfp->fp, sfp->imode, &(sfp->foffset))) goto FAILURE; + if (! read_offset(sfp->fp, sfp->imode, &(sfp->poffset))) goto FAILURE; + if (! read_offset(sfp->fp, sfp->imode, &(sfp->soffset))) goto FAILURE; + + /* Read the file information and keep it. + * We expect the number of files to be small, so reading it + * once should be advantageous overall. If SSI ever had to + * deal with large numbers of files, you'd probably want to + * read file information on demand. + */ + if (sfp->nfiles == 0) goto FAILURE; + if ((sfp->filename=malloc(sizeof(char *) *sfp->nfiles)) == NULL) {status = SSI_ERR_MALLOC; goto FAILURE; } + for (i = 0; i < sfp->nfiles; i++) sfp->filename[i] = NULL; + if ((sfp->fileformat=malloc(sizeof(sqd_uint32)*sfp->nfiles)) == NULL) {status = SSI_ERR_MALLOC; goto FAILURE; } + if ((sfp->fileflags =malloc(sizeof(sqd_uint32)*sfp->nfiles)) == NULL) {status = SSI_ERR_MALLOC; goto FAILURE; } + if ((sfp->bpl =malloc(sizeof(sqd_uint32)*sfp->nfiles)) == NULL) {status = SSI_ERR_MALLOC; goto FAILURE; } + if ((sfp->rpl =malloc(sizeof(sqd_uint32)*sfp->nfiles)) == NULL) {status = SSI_ERR_MALLOC; goto FAILURE; } + + for (i = 0; i < sfp->nfiles; i++) + { + /* We have to explicitly position, because header and file + * records may expand in the future; frecsize and foffset + * give us forwards compatibility. + */ + if (indexfile_position(sfp, &(sfp->foffset), sfp->frecsize, i) !=0) goto FAILURE; + if ((sfp->filename[i] =malloc(sizeof(char)*sfp->flen)) == NULL) {status = SSI_ERR_MALLOC; goto FAILURE; } + if (fread(sfp->filename[i],sizeof(char),sfp->flen, sfp->fp)!=sfp->flen) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->fileformat[i]))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->fileflags[i]))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->bpl[i]))) goto FAILURE; + if (! read_i32(sfp->fp, &(sfp->rpl[i]))) goto FAILURE; + } + + /* Success. Return 0. + */ + return 0; + + FAILURE: + /* Failure: free the damaged structure, return status code. + */ + SSIClose(sfp); + return status; +} + + + +/* Function: SSIGetOffsetByName() + * Date: SRE, Sun Dec 31 13:55:31 2000 [St. Louis] + * + * Purpose: Looks up the string {key} in the open index {sfp}. + * {key} can be either a primary or secondary key. If {key} + * is found, {*ret_fh} contains a unique handle on + * the file that contains {key} (suitable for an SSIFileInfo() + * call, or for comparison to the handle of the last file + * that was opened for retrieval), and {offset} is filled + * in with the offset in that file. + * + * Args: sfp - open index file + * key - string to search for + * ret_fh - RETURN: handle on file that key is in + * ret_offset - RETURN: offset of the start of that key's record + * + * Returns: 0 on success. + * non-zero on error. + */ +int +SSIGetOffsetByName(SSIFILE *sfp, char *key, int *ret_fh, + SSIOFFSET *ret_offset) +{ + int status; + sqd_uint16 fnum; + + /* Look in the primary keys. + */ + status = binary_search(sfp, key, sfp->plen, &(sfp->poffset), sfp->precsize, + sfp->nprimary); + if (status == 0) { + /* We found it as a primary key; get our data & return. + */ + if (! read_i16(sfp->fp, &fnum)) return SSI_ERR_NODATA; + *ret_fh = (int) fnum; + if (! read_offset(sfp->fp, sfp->smode, ret_offset)) return SSI_ERR_NODATA; + + return 0; /* success! (we don't need the other key data) */ + } else if (status == SSI_ERR_NO_SUCH_KEY) { + /* Not in the primary keys? OK, try the secondary keys. + */ + if (sfp->nsecondary > 0) { + char *pkey; + status = binary_search(sfp, key, sfp->slen, &(sfp->soffset), sfp->srecsize, + sfp->nsecondary); + if (status != 0) return status; + if ((pkey = malloc(sizeof(char) * sfp->plen)) == NULL) return SSI_ERR_MALLOC; + if (fread(pkey, sizeof(char), sfp->plen, sfp->fp) != sfp->plen) return SSI_ERR_NODATA; + + status = SSIGetOffsetByName(sfp, pkey, ret_fh, ret_offset); + free(pkey); + } + return status; + + } else return status; + /*NOTREACHED*/ +} + +/* Function: SSIGetOffsetByNumber() + * Date: SRE, Mon Jan 1 19:42:42 2001 [St. Louis] + * + * Purpose: Looks up primary key #{n} in the open index {sfp}. + * {n} ranges from 0..nprimary-1. When key #{n} + * is found, {*ret_fh} contains a unique + * handle on the file that contains {key} (suitable + * for an SSIFileInfo() call, or for comparison to + * the handle of the last file that was opened for retrieval), + * and {offset} is filled in with the offset in that file. + * + * Args: sfp - open index file + * n - primary key number to retrieve. + * ret_fh - RETURN: handle on file that key is in + * ret_offset - RETURN: offset of the start of that key's record + * + * Returns: 0 on success. + * non-zero on error. + */ +int +SSIGetOffsetByNumber(SSIFILE *sfp, int n, int *ret_fh, SSIOFFSET *ret_offset) +{ + sqd_uint16 fnum; + char *pkey; + + if (n >= sfp->nprimary) return SSI_ERR_NO_SUCH_KEY; + if (indexfile_position(sfp, &(sfp->poffset), sfp->precsize, n) != 0) + return SSI_ERR_SEEK_FAILED; + + if ((pkey = malloc(sizeof(char) * sfp->plen)) == NULL) return SSI_ERR_MALLOC; + if (fread(pkey, sizeof(char), sfp->plen, sfp->fp) != sfp->plen) return SSI_ERR_NODATA; + if (! read_i16(sfp->fp, &fnum)) return SSI_ERR_NODATA; + if (! read_offset(sfp->fp, sfp->smode, ret_offset)) return SSI_ERR_NODATA; + *ret_fh = fnum; + free(pkey); + return 0; +} + +/* Function: SSIGetSubseqOffset() + * Date: SRE, Mon Jan 1 19:49:31 2001 [St. Louis] + * + * Purpose: Implements SSI_FAST_SUBSEQ. + * + * Looks up a primary or secondary {key} in the open + * index {sfp}. Asks for the nearest offset to a + * subsequence starting at position {requested_start} + * in the sequence (numbering the sequence 1..L). + * If {key} is found, on return, {ret_fh} + * contains a unique handle on the file that contains + * {key} (suitable for an SSIFileInfo() call, or for + * comparison to the handle of the last file that was + * opened for retrieval); {record_offset} contains the + * disk offset to the start of the record; {data_offset} + * contains the disk offset either exactly at the requested + * residue, or at the start of the line containing the + * requested residue; {ret_actual_start} contains the + * coordinate (1..L) of the first valid residue at or + * after {data_offset}. {ret_actual_start} is <= + * {requested_start}. + * + * Args: sfp - open index file + * key - primary or secondary key to find + * requested_start - residue we'd like to start at (1..L) + * ret_fh - RETURN: handle for file the key is in + * record_offset - RETURN: offset of entire record + * data_offset - RETURN: offset of subseq (see above) + * ret_actual_start- RETURN: coord (1..L) of residue at data_offset + * + * Returns: 0 on success, non-zero on failure. + */ +int +SSIGetSubseqOffset(SSIFILE *sfp, char *key, int requested_start, + int *ret_fh, SSIOFFSET *record_offset, + SSIOFFSET *data_offset, int *ret_actual_start) +{ + int status; + sqd_uint32 len; + int r, b, i, l; /* tmp variables for "clarity", to match docs */ + + /* Look up the key. Rely on the fact that SSIGetOffsetByName() + * leaves the index file positioned at the rest of the data for this key. + */ + status = SSIGetOffsetByName(sfp, key, ret_fh, record_offset); + if (status != 0) return status; + + /* Check that we're allowed to do subseq lookup on that file. + */ + if (! (sfp->fileflags[*ret_fh] & SSI_FAST_SUBSEQ)) + return SSI_ERR_NO_SUBSEQS; + + /* Read the data we need for subseq lookup + */ + if (! read_offset(sfp->fp, sfp->smode, data_offset)) return SSI_ERR_NODATA; + if (! read_i32(sfp->fp, &len)) return SSI_ERR_NODATA; + + /* Set up tmp variables for clarity of equations below, + * and to make them match documentation (ssi-format.tex). + */ + r = sfp->rpl[*ret_fh]; /* residues per line */ + b = sfp->bpl[*ret_fh]; /* bytes per line */ + i = requested_start; /* start position 1..L */ + l = (i-1)/r; /* data line # (0..) that the residue is on */ + if (r == 0 || b == 0) return SSI_ERR_NO_SUBSEQS; + if (i < 0 || i > len) return SSI_ERR_RANGE; + + /* When b = r+1, there's nothing but sequence on each data line (and the \0), + * and we can find each residue precisely. + */ + if (b == r+1) { + if (sfp->smode == SSI_OFFSET_I32) { + data_offset->mode = SSI_OFFSET_I32; + data_offset->off.i32 = data_offset->off.i32 + l*b + (i-1)%r; + } else if (sfp->smode == SSI_OFFSET_I64) { + data_offset->mode = SSI_OFFSET_I64; + data_offset->off.i64 = data_offset->off.i64 + l*b + (i-1)%r; + } + *ret_actual_start = requested_start; + } else { + /* else, there's other stuff on seq lines, so the best + * we can do easily is to position at start of relevant line. + */ + if (sfp->smode == SSI_OFFSET_I32) { + data_offset->mode = SSI_OFFSET_I32; + data_offset->off.i32 = data_offset->off.i32 + l*b; + } else if (sfp->smode == SSI_OFFSET_I64) { + data_offset->mode = SSI_OFFSET_I64; + data_offset->off.i64 = data_offset->off.i64 + l*b; + } + /* yes, the eq below is = 1 + (i-1)/r*r but it's not = i. that's an integer /. */ + *ret_actual_start = 1 + l*r; + } + return 0; +} + +/* Function: SSISetFilePosition() + * Date: SRE, Tue Jan 2 09:13:46 2001 [St. Louis] + * + * Purpose: Uses {offset} to sets the file position for {fp}, usually an + * open sequence file, relative to the start of the file. + * Hides the details of system-dependent shenanigans necessary for + * file positioning in large (>2 GB) files. + * + * Behaves just like fseek(fp, offset, SEEK_SET) for 32 bit + * offsets and <2 GB files. + * + * Warning: if all else fails, in desperation, it will try to + * use fsetpos(). This requires making assumptions about fpos_t + * that may be unwarranted... assumptions that ANSI C prohibits + * me from making... though I believe the ./configure + * script robustly tests whether I can play with fpos_t like this. + * + * Args: fp - file to position. + * offset - SSI offset relative to file start. + * + * Returns: 0 on success, nonzero on error. + */ +int +SSISetFilePosition(FILE *fp, SSIOFFSET *offset) +{ + if (offset->mode == SSI_OFFSET_I32) { + if (fseek(fp, offset->off.i32, SEEK_SET) != 0) return SSI_ERR_SEEK_FAILED; + } +#ifndef HAS_64BIT_FILE_OFFSETS + else return SSI_ERR_NO64BIT; +#elif defined HAVE_FSEEKO && SIZEOF_OFF_T == 8 + else if (fseeko(fp, offset->off.i64, SEEK_SET) != 0) return SSI_ERR_SEEK_FAILED; +#elif defined HAVE_FSEEKO64 && SIZEOF_OFF64_T == 8 + else if (fseeko64(fp, offset->off.i64, SEEK_SET) != 0) return SSI_ERR_SEEK_FAILED; +#elif defined HAVE_FSEEK64 + else if (fseek64(fp, offset->off.i64, SEEK_SET) != 0) return SSI_ERR_SEEK_FAILED; +#elif defined ARITHMETIC_FPOS_T && SIZEOF_FPOS_T == 8 + else if (fsetpos(fp, &(offset->off.i64)) != 0) return SSI_ERR_SEEK_FAILED; +#endif + return 0; +} + + +/* Function: SSIFileInfo() + * Date: SRE, Tue Jan 2 10:31:01 2001 [St. Louis] + * + * Purpose: Given a file number {fh} in an open index file + * {sfp}, retrieve file name {ret_filename} and + * the file format {ret_format}. + * + * {ret_filename} is a pointer to a string maintained + * internally by {sfp}. It should not be free'd; + * SSIClose(sfp) takes care of it. + * + * Args: sfp - open index file + * fh - handle on file to look up + * ret_filename - RETURN: name of file n + * ret_format - RETURN: format of file n + * + * Returns: 0 on success, nonzero on failure. + */ +int +SSIFileInfo(SSIFILE *sfp, int fh, char **ret_filename, int *ret_format) +{ + if (fh < 0 || fh >= sfp->nfiles) return SSI_ERR_BADARG; + *ret_filename = sfp->filename[fh]; + *ret_format = sfp->fileformat[fh]; + return 0; +} + +/* Function: SSIClose() + * Date: SRE, Sun Dec 31 14:56:37 2000 [St. Louis] + * + * Purpose: Close an open {SSIFILE *}. + * + * Args: sfp - index file to close. + * + * Returns: (void) + */ +void +SSIClose(SSIFILE *sfp) +{ + if (sfp != NULL) { + clear_ssifile(sfp); + if (sfp->fp != NULL) fclose(sfp->fp); + free(sfp); + } +} +/* clear_ssifile(): free the innards of SSIFILE, without + * destroying the structure or closing the stream. + */ +static void +clear_ssifile(SSIFILE *sfp) +{ + int i; + + if (sfp->filename != NULL) { + for (i = 0; i < sfp->nfiles; i++) + if (sfp->filename[i] != NULL) free(sfp->filename[i]); + free(sfp->filename); + } + if (sfp->fileformat != NULL) free(sfp->fileformat); + if (sfp->fileflags != NULL) free(sfp->fileflags); + if (sfp->bpl != NULL) free(sfp->bpl); + if (sfp->rpl != NULL) free(sfp->rpl); +} + + +/* Function: SSIRecommendMode() + * Date: SRE, Fri Feb 16 08:23:47 2001 [St. Louis] + * + * Purpose: Examines the file and determines whether it should be + * indexed with large file support or not; returns + * SSI_OFFSET_I32 for most files, SSI_OFFSET_I64 for large + * files, or -1 on failure. + * + * Args: file - name of file to check for size + * + * Returns: -1 on failure (including case where file is too big) + * SSI_OFFSET_I32 for most files (<= 2^31-1 bytes) + * SSI_OFFSET_I64 for large files (> 2^31-1 bytes) + */ +int +SSIRecommendMode(char *file) +{ +#if HAVE_STAT64 + struct stat64 s1; + if (stat64(file, &s1) == 0) { + if (s1.st_size <= 2146483647L) return SSI_OFFSET_I32; + else return SSI_OFFSET_I64; + } +#else + struct stat s2; + if (stat(file, &s2) == 0) { + if (s2.st_size <= 2146483647L) return SSI_OFFSET_I32; + else return SSI_OFFSET_I64; + } +#endif + return -1; +} + + +/* Function: SSICreateIndex() + * Date: SRE, Tue Jan 2 11:23:25 2001 [St. Louis] + * + * Purpose: Creates and initializes a SSI index structure. + * Sequence file offset type is specified by {mode}. + * + * Args: mode - SSI_OFFSET_I32 or SSI_OFFSET_I64, sequence file index mode. + * + * Returns: ptr to new index structure, or NULL on failure. + * Caller is responsible for free'ing the returned + * structure with SSIFreeIndex(). + */ +SSIINDEX * +SSICreateIndex(int mode) +{ + SSIINDEX *g; + + g = NULL; + if ((g = malloc(sizeof(SSIINDEX))) == NULL) goto FAILURE; + g->smode = mode; + g->imode = SSI_OFFSET_I32; /* index always starts as 32-bit; may get upgraded later */ + g->external = FALSE; + g->max_ram = SSI_MAXRAM; + +#ifndef HAS_64BIT_FILE_OFFSETS + if (mode == SSI_OFFSET_I64) + Die("\ +Can't create a 64-bit SSI index on this system, sorry;\n\ +I don't have 64-bit file offset functions available.\n"); +#endif + + g->filenames = NULL; + g->fileformat = NULL; + g->bpl = NULL; + g->rpl = NULL; + g->flen = 0; + g->nfiles = 0; + + g->pkeys = NULL; + g->plen = 0; + g->nprimary = 0; + g->ptmpfile = "tmp.ssi.1"; /* hardcoded, for now. */ + g->ptmp = NULL; + + g->skeys = NULL; + g->slen = 0; + g->nsecondary = 0; + g->stmpfile = "tmp.ssi.2"; /* hardcoded, for now. */ + g->stmp = NULL; + + /* All mallocs must go after NULL initializations, because of the cleanup strategy; + * we'll try to free anything non-NULL if a malloc fails. + */ + if ((g->filenames = malloc(sizeof(char *) * SSI_FILE_BLOCK)) == NULL) goto FAILURE; + if ((g->fileformat= malloc(sizeof(sqd_uint32) * SSI_FILE_BLOCK)) == NULL) goto FAILURE; + if ((g->bpl = malloc(sizeof(sqd_uint32) * SSI_FILE_BLOCK)) == NULL) goto FAILURE; + if ((g->rpl = malloc(sizeof(sqd_uint32) * SSI_FILE_BLOCK)) == NULL) goto FAILURE; + + if ((g->pkeys = malloc(sizeof(struct ssipkey_s)* SSI_KEY_BLOCK))== NULL) goto FAILURE; + if ((g->skeys = malloc(sizeof(struct ssipkey_s)* SSI_KEY_BLOCK))== NULL) goto FAILURE; + + return g; + + FAILURE: + SSIFreeIndex(g); /* free the damaged structure */ + return NULL; +} + +/* Function: SSIGetFilePosition() + * Date: SRE, Tue Jan 2 09:59:26 2001 [St. Louis] + * + * Purpose: Fills {ret_offset} with the current disk + * offset of {fp}, relative to the start of the file. + * {mode} is set to either SSI_OFFSET_I32 or + * SSI_OFFSET_I64. If {mode} is _I32 (32 bit), just wraps + * a call to ftell(); otherwise deals with system-dependent + * details of 64-bit file offsets. + * + * Args: fp - open stream + * mode - SSI_OFFSET_I32 or SSI_OFFSET_I64 + * ret_offset - RETURN: file position + * + * Returns: 0 on success. nonzero on error. + */ +int +SSIGetFilePosition(FILE *fp, int mode, SSIOFFSET *ret_offset) +{ + if (mode == SSI_OFFSET_I32) + { + ret_offset->mode = SSI_OFFSET_I32; + ret_offset->off.i32 = ftell(fp); + if (ret_offset->off.i32 == -1) return SSI_ERR_TELL_FAILED; + } + else if (mode != SSI_OFFSET_I64) abort(); /* only happens on a coding error */ + else { + ret_offset->mode = SSI_OFFSET_I64; +#ifndef HAS_64BIT_FILE_OFFSETS + return SSI_ERR_NO64BIT; +#elif defined HAVE_FTELLO && SIZEOF_OFF_T == 8 + if ((ret_offset->off.i64 = ftello(fp)) == -1) return SSI_ERR_TELL_FAILED; +#elif defined HAVE_FTELLO64 && SIZEOF_OFF64_T == 8 + if ((ret_offset->off.i64 = ftello64(fp)) == -1) return SSI_ERR_TELL_FAILED; +#elif defined HAVE_FTELL64 + if ((ret_offset->off.i64 = ftell64(fp)) == -1) return SSI_ERR_TELL_FAILED; +#elif defined ARITHMETIC_FPOS_T && SIZEOF_FPOS_T == 8 + if (fgetpos(fp, &(ret_offset->off.i64)) != 0) return SSI_ERR_TELL_FAILED; +#endif + } + return 0; +} + +/* Function: SSIAddFileToIndex() + * Date: SRE, Tue Jan 2 12:54:36 2001 [St. Louis] + * + * Purpose: Adds the sequence file {filename}, which is known to + * be in format {fmt}, to the index {g}. Creates and returns + * a unique filehandle {fh} for then associating primary keys + * with this file using SSIAddPrimaryKeyToIndex(). + * + * Args: g - active index + * filename - file to add + * fmt - format code for this file (e.g. SQFILE_FASTA) + * ret_fh - RETURN: unique handle for this file + * + * Returns: 0 on success; nonzero on error. + */ +int +SSIAddFileToIndex(SSIINDEX *g, char *filename, int fmt, int *ret_fh) +{ + int n; + + if (g->nfiles >= SSI_MAXFILES) return SSI_ERR_TOOMANY_FILES; + + n = strlen(filename); + if ((n+1) > g->flen) g->flen = n+1; + + g->filenames[g->nfiles] = FileTail(filename, FALSE); + g->fileformat[g->nfiles] = fmt; + g->bpl[g->nfiles] = 0; + g->rpl[g->nfiles] = 0; + *ret_fh = g->nfiles; /* handle is simply = file number */ + g->nfiles++; + + if (g->nfiles % SSI_FILE_BLOCK == 0) { + g->filenames = realloc(g->filenames, sizeof(char *) * (g->nfiles+SSI_FILE_BLOCK)); + if (g->filenames == NULL) return SSI_ERR_MALLOC; + g->fileformat= realloc(g->fileformat, sizeof(sqd_uint32) * (g->nfiles+SSI_FILE_BLOCK)); + if (g->fileformat == NULL) return SSI_ERR_MALLOC; + g->bpl = realloc(g->bpl, sizeof(sqd_uint32) * (g->nfiles+SSI_FILE_BLOCK)); + if (g->bpl == NULL) return SSI_ERR_MALLOC; + g->rpl = realloc(g->rpl, sizeof(sqd_uint32) * (g->nfiles+SSI_FILE_BLOCK)); + if (g->rpl == NULL) return SSI_ERR_MALLOC; + } + return 0; +} + + +/* Function: SSISetFileForSubseq() + * Date: SRE, Tue Jan 9 10:02:05 2001 [St. Louis] + * + * Purpose: Set SSI_FAST_SUBSEQ for the file indicated by + * filehandle {fh} in the index {g}, setting + * parameters {bpl} and {rpl} to the values given. + * {bpl} is the number of bytes per sequence data line. + * {rpl} is the number of residues per sequence data line. + * Caller must be sure that {bpl} and {rpl} do not change + * on any line of any sequence record in the file + * (except for the last data line of each record). If + * this is not the case in this file, SSI_FAST_SUBSEQ + * will not work, and this routine should not be + * called. + * + * Args: g - the active index + * fh - handle for file to set SSI_FAST_SUBSEQ on + * bpl - bytes per data line + * rpl - residues per data line + * + * Returns: 0 on success; 1 on error. + */ +int +SSISetFileForSubseq(SSIINDEX *g, int fh, int bpl, int rpl) +{ + if (fh < 0 || fh >= g->nfiles) return SSI_ERR_BADARG; + if (bpl <= 0 || rpl <= 0) return SSI_ERR_BADARG; + g->bpl[fh] = bpl; + g->rpl[fh] = rpl; + return 0; +} + + +/* Function: SSIAddPrimaryKeyToIndex() + * Date: SRE, Tue Jan 2 11:50:54 2001 [St. Louis] + * + * Purpose: Put primary key {key} in the index {g}, while telling + * the index this primary key is in the file associated + * with filehandle {fh} (returned by a previous call + * to SSIAddFileToIndex()), and its record starts at + * position {r_off} in the file. + * + * {d_off} and {L} are optional; they may be left unset + * by passing NULL and 0, respectively. (If one is + * provided, both must be provided.) If they are provided, + * {d_off} gives the position of the first line of sequence + * data in the record, and {L} gives the length of + * the sequence in residues. They are used when + * SSI_FAST_SUBSEQ is set for this file. If SSI_FAST_SUBSEQ + * is not set for the file, {d_off} and {L} will be + * ignored by the index reading API even if they are stored + * by the index writing API, so it doesn't hurt for the + * indexing program to provide them; typically they + * won't know whether it's safe to set SSI_FAST_SUBSEQ + * for the whole file until the whole file has been + * read and every key has already been added to the index. + * + * Args: g - active index + * key - primary key to add + * fh - handle on file that this key's in + * r_off - offset to start of record + * d_off - offset to start of sequence data + * L - length of sequence, or 0 + * + * Returns: 0 on success, nonzero on error. + */ +int +SSIAddPrimaryKeyToIndex(SSIINDEX *g, char *key, int fh, + SSIOFFSET *r_off, SSIOFFSET *d_off, int L) +{ + int n; /* a string length */ + + if (fh >= SSI_MAXFILES) return SSI_ERR_TOOMANY_FILES; + if (g->nprimary >= SSI_MAXKEYS) return SSI_ERR_TOOMANY_KEYS; + if (L > 0 && d_off == NULL) abort(); /* need both. */ + + /* Before adding the key: check how big our index is. + * If it's getting too large, switch to external mode. + */ + if (!g->external && current_index_size(g) >= g->max_ram) + if (activate_external_sort(g) != 0) return SSI_ERR_NOFILE; + + /* Update maximum pkey length, if needed. + */ + n = strlen(key); + if ((n+1) > g->plen) g->plen = n+1; + + /* External mode? Simply append to disk... + */ + if (g->external) { + if (g->smode == SSI_OFFSET_I32) { + fprintf(g->ptmp, "%s\t%d\t%lu\t%lu\t%lu\n", + key, fh, (unsigned long) r_off->off.i32, + (unsigned long) (d_off == NULL? 0 : d_off->off.i32), + (unsigned long) L); + } else { +#ifdef CLUSTALO + fprintf(g->ptmp, "%s\t%d\t%llu\t%llu\t%lu\n", + key, fh, (unsigned long long)r_off->off.i64, + d_off == NULL? 0 : (unsigned long long) d_off->off.i64, + (unsigned long) L); +#else + fprintf(g->ptmp, "%s\t%d\t%llu\t%llu\t%lu\n", + key, fh, r_off->off.i64, + d_off == NULL? 0 : d_off->off.i64, + (unsigned long) L); +#endif + } + g->nprimary++; + return 0; + } + + /* Else: internal mode, keep keys in memory... + */ + if ((g->pkeys[g->nprimary].key = sre_strdup(key, n)) == NULL) return SSI_ERR_MALLOC; + g->pkeys[g->nprimary].fnum = (sqd_uint16) fh; + g->pkeys[g->nprimary].r_off = *r_off; + if (d_off != NULL && L > 0) { + g->pkeys[g->nprimary].d_off = *d_off; + g->pkeys[g->nprimary].len = L; + } else { + /* yeah, this looks stupid, but look: we have to give a valid + looking, non-NULL d_off of some sort, or writes will fail. + It's going to be unused anyway. */ + g->pkeys[g->nprimary].d_off = *r_off; + g->pkeys[g->nprimary].len = 0; + } + g->nprimary++; + + if (g->nprimary % SSI_KEY_BLOCK == 0) { + g->pkeys = realloc(g->pkeys, sizeof(struct ssipkey_s) * (g->nprimary+SSI_KEY_BLOCK)); + if (g->pkeys == NULL) return SSI_ERR_MALLOC; + } + return 0; +} + + +/* Function: SSIAddSecondaryKeyToIndex() + * Date: SRE, Tue Jan 2 12:44:40 2001 [St. Louis] + * + * Purpose: Puts secondary key {key} in the index {g}, associating + * it with primary key {pkey} that was previously + * registered by SSIAddPrimaryKeyToIndex(). + * + * Args: g - active index + * key - secondary key to add + * pkey - primary key to associate this key with + * + * Returns: 0 on success, nonzero on failure. + */ +int +SSIAddSecondaryKeyToIndex(SSIINDEX *g, char *key, char *pkey) +{ + int n; /* a string length */ + + if (g->nsecondary >= SSI_MAXKEYS) return SSI_ERR_TOOMANY_KEYS; + + /* Before adding the key: check how big our index is. + * If it's getting too large, switch to external mode. + */ + if (!g->external && current_index_size(g) >= g->max_ram) + if (activate_external_sort(g) != 0) return SSI_ERR_NOFILE; + + /* Update maximum secondary key length, if necessary. + */ + n = strlen(key); + if ((n+1) > g->slen) g->slen = n+1; + + /* if external mode: write info to disk. + */ + if (g->external) { + fprintf(g->stmp, "%s\t%s\n", key, pkey); + g->nsecondary++; + return 0; + } + + /* else, internal mode... store info in memory. + */ + if ((g->skeys[g->nsecondary].key = sre_strdup(key, n)) == NULL) return SSI_ERR_MALLOC; + if ((g->skeys[g->nsecondary].pkey = sre_strdup(pkey, -1)) == NULL) return SSI_ERR_MALLOC; + g->nsecondary++; + + if (g->nsecondary % SSI_KEY_BLOCK == 0) { + g->skeys = realloc(g->skeys, sizeof(struct ssiskey_s) * (g->nsecondary+SSI_KEY_BLOCK)); + if (g->skeys == NULL) return SSI_ERR_MALLOC; + } + return 0; +} + + + + +/* Function: SSIWriteIndex() + * Date: SRE, Tue Jan 2 13:55:56 2001 [St. Louis] + * + * Purpose: Writes complete index {g} in SSI format to a + * binary file {file}. Does all + * the overhead of sorting the primary and secondary keys, + * and maintaining the association of secondary keys + * with primary keys during and after the sort. + * + * Args: file - file to write to + * g - index to sort & write out. + * + * Returns: 0 on success, nonzero on error. + */ +/* needed for qsort() */ +static int +pkeysort(const void *k1, const void *k2) +{ + struct ssipkey_s *key1; + struct ssipkey_s *key2; + key1 = (struct ssipkey_s *) k1; + key2 = (struct ssipkey_s *) k2; + return strcmp(key1->key, key2->key); +} +static int +skeysort(const void *k1, const void *k2) +{ + struct ssiskey_s *key1; + struct ssiskey_s *key2; + key1 = (struct ssiskey_s *) k1; + key2 = (struct ssiskey_s *) k2; + return strcmp(key1->key, key2->key); +} +int +SSIWriteIndex(char *file, SSIINDEX *g) +{ + FILE *fp; + int status; + int i; + sqd_uint32 header_flags, file_flags; + sqd_uint32 frecsize, precsize, srecsize; + sqd_uint64 foffset, poffset, soffset; + char *s, *s2; + + if ((fp = fopen(file,"wb")) == NULL) return SSI_ERR_NOFILE; + status = 0; + + /* How big is the index? If it's going to be > 2GB, we need + * to flip to 64-bit index mode. 2047 (instead of 2048) gives us + * some slop room. + * die'ing here is pretty brutal - if we flip to 64-bit index + * mode, we hve 100's of millions of keys, so we've processed + * a long time before reaching this point. Ah well. + */ + if (current_index_size(g) >= 2047) { + g->imode = SSI_OFFSET_I64; +#ifndef HAS_64BIT_FILE_OFFSETS + Die("\ +Can't switch to 64-bit SSI index mode on this system, sorry;\n\ +I don't have 64-bit file offset functions available.\n"); +#endif + } + + /* Magic-looking numbers come from adding up sizes + * of things in bytes + */ + frecsize = 16 + g->flen; + precsize = (g->smode == SSI_OFFSET_I64) ? 22+g->plen : 14+g->plen; + srecsize = g->slen + g->plen; + + header_flags = 0; + if (g->smode == SSI_OFFSET_I64) header_flags |= SSI_USE64; + if (g->imode == SSI_OFFSET_I64) header_flags |= SSI_USE64_INDEX; + + /* Magic-looking numbers again come from adding up sizes + * of things in bytes + */ + foffset = (header_flags & SSI_USE64_INDEX) ? 66 : 54; + poffset = foffset + frecsize*g->nfiles; + soffset = poffset + precsize*g->nprimary; + + /* Sort the keys + * If external mode, make system calls to UNIX/POSIX "sort" in place, then + * open new sorted files for reading thru ptmp and stmp handles. + * If internal mode, call qsort. + * + * Note that you'd better force a POSIX locale for the sort; else, + * some silly distro (e.g. Mandrake Linux >=8.1) may have specified + * LC_COLLATE=en_US, and this'll give a sort "bug" in which it doesn't + * sort by byte order. + */ + if (g->external) { + char cmd[1024]; + + fclose(g->ptmp); + g->ptmp = NULL; + sprintf(cmd, "env LC_ALL=POSIX sort -o %s %s\n", g->ptmpfile, g->ptmpfile); + if ((status = system(cmd)) != 0) return SSI_ERR_EXTERNAL_SORT; + if ((g->ptmp = fopen(g->ptmpfile, "r")) == NULL) return SSI_ERR_EXTERNAL_SORT; + + fclose(g->stmp); + g->stmp = NULL; + sprintf(cmd, "env LC_ALL=POSIX sort -o %s %s\n", g->stmpfile, g->stmpfile); + if ((status = system(cmd)) != 0) return SSI_ERR_EXTERNAL_SORT; + if ((g->stmp = fopen(g->stmpfile, "r")) == NULL) return SSI_ERR_EXTERNAL_SORT; + } else { + qsort((void *) g->pkeys, g->nprimary, sizeof(struct ssipkey_s), pkeysort); + qsort((void *) g->skeys, g->nsecondary, sizeof(struct ssiskey_s), skeysort); + } + + /* Write the header + */ + if (! write_i32(fp, v20magic)) return SSI_ERR_FWRITE; + if (! write_i32(fp, header_flags)) return SSI_ERR_FWRITE; + if (! write_i16(fp, g->nfiles)) return SSI_ERR_FWRITE; + if (! write_i32(fp, g->nprimary)) return SSI_ERR_FWRITE; + if (! write_i32(fp, g->nsecondary)) return SSI_ERR_FWRITE; + if (! write_i32(fp, g->flen)) return SSI_ERR_FWRITE; + if (! write_i32(fp, g->plen)) return SSI_ERR_FWRITE; + if (! write_i32(fp, g->slen)) return SSI_ERR_FWRITE; + if (! write_i32(fp, frecsize)) return SSI_ERR_FWRITE; + if (! write_i32(fp, precsize)) return SSI_ERR_FWRITE; + if (! write_i32(fp, srecsize)) return SSI_ERR_FWRITE; + if (g->imode == SSI_OFFSET_I32) { + if (! write_i32(fp, foffset)) return SSI_ERR_FWRITE; + if (! write_i32(fp, poffset)) return SSI_ERR_FWRITE; + if (! write_i32(fp, soffset)) return SSI_ERR_FWRITE; + } else { + if (! write_i64(fp, foffset)) return SSI_ERR_FWRITE; + if (! write_i64(fp, poffset)) return SSI_ERR_FWRITE; + if (! write_i64(fp, soffset)) return SSI_ERR_FWRITE; + } + + /* The file section + */ + if ((s = malloc(sizeof(char) * g->flen)) == NULL) return SSI_ERR_MALLOC; + for (i = 0; i < g->nfiles; i++) + { + file_flags = 0; + if (g->bpl[i] > 0 && g->rpl[i] > 0) file_flags |= SSI_FAST_SUBSEQ; + + strcpy(s, g->filenames[i]); + if (fwrite(s, sizeof(char), g->flen, fp) != g->flen) return SSI_ERR_FWRITE; + if (! write_i32(fp, g->fileformat[i])) return SSI_ERR_FWRITE; + if (! write_i32(fp, file_flags)) return SSI_ERR_FWRITE; + if (! write_i32(fp, g->bpl[i])) return SSI_ERR_FWRITE; + if (! write_i32(fp, g->rpl[i])) return SSI_ERR_FWRITE; + } + free(s); + + /* The primary key section + */ + if ((s = malloc(sizeof(char) * g->plen)) == NULL) return SSI_ERR_MALLOC; + if (g->external) { + char *buf = NULL; + int buflen = 0; + struct ssipkey_s pkey; + for (i = 0; i < g->nprimary; i++) + { + if (sre_fgets(&buf, &buflen, g->ptmp) == NULL) return SSI_ERR_NODATA; + if (parse_pkey_info(buf, g->smode, &pkey) != 0) return SSI_ERR_BADFORMAT; + strcpy(s, pkey.key); + if (fwrite(s, sizeof(char), g->plen, fp) != g->plen) return SSI_ERR_FWRITE; + if (! write_i16( fp, pkey.fnum)) return SSI_ERR_FWRITE; + if (! write_offset(fp, &(pkey.r_off))) return SSI_ERR_FWRITE; + if (! write_offset(fp, &(pkey.d_off))) return SSI_ERR_FWRITE; + if (! write_i32( fp, pkey.len)) return SSI_ERR_FWRITE; + } + free(buf); + } else { + for (i = 0; i < g->nprimary; i++) + { + strcpy(s, g->pkeys[i].key); + if (fwrite(s, sizeof(char), g->plen, fp) != g->plen) return SSI_ERR_FWRITE; + if (! write_i16( fp, g->pkeys[i].fnum)) return SSI_ERR_FWRITE; + if (! write_offset(fp, &(g->pkeys[i].r_off))) return SSI_ERR_FWRITE; + if (! write_offset(fp, &(g->pkeys[i].d_off))) return SSI_ERR_FWRITE; + if (! write_i32( fp, g->pkeys[i].len)) return SSI_ERR_FWRITE; + } + } + + /* The secondary key section + */ + if (g->nsecondary > 0) { + if ((s2 = malloc(sizeof(char) * g->slen)) == NULL) return SSI_ERR_MALLOC; + + if (g->external) { + struct ssiskey_s skey; + char *buf = NULL; + int n = 0; + + for (i = 0; i < g->nsecondary; i++) + { + if (sre_fgets(&buf, &n, g->stmp) == NULL) return SSI_ERR_NODATA; + if (parse_skey_info(buf, &skey) != 0) return SSI_ERR_BADFORMAT; + strcpy(s2, skey.key); + strcpy(s, skey.pkey); + if (fwrite(s2, sizeof(char), g->slen, fp) != g->slen) return SSI_ERR_FWRITE; + if (fwrite(s, sizeof(char), g->plen, fp) != g->plen) return SSI_ERR_FWRITE; + } + free(buf); + } else { + for (i = 0; i < g->nsecondary; i++) + { + strcpy(s2, g->skeys[i].key); + strcpy(s, g->skeys[i].pkey); + if (fwrite(s2, sizeof(char), g->slen, fp) != g->slen) return SSI_ERR_FWRITE; + if (fwrite(s, sizeof(char), g->plen, fp) != g->plen) return SSI_ERR_FWRITE; + } + } + free(s2); + } + + free(s); + fclose(fp); + return status; +} + + +/* Function: SSIFreeIndex() + * Date: SRE, Tue Jan 2 11:44:08 2001 [St. Louis] + * + * Purpose: Free an index structure {g}. + * + * Args: g - ptr to an open index. + * + * Returns: (void) + */ +void +SSIFreeIndex(SSIINDEX *g) +{ + int i; + if (g != NULL) + { + if (g->external == FALSE) { + for (i = 0; i < g->nprimary; i++) free(g->pkeys[i].key); + for (i = 0; i < g->nsecondary; i++) free(g->skeys[i].key); + for (i = 0; i < g->nsecondary; i++) free(g->skeys[i].pkey); + if (g->pkeys != NULL) free(g->pkeys); + if (g->skeys != NULL) free(g->skeys); + } else { + if (g->ptmp != NULL) fclose(g->ptmp); + if (g->stmp != NULL) fclose(g->stmp); +#if DEBUGLEVEL == 0 + remove(g->ptmpfile); + remove(g->stmpfile); +#endif + } + for (i = 0; i < g->nfiles; i++) free(g->filenames[i]); + if (g->filenames != NULL) free(g->filenames); + if (g->fileformat != NULL) free(g->fileformat); + if (g->bpl != NULL) free(g->bpl); + if (g->rpl != NULL) free(g->rpl); + free(g); + } +} + + +/* Function: SSIErrorString() + * Date: SRE, Tue Jan 2 10:38:10 2001 [St. Louis] + * + * Purpose: Returns a ptr to an internal string corresponding + * to error {n}, a code returned from any of the + * functions in the API that return non-zero on error. + * + * Args: n - error code + * + * Returns: ptr to an internal string. + */ +char * +SSIErrorString(int n) +{ + switch (n) { + case SSI_ERR_OK: return "ok (no error)"; + case SSI_ERR_NODATA: return "no data, fread() failed"; + case SSI_ERR_NO_SUCH_KEY: return "no such key"; + case SSI_ERR_MALLOC: return "out of memory, malloc() failed"; + case SSI_ERR_NOFILE: return "file not found, fopen() failed"; + case SSI_ERR_BADMAGIC: return "not a SSI file? (bad magic)"; + case SSI_ERR_BADFORMAT: return "corrupt format? unexpected data"; + case SSI_ERR_NO64BIT: return "no large file support for this system"; + case SSI_ERR_SEEK_FAILED: return "failed to reposition on disk"; + case SSI_ERR_TELL_FAILED: return "failed to get file position on disk"; + case SSI_ERR_NO_SUBSEQS: return "no fast subseq support for this seqfile"; + case SSI_ERR_RANGE: return "subseq start is out of range"; + case SSI_ERR_BADARG: return "an argument is out of range"; + case SSI_ERR_TOOMANY_FILES: return "number of files exceeds limit"; + case SSI_ERR_TOOMANY_KEYS: return "number of keys exceeds limit"; + case SSI_ERR_FWRITE: return "an fwrite() failed"; + case SSI_ERR_EXTERNAL_SORT: return "some problem with external sorting"; + default: return "unrecognized code"; + } + /*NOTREACHED*/ +} + +static int +read_i16(FILE *fp, sqd_uint16 *ret_result) +{ + sqd_uint16 result; + if (fread(&result, sizeof(sqd_uint16), 1, fp) != 1) return 0; + *ret_result = sre_ntoh16(result); + return 1; +} +static int +write_i16(FILE *fp, sqd_uint16 n) +{ + n = sre_hton16(n); + if (fwrite(&n, sizeof(sqd_uint16), 1, fp) != 1) return 0; + return 1; +} +static int +read_i32(FILE *fp, sqd_uint32 *ret_result) +{ + sqd_uint32 result; + if (fread(&result, sizeof(sqd_uint32), 1, fp) != 1) return 0; + *ret_result = sre_ntoh32(result); + return 1; +} +static int +write_i32(FILE *fp, sqd_uint32 n) +{ + n = sre_hton32(n); + if (fwrite(&n, sizeof(sqd_uint32), 1, fp) != 1) return 0; + return 1; +} +static int +read_i64(FILE *fp, sqd_uint64 *ret_result) +{ + sqd_uint64 result; + if (fread(&result, sizeof(sqd_uint64), 1, fp) != 1) return 0; + *ret_result = sre_ntoh64(result); + return 1; +} +static int +write_i64(FILE *fp, sqd_uint64 n) +{ + n = sre_hton64(n); + if (fwrite(&n, sizeof(sqd_uint64), 1, fp) != 1) return 0; + return 1; +} +static int +read_offset(FILE *fp, char mode, SSIOFFSET *ret_offset) +{ + if (mode == SSI_OFFSET_I32) { + ret_offset->mode = SSI_OFFSET_I32; + if (! read_i32(fp, &(ret_offset->off.i32))) return 0; + } else if (mode == SSI_OFFSET_I64) { + ret_offset->mode = SSI_OFFSET_I64; + if (! read_i64(fp, &(ret_offset->off.i64))) return 0; + } else return 0; + + return 1; +} +static int +write_offset(FILE *fp, SSIOFFSET *offset) +{ + if (offset->mode == SSI_OFFSET_I32) return write_i32(fp, offset->off.i32); + else if (offset->mode == SSI_OFFSET_I64) return write_i64(fp, offset->off.i64); + else abort(); + /*UNREACHED*/ + return 1; /* silence bitchy compilers */ +} + +static int +parse_pkey_info(char *buf, char mode, struct ssipkey_s *pkey) +{ + char *s, *tok; + int n; + + s = buf; + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + pkey->key = tok; + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + pkey->fnum = (sqd_uint16) atoi(tok); + + if (mode == SSI_OFFSET_I32) { + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + pkey->r_off.mode = mode; + pkey->r_off.off.i32 = (sqd_uint32) strtoul(tok, NULL, 10); + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + pkey->d_off.mode = mode; + pkey->d_off.off.i32 = (sqd_uint32) strtoul(tok, NULL, 10); + } +#ifdef HAS_64BIT_FILE_OFFSETS + else { + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + pkey->r_off.mode = mode; + pkey->r_off.off.i64 = (sqd_uint64) strtoull(tok, NULL, 10); + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + pkey->d_off.mode = mode; + pkey->d_off.off.i64 = (sqd_uint64) strtoull(tok, NULL, 10); + } +#else + else { + return SSI_ERR_NO64BIT; + } +#endif + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + pkey->len = (sqd_uint32) strtoul(tok, NULL, 10); + + return 0; +} +static int +parse_skey_info(char *buf, struct ssiskey_s *skey) +{ + char *s, *tok; + int n; + + s = buf; + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + skey->key = tok; + if ((tok = sre_strtok(&s, "\t\n", &n)) == NULL) return SSI_ERR_BADFORMAT; + skey->pkey = tok; + return 0; +} + +/* Function: binary_search() + * Date: SRE, Sun Dec 31 16:05:03 2000 [St. Louis] + * + * Purpose: Find a key in a SSI index, by a binary search + * in an alphabetically sorted list of keys. If successful, + * return 0, and the index file is positioned to read + * the rest of the data for that key. Else returns nonzero. + * + * Args: sfp - an open SSIFILE + * key - key to find + * klen - key length to allocate (plen or slen from sfp) + * base - base offset (poffset or soffset) + * recsize - size of each key record in bytes (precsize or srecsize) + * maxidx - # of keys (nprimary or nsecondary) + * + * Returns: 0 on success, and leaves file positioned for reading remaining + * data for the key. + * Nonzero on failure: + * SSI_ERR_NO_SUCH_KEY - that key's not in the index + * SSI_ERR_MALLOC - a memory allocation failure + * SSI_ERR_NODATA - an fread() failed + */ +static int +binary_search(SSIFILE *sfp, char *key, int klen, SSIOFFSET *base, + sqd_uint32 recsize, sqd_uint32 maxidx) +{ + char *name; + sqd_uint32 left, right, mid; + int cmp; + int status; + + if (maxidx == 0) return SSI_ERR_NO_SUCH_KEY; /* special case: empty index */ + if ((name = malloc (sizeof(char)*klen)) == NULL) return SSI_ERR_MALLOC; + left = 0; + right = maxidx-1; + while (1) { /* A binary search: */ + mid = (left+right) / 2; /* careful here. only works because + we limit unsigned vars to signed ranges. */ + if ((status = indexfile_position(sfp, base, recsize, mid)) != 0) + { free(name); return status; } + if (fread(name, sizeof(char), klen, sfp->fp) != klen) + { free(name); return SSI_ERR_NODATA; } + cmp = strcmp(name, key); + if (cmp == 0) break; /* found it! */ + else if (left >= right) /* oops, missed it; fail */ + { free(name); return SSI_ERR_NO_SUCH_KEY; } + else if (cmp < 0) left = mid+1; /* it's right of mid */ + else if (cmp > 0) { + if (mid == 0) { free(name); return SSI_ERR_NO_SUCH_KEY; } /* special case, beware */ + else right = mid-1; /* it's left of mid */ + } + } + free(name); + return 0; /* and sfp->fp is positioned... */ +} + +/* Function: indexfile_position() + * Date: SRE, Mon Jan 1 19:32:49 2001 [St. Louis] + * + * Purpose: Position the open index file {sfp} at the start + * of record {n} in a list of records that starts at + * base offset {base}, where each record takes up {l} + * bytes. (e.g. the position is byte (base + n*l)). + * + * Args: sfp - open SSIFILE + * base - offset of record 0 (e.g. sfp->foffset) + * len - size of each record in bytes (e.g. sfp->frecsize) + * n - which record to get (e.g. 0..sfp->nfiles) + * + * Returns: 0 on success, non-zero on failure. + */ +static int +indexfile_position(SSIFILE *sfp, SSIOFFSET *base, sqd_uint32 len, sqd_uint32 n) +{ + SSIOFFSET pos; + int status; + + if (base->mode == SSI_OFFSET_I32) { + pos.mode = SSI_OFFSET_I32; + pos.off.i32 = base->off.i32 + n*len; + } else if (base->mode == SSI_OFFSET_I64) { + pos.mode = SSI_OFFSET_I64; + pos.off.i64 = base->off.i64 + n*len; + } else return 0; + if ((status = SSISetFilePosition(sfp->fp, &pos)) != 0) return status; + return 0; +} + +/* Function: current_index_size() + * Date: SRE, Tue Feb 20 18:23:30 2001 [St. Louis] + * + * Purpose: Calculates the size of the current index, + * in megabytes. + */ +static sqd_uint64 +current_index_size(SSIINDEX *g) +{ + sqd_uint64 frecsize, precsize, srecsize; + sqd_uint64 total; + + /* Magic-looking numbers come from adding up sizes + * of things in bytes + */ + frecsize = 16 + g->flen; + precsize = (g->smode == SSI_OFFSET_I64) ? 22+g->plen : 14+g->plen; + srecsize = g->plen+g->slen; + total = (66L + /* header size, if 64bit index offsets */ + frecsize * g->nfiles + /* file section size */ + precsize * g->nprimary + /* primary key section size */ + srecsize * g->nsecondary) / /* secondary key section size */ + 1048576L; + return total; +} +/* Function: activate_external_sort() + * Date: SRE, Mon Feb 4 09:08:08 2002 [St. Louis] + * + * Purpose: Switch to external sort mode. + * Open file handles for external index files (ptmp, stmp). + * Flush current index information to these files. + * Free current memory, turn over control to the tmpfiles. + * + * Return: 0 on success; non-zero on failure. + */ +static int +activate_external_sort(SSIINDEX *g) +{ + int i; + /* it's a bit late to be checking this, but... */ + if (g->external) return 0; /* we already are external, fool */ + if (FileExists(g->ptmpfile)) return 1; + if (FileExists(g->stmpfile)) return 1; + if ((g->ptmp = fopen(g->ptmpfile, "w")) == NULL) return 1; + if ((g->stmp = fopen(g->stmpfile, "w")) == NULL) return 1; + + /* Flush the current indices. + */ + SQD_DPRINTF1(("Switching to external sort - flushing ssiindex to disk...\n")); + for (i = 0; i < g->nprimary; i++) { + if (g->smode == SSI_OFFSET_I32) { + fprintf(g->ptmp, "%s\t%u\t%lu\t%lu\t%lu\n", + g->pkeys[i].key, g->pkeys[i].fnum, + (unsigned long) g->pkeys[i].r_off.off.i32, + (unsigned long) g->pkeys[i].d_off.off.i32, + (unsigned long) g->pkeys[i].len); + } else { + fprintf(g->ptmp, "%s\t%u\t%llu\t%llu\t%lu\n", + g->pkeys[i].key, g->pkeys[i].fnum, + (unsigned long long) g->pkeys[i].r_off.off.i64, + (unsigned long long) g->pkeys[i].d_off.off.i64, + (unsigned long) g->pkeys[i].len); + } + } + for (i = 0; i < g->nsecondary; i++) + fprintf(g->stmp, "%s\t%s\n", g->skeys[i].key, g->skeys[i].pkey); + + /* Free the memory now that we've flushed our lists to disk + */ + for (i = 0; i < g->nprimary; i++) free(g->pkeys[i].key); + for (i = 0; i < g->nsecondary; i++) free(g->skeys[i].key); + for (i = 0; i < g->nsecondary; i++) free(g->skeys[i].pkey); + if (g->pkeys != NULL) free(g->pkeys); + if (g->skeys != NULL) free(g->skeys); + g->pkeys = NULL; + g->skeys = NULL; + + /* Turn control over to external accumulation mode. + */ + g->external = TRUE; + return 0; +} + + +/***************************************************************** + * Debugging API + *****************************************************************/ +void +SSIForceExternalSort(SSIINDEX *g) +{ + if (activate_external_sort(g) != 0) + Die("failed to turn external sorting on."); +} + + +/***************************************************************** + * Test driving mode + *****************************************************************/ +#ifdef MUGGINS_LETS_ME_SLEEP +/* Minimally: + cc -g -Wall -o shiva -DDEBUGLEVEL=1 -DMUGGINS_LETS_ME_SLEEP ssi.c sqerror.c sre_string.c types.c sre_ctype.c sre_math.c file.c -lm +*/ + +int +main(int argc, char **argv) +{ + char name[32], accession[32]; + SSIINDEX *ssi; + int mode; + SSIOFFSET r_off, d_off; + FILE *ofp; + int i; + int fh; /* a file handle */ + int status; /* return status from a SSI call */ + + mode = SSI_OFFSET_I32; + if ((ssi = SSICreateIndex(mode)) == NULL) + Die("Failed to allocate SSI index"); + + /* Generate two FASTA files, tmp.0 and tmp.1, and index them. + */ + if ((ofp = fopen("tmp.0", "w")) == NULL) + Die("failed to open tmp.0"); + if ((status = SSIAddFileToIndex(ssi, "tmp.0", SQFILE_FASTA, &fh)) != 0) + Die("SSIAddFileToIndex() failed: %s", SSIErrorString(status)); + for (i = 0; i < 10; i++) { + if ((status = SSIGetFilePosition(ofp, mode, &r_off)) != 0) + Die("SSIGetFilePosition() failed: %s", SSIErrorString(status)); + sprintf(name, "seq%d", i); + sprintf(accession, "ac%d", i); + fprintf(ofp, ">%s [%s] Description? we don't need no steenking description.\n", + name, accession); + if ((status = SSIGetFilePosition(ofp, mode, &d_off)) != 0) + Die("SSIGetFilePosition() failed: %s", SSIErrorString(status)); + fprintf(ofp, "AAAAAAAAAA\n"); + fprintf(ofp, "CCCCCCCCCC\n"); + fprintf(ofp, "GGGGGGGGGG\n"); + fprintf(ofp, "TTTTTTTTTT\n"); + + if ((status = SSIAddPrimaryKeyToIndex(ssi, name, fh, &r_off, &d_off, 40)) != 0) + Die("SSIAddPrimaryKeyToIndex() failed: %s", SSIErrorString(status)); + if ((status = SSIAddSecondaryKeyToIndex(ssi, accession, name)) != 0) + Die("SSIAddSecondaryKeyToIndex() failed: %s", SSIErrorString(status)); + } + SSISetFileForSubseq(ssi, fh, 11, 10); + fclose(ofp); + + if ((ofp = fopen("tmp.1", "w")) == NULL) + Die("failed to open tmp.1"); + if ((status = SSIAddFileToIndex(ssi, "tmp.1", SQFILE_FASTA, &fh)) != 0) + Die("SSIAddFileToIndex() failed: %s", SSIErrorString(status)); + for (i = 10; i < 20; i++) { + if ((status = SSIGetFilePosition(ofp, mode, &r_off)) != 0) + Die("SSIGetFilePosition() failed: %s", SSIErrorString(status)); + sprintf(name, "seq%d", i); + sprintf(accession, "ac%d", i); + fprintf(ofp, ">%s [%s] i/o, i/o, it's off to disk we go.\n", + name, accession); + if ((status = SSIGetFilePosition(ofp, mode, &d_off)) != 0) + Die("SSIGetFilePosition() failed: %s", SSIErrorString(status)); + fprintf(ofp, "AAAAAAAAAA 10\n"); + fprintf(ofp, "CCCCCCCCCC 20\n"); + fprintf(ofp, "GGGGGGGGGG 30\n"); + fprintf(ofp, "TTTTTTTTTT 40\n"); + + if ((status = SSIAddPrimaryKeyToIndex(ssi, name, fh, &r_off, &d_off, 40)) != 0) + Die("SSIAddPrimaryKeyToIndex() failed: %s", SSIErrorString(status)); + if ((status = SSIAddSecondaryKeyToIndex(ssi, accession, name)) != 0) + Die("SSIAddSecondaryKeyToIndex() failed: %s", SSIErrorString(status)); + } + SSISetFileForSubseq(ssi, fh, 14, 10); + fclose(ofp); + + /* Write the index to tmp.ssi + */ + if ((status = SSIWriteIndex("tmp.ssi", ssi)) != 0) + Die("SSIWriteIndex() failed: %s", SSIErrorString(status)); + SSIFreeIndex(ssi); + + /* Now reopen the index and run some tests. + */ + exit(0); +} + + +#endif /* test driving code */ + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/ssi.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,189 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +#ifndef SSIH_INCLUDED +#define SSIH_INCLUDED + +/* ssi.h + * Database indexing (SSI format support) + * CVS $Id: ssi.h,v 1.7 2002/02/24 19:39:27 eddy Exp) + * + * See: ssi_format.tex in Docs/ + */ + +#include <stdio.h> +#include "squid.h" + +/* Limits + */ +#define SSI_MAXFILES 32767 /* 2^15-1 */ +#define SSI_MAXKEYS 2147483647L /* 2^31-1 */ +#define SSI_MAXRAM 200 /* allow 200MB indexes before external sort mode */ + +/* typedef: SSIOFFSET + * Use the union to save space, since the two offset types are + * mutually exclusive, controlled by "mode" + */ +struct ssioffset_s { + char mode; /* GSI_OFFSET_I32, for example */ + union { + sqd_uint32 i32; /* an offset that fseek() can use */ + sqd_uint64 i64; /* an offset that e.g. fseeko64() can use */ + } off; +}; +typedef struct ssioffset_s SSIOFFSET; +#define SSI_OFFSET_I32 0 +#define SSI_OFFSET_I64 1 + +/* Structure: SSIFILE + * xref: SSI API documentation in ssi-format.tex + */ +struct ssifile_s { + FILE *fp; /* open SSI index file */ + sqd_uint32 flags; /* optional behavior flags */ + sqd_uint16 nfiles; /* number of files = 16 bit int */ + sqd_uint32 nprimary; /* number of primary keys */ + sqd_uint32 nsecondary; /* number of secondary keys */ + sqd_uint32 flen; /* length of filenames (inc '\0') */ + sqd_uint32 plen; /* length of primary keys (inc '\0') */ + sqd_uint32 slen; /* length of secondary keys (inc '\0') */ + sqd_uint32 frecsize; /* # bytes in a file record */ + sqd_uint32 precsize; /* # bytes in a primary key record */ + sqd_uint32 srecsize; /* # bytes in a secondary key record */ + SSIOFFSET foffset; /* disk offset, start of file records */ + SSIOFFSET poffset; /* disk offset, start of pri key recs */ + SSIOFFSET soffset; /* disk offset, start of sec key recs */ + + char imode; /* mode for index file offsets, 32 v. 64 bit */ + char smode; /* mode for sequence file offsets, 32 v. 64 bit */ + + /* File information: + */ + char **filename; /* list of file names [0..nfiles-1] */ + sqd_uint32 *fileformat; /* file formats */ + sqd_uint32 *fileflags; /* optional per-file behavior flags */ + sqd_uint32 *bpl; /* bytes per line in file */ + sqd_uint32 *rpl; /* residues per line in file */ +}; +typedef struct ssifile_s SSIFILE; + +/* optional per-index behavior flags in SSIFILE structure's flags: + */ +#define SSI_USE64 1<<0 /* seq offsets are 64-bit */ +#define SSI_USE64_INDEX 1<<1 /* index file offsets are 64-bit */ + +/* optional per-file behavior flags in fileflags + */ +#define SSI_FAST_SUBSEQ 1<<0 /* can do subseq lookup in this file */ + +/* Structure: SSIINDEX + * + * Used when building up an index and writing it to disk + */ +struct ssipkey_s { /* Primary key data: */ + char *key; /* key name */ + sqd_uint16 fnum; /* file number */ + SSIOFFSET r_off; /* record offset */ + SSIOFFSET d_off; /* data offset */ + sqd_uint32 len; /* sequence length */ +}; +struct ssiskey_s { /* Secondary key data: */ + char *key; /* secondary key name */ + char *pkey; /* primary key name */ +}; +struct ssiindex_s { + int smode; /* sequence mode: SSI_OFFSET_I32 or _I64 */ + int imode; /* index mode: SSI_OFFSET_I32 or _I64 */ + int external; /* TRUE if pkeys and skeys are on disk */ + int max_ram; /* maximum RAM in MB before switching to external */ + + char **filenames; + sqd_uint32 *fileformat; + sqd_uint32 *bpl; + sqd_uint32 *rpl; + sqd_uint32 flen; /* length of longest filename, inc '\0' */ + sqd_uint16 nfiles; + + struct ssipkey_s *pkeys; + sqd_uint32 plen; /* length of longest pkey, including '\0' */ + sqd_uint32 nprimary; + char *ptmpfile; /* name of tmp file, for external sort mode */ + FILE *ptmp; /* handle on open ptmpfile */ + + struct ssiskey_s *skeys; + sqd_uint32 slen; /* length of longest skey, including '\0' */ + sqd_uint32 nsecondary; + char *stmpfile; /* name of tmp file, for external sort mode */ + FILE *stmp; /* handle on open ptmpfile */ +}; +typedef struct ssiindex_s SSIINDEX; + +/* These control malloc and realloc chunk sizes in the index + * construction code. + */ +#define SSI_FILE_BLOCK 10 +#define SSI_KEY_BLOCK 100 + +/* Error codes set by the API + */ +#define SSI_ERR_OK 0 +#define SSI_ERR_NODATA 1 /* no data? an fread() failed */ +#define SSI_ERR_NO_SUCH_KEY 2 /* that key's not in the index */ +#define SSI_ERR_MALLOC 3 +#define SSI_ERR_NOFILE 4 /* no such file? an fopen() failed */ +#define SSI_ERR_BADMAGIC 5 /* magic number mismatch in GSIOpen() */ +#define SSI_ERR_BADFORMAT 6 /* didn't read what I expected to fread() */ +#define SSI_ERR_NO64BIT 7 /* needed 64-bit support and didn't have it */ +#define SSI_ERR_SEEK_FAILED 8 /* an fseek() (or similar) failed */ +#define SSI_ERR_TELL_FAILED 9 /* an ftell() (or similar) failed */ +#define SSI_ERR_NO_SUBSEQS 10 /* fast subseq is disallowed */ +#define SSI_ERR_RANGE 11 /* subseq requested is out of range */ +#define SSI_ERR_BADARG 12 /* something wrong with a function argument */ +#define SSI_ERR_TOOMANY_FILES 13 /* ran out of range for files in an index */ +#define SSI_ERR_TOOMANY_KEYS 14 /* ran out of range for keys in an index */ +#define SSI_ERR_FWRITE 15 +#define SSI_ERR_EXTERNAL_SORT 16 /* external sort failed */ + +/* The SSI file reading API: + */ +extern int SSIOpen(char *filename, SSIFILE **ret_sfp); +extern int SSIGetOffsetByName(SSIFILE *sfp, char *key, int *ret_fh, + SSIOFFSET *ret_offset); +extern int SSIGetOffsetByNumber(SSIFILE *sfp, int n, int *ret_fh, + SSIOFFSET *ret_offset); +extern int SSIGetSubseqOffset(SSIFILE *sfp, char *key, int requested_start, + int *ret_fh, SSIOFFSET *record_offset, + SSIOFFSET *data_offset, int *ret_actual_start); +extern int SSISetFilePosition(FILE *fp, SSIOFFSET *offset); +extern int SSIFileInfo(SSIFILE *sfp, int fh, char **ret_filename, int *ret_format); +extern void SSIClose(SSIFILE *sfp); + +/* The SSI index file writing API: + */ +extern int SSIRecommendMode(char *file); +extern SSIINDEX *SSICreateIndex(int mode); +extern int SSIGetFilePosition(FILE *fp, int mode, SSIOFFSET *ret_offset); +extern int SSIAddFileToIndex(SSIINDEX *g, char *filename, int fmt, int *ret_fh); +extern int SSISetFileForSubseq(SSIINDEX *g, int fh, int bpl, int rpl); +extern int SSIAddPrimaryKeyToIndex(SSIINDEX *g, char *key, int fh, + SSIOFFSET *r_off, SSIOFFSET *d_off, + int L); +extern int SSIAddSecondaryKeyToIndex(SSIINDEX *g, char *key, char *pkey); +extern int SSIWriteIndex(char *file, SSIINDEX *g); +extern void SSIFreeIndex(SSIINDEX *g); + +/* The SSI misc. functions API: + */ +extern char *SSIErrorString(int n); + +/* The SSI debugging API: + */ +extern void SSIForceExternalSort(SSIINDEX *g); + +#endif /*SSIH_INCLUDED*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/stack.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,102 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* stack.c + * SRE, Thu Mar 3 10:08:48 1994 + * + * Implementation of generic stack structures. + * RCS $Id: stack.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: stack.c,v 1.2 1998/10/09 18:07:16 eddy Exp) + */ + +#include <stdlib.h> +#include "squid.h" + +#ifdef MEMDEBUG +#include "dbmalloc.h" +#endif + + +/************************************************************ + * intstack_s implementation. + * + * Functions: InitIntStack() - returns ptr to new stack + * PushIntStack() - (void) + * PopIntStack() - returns 1 on success, 0 if stack empty + * FreeIntStack() - returns number of elements free'd, or 0 if + * stack was empty. + * + * Implementation of the pushdown stack for storing single + * integers. + *************************************************************/ +struct intstack_s * +InitIntStack(void) +{ + struct intstack_s *stack; + + if ((stack = (struct intstack_s *) malloc (sizeof(struct intstack_s))) == NULL) + Die("Memory allocation failure at %s line %d", __FILE__, __LINE__); + stack->nxt = NULL; + return stack; +} +void +PushIntStack(struct intstack_s *stack, int data) +{ + struct intstack_s *new; + + if ((new = (struct intstack_s *) malloc (sizeof(struct intstack_s))) == NULL) + Die("Memory allocation failure at %s line %d", __FILE__, __LINE__); + new->data = data; + + new->nxt = stack->nxt; + stack->nxt = new; +} + +int +PopIntStack(struct intstack_s *stack, int *ret_data) +{ + struct intstack_s *old; + + if (stack->nxt == NULL) return 0; + + old = stack->nxt; + stack->nxt = old->nxt; + + *ret_data = old->data; + free(old); + return 1; +} + +void +ReverseIntStack(struct intstack_s *stack) +{ + struct intstack_s *old; + struct intstack_s *new; + + old = stack->nxt; + stack->nxt = NULL; + while (old != NULL) + { + new = old; /* remove one from top of old stack */ + old = old->nxt; + new->nxt = stack->nxt; /* push it onto new stack */ + stack->nxt = new; + } +} + +int +FreeIntStack( struct intstack_s *stack ) +{ + int data; + int count = 0; + + while (PopIntStack(stack, &data)) + count++; + free(stack); + return count; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/stockholm.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,627 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* stockholm.c + * SRE, Fri May 28 15:46:41 1999 + * + * Reading/writing of Stockholm format multiple sequence alignments. + * + * example of API: + * + * MSA *msa; + * FILE *fp; -- opened for write with fopen() + * MSAFILE *afp; -- opened for read with MSAFileOpen() + * + * while ((msa = ReadStockholm(afp)) != NULL) + * { + * WriteStockholm(fp, msa); + * MSAFree(msa); + * } + * + * RCS $Id: stockholm.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: stockholm.c,v 1.7 2002/10/12 04:40:36 eddy Exp) + */ +#include <stdio.h> +#include <string.h> +#include "squid.h" +#include "msa.h" + +static int parse_gf(MSA *msa, char *buf); +static int parse_gs(MSA *msa, char *buf); +static int parse_gc(MSA *msa, char *buf); +static int parse_gr(MSA *msa, char *buf); +static int parse_comment(MSA *msa, char *buf); +static int parse_sequence(MSA *msa, char *buf); +static void actually_write_stockholm(FILE *fp, MSA *msa, int cpl); + +#ifdef TESTDRIVE_STOCKHOLM +/***************************************************************** + * stockholm.c test driver: + * cc -DTESTDRIVE_STOCKHOLM -g -O2 -Wall -o test stockholm.c msa.c gki.c sqerror.c sre_string.c file.c hsregex.c sre_math.c sre_ctype.c -lm + * + */ +int +main(int argc, char **argv) +{ + MSAFILE *afp; + MSA *msa; + char *file; + + file = argv[1]; + + if ((afp = MSAFileOpen(file, MSAFILE_STOCKHOLM, NULL)) == NULL) + Die("Couldn't open %s\n", file); + + while ((msa = ReadStockholm(afp)) != NULL) + { + WriteStockholm(stdout, msa); + MSAFree(msa); + } + + MSAFileClose(afp); + exit(0); +} +/******************************************************************/ +#endif /* testdriver */ + + +/* Function: ReadStockholm() + * Date: SRE, Fri May 21 17:33:10 1999 [St. Louis] + * + * Purpose: Parse the next alignment from an open Stockholm + * format alignment file. Return the alignment, or + * NULL if there are no more alignments in the file. + * + * Args: afp - open alignment file + * + * Returns: MSA * - an alignment object. + * caller responsible for an MSAFree() + * NULL if no more alignments + * + * Diagnostics: + * Will Die() here with a (potentially) useful message + * if a parsing error occurs + */ +MSA * +ReadStockholm(MSAFILE *afp) +{ + MSA *msa; + char *s; + int status; + + if (feof(afp->f)) return NULL; + + /* Initialize allocation of the MSA. + */ + msa = MSAAlloc(10, 0); + + /* Check the magic Stockholm header line. + * We have to skip blank lines here, else we perceive + * trailing blank lines in a file as a format error when + * reading in multi-record mode. + */ + do { + if ((s = MSAFileGetLine(afp)) == NULL) { + MSAFree(msa); + return NULL; + } + } while (IsBlankline(s)); + + if (strncmp(s, "# STOCKHOLM 1.", 14) != 0) + Die("\ +File %s doesn't appear to be in Stockholm format.\n\ +Assuming there isn't some other problem with your file (it is an\n\ +alignment file, right?), please either:\n\ + a) use the Babelfish format autotranslator option (-B, usually);\n\ + b) specify the file's format with the --informat option; or\n\ + a) reformat the alignment to Stockholm format.\n", + afp->fname); + + /* Read the alignment file one line at a time. + */ + while ((s = MSAFileGetLine(afp)) != NULL) + { + while (*s == ' ' || *s == '\t') s++; /* skip leading whitespace */ + + if (*s == '#') { + if (strncmp(s, "#=GF", 4) == 0) status = parse_gf(msa, s); + else if (strncmp(s, "#=GS", 4) == 0) status = parse_gs(msa, s); + else if (strncmp(s, "#=GC", 4) == 0) status = parse_gc(msa, s); + else if (strncmp(s, "#=GR", 4) == 0) status = parse_gr(msa, s); + else status = parse_comment(msa, s); + } + else if (strncmp(s, "//", 2) == 0) break; + else if (*s == '\n') continue; + else status = parse_sequence(msa, s); + + if (status == 0) + Die("Stockholm format parse error: line %d of file %s while reading alignment %s", + afp->linenumber, afp->fname, msa->name == NULL? "" : msa->name); + } + + if (s == NULL && msa->nseq != 0) + Die ("Didn't find // at end of alignment %s", msa->name == NULL ? "" : msa->name); + + if (s == NULL && msa->nseq == 0) { + /* probably just some junk at end of file */ + MSAFree(msa); + return NULL; + } + + MSAVerifyParse(msa); + return msa; +} + + +/* Function: WriteStockholm() + * Date: SRE, Mon May 31 19:15:22 1999 [St. Louis] + * + * Purpose: Write an alignment in standard multi-block + * Stockholm format to an open file. A wrapper + * for actually_write_stockholm(). + * + * Args: fp - file that's open for writing + * msa - alignment to write + * + * Returns: (void) + */ +void +WriteStockholm(FILE *fp, MSA *msa) +{ + actually_write_stockholm(fp, msa, 50); /* 50 char per block */ +} + +/* Function: WriteStockholmOneBlock() + * Date: SRE, Mon May 31 19:15:22 1999 [St. Louis] + * + * Purpose: Write an alignment in Pfam's single-block + * Stockholm format to an open file. A wrapper + * for actually_write_stockholm(). + * + * Args: fp - file that's open for writing + * msa - alignment to write + * + * Returns: (void) + */ +void +WriteStockholmOneBlock(FILE *fp, MSA *msa) +{ + actually_write_stockholm(fp, msa, msa->alen); /* one big block */ +} + + +/* Function: actually_write_stockholm() + * Date: SRE, Fri May 21 17:39:22 1999 [St. Louis] + * + * Purpose: Write an alignment in Stockholm format to + * an open file. This is the function that actually + * does the work. The API's WriteStockholm() + * and WriteStockholmOneBlock() are wrappers. + * + * Args: fp - file that's open for writing + * msa - alignment to write + * cpl - characters to write per line in alignment block + * + * Returns: (void) + */ +static void +actually_write_stockholm(FILE *fp, MSA *msa, int cpl) +{ + int i, j; + int len = 0; + int namewidth; + int typewidth = 0; /* markup tags are up to 5 chars long */ + int markupwidth = 0; /* #=GR, #=GC are four char wide + 1 space */ + char *buf; + int currpos; + char *s, *tok; + + /* Figure out how much space we need for name + markup + * to keep the alignment in register. Required by Stockholm + * spec, even though our Stockholm parser doesn't care (Erik's does). + */ + namewidth = 0; + for (i = 0; i < msa->nseq; i++) + if ((len = strlen(msa->sqname[i])) > namewidth) + namewidth = len; + + /* Figure out how much space we need for markup tags + * markupwidth = always 4 if we're doing markup: strlen("#=GR") + * typewidth = longest markup tag + */ + if (msa->ss != NULL) { markupwidth = 4; typewidth = 2; } + if (msa->sa != NULL) { markupwidth = 4; typewidth = 2; } + for (i = 0; i < msa->ngr; i++) + if ((len = strlen(msa->gr_tag[i])) > typewidth) typewidth = len; + + if (msa->rf != NULL) { markupwidth = 4; if (typewidth < 2) typewidth = 2; } + if (msa->ss_cons != NULL) { markupwidth = 4; if (typewidth < 7) typewidth = 7; } + if (msa->sa_cons != NULL) { markupwidth = 4; if (typewidth < 7) typewidth = 7; } + for (i = 0; i < msa->ngc; i++) + if ((len = strlen(msa->gc_tag[i])) > typewidth) typewidth = len; + + buf = MallocOrDie(sizeof(char) * (cpl+namewidth+typewidth+markupwidth+61)); + + /* Magic Stockholm header + */ + fprintf(fp, "# STOCKHOLM 1.0\n"); + + /* Free text comments + */ + for (i = 0; i < msa->ncomment; i++) + fprintf(fp, "# %s\n", msa->comment[i]); + if (msa->ncomment > 0) fprintf(fp, "\n"); + + /* GF section: per-file annotation + */ + if (msa->name != NULL) fprintf(fp, "#=GF ID %s\n", msa->name); + if (msa->acc != NULL) fprintf(fp, "#=GF AC %s\n", msa->acc); + if (msa->desc != NULL) fprintf(fp, "#=GF DE %s\n", msa->desc); + if (msa->au != NULL) fprintf(fp, "#=GF AU %s\n", msa->au); + + /* Thresholds are hacky. Pfam has two. Rfam has one. + */ + if (msa->cutoff_is_set[MSA_CUTOFF_GA1] && msa->cutoff_is_set[MSA_CUTOFF_GA2]) + fprintf(fp, "#=GF GA %.1f %.1f\n", msa->cutoff[MSA_CUTOFF_GA1], msa->cutoff[MSA_CUTOFF_GA2]); + else if (msa->cutoff_is_set[MSA_CUTOFF_GA1]) + fprintf(fp, "#=GF GA %.1f\n", msa->cutoff[MSA_CUTOFF_GA1]); + if (msa->cutoff_is_set[MSA_CUTOFF_NC1] && msa->cutoff_is_set[MSA_CUTOFF_NC2]) + fprintf(fp, "#=GF NC %.1f %.1f\n", msa->cutoff[MSA_CUTOFF_NC1], msa->cutoff[MSA_CUTOFF_NC2]); + else if (msa->cutoff_is_set[MSA_CUTOFF_NC1]) + fprintf(fp, "#=GF NC %.1f\n", msa->cutoff[MSA_CUTOFF_NC1]); + if (msa->cutoff_is_set[MSA_CUTOFF_TC1] && msa->cutoff_is_set[MSA_CUTOFF_TC2]) + fprintf(fp, "#=GF TC %.1f %.1f\n", msa->cutoff[MSA_CUTOFF_TC1], msa->cutoff[MSA_CUTOFF_TC2]); + else if (msa->cutoff_is_set[MSA_CUTOFF_TC1]) + fprintf(fp, "#=GF TC %.1f\n", msa->cutoff[MSA_CUTOFF_TC1]); + + for (i = 0; i < msa->ngf; i++) + fprintf(fp, "#=GF %-5s %s\n", msa->gf_tag[i], msa->gf[i]); + fprintf(fp, "\n"); + + + /* GS section: per-sequence annotation + */ + if (msa->flags & MSA_SET_WGT) + { + for (i = 0; i < msa->nseq; i++) + fprintf(fp, "#=GS %-*.*s WT %.2f\n", namewidth, namewidth, msa->sqname[i], msa->wgt[i]); + fprintf(fp, "\n"); + } + if (msa->sqacc != NULL) + { + for (i = 0; i < msa->nseq; i++) + if (msa->sqacc[i] != NULL) + fprintf(fp, "#=GS %-*.*s AC %s\n", namewidth, namewidth, msa->sqname[i], msa->sqacc[i]); + fprintf(fp, "\n"); + } + if (msa->sqdesc != NULL) + { + for (i = 0; i < msa->nseq; i++) + if (msa->sqdesc[i] != NULL) + fprintf(fp, "#=GS %*.*s DE %s\n", namewidth, namewidth, msa->sqname[i], msa->sqdesc[i]); + fprintf(fp, "\n"); + } + for (i = 0; i < msa->ngs; i++) + { + /* Multiannotated GS tags are possible; for example, + * #=GS foo DR PDB; 1xxx; + * #=GS foo DR PDB; 2yyy; + * These are stored, for example, as: + * msa->gs[0][0] = "PDB; 1xxx;\nPDB; 2yyy;" + * and must be decomposed. + */ + for (j = 0; j < msa->nseq; j++) + if (msa->gs[i][j] != NULL) + { + s = msa->gs[i][j]; + while ((tok = sre_strtok(&s, "\n", NULL)) != NULL) + fprintf(fp, "#=GS %*.*s %5s %s\n", namewidth, namewidth, + msa->sqname[j], msa->gs_tag[i], tok); + } + fprintf(fp, "\n"); + } + + /* Alignment section: + * contains aligned sequence, #=GR annotation, and #=GC annotation + */ + for (currpos = 0; currpos < msa->alen; currpos += cpl) + { + if (currpos > 0) fprintf(fp, "\n"); + for (i = 0; i < msa->nseq; i++) + { + strncpy(buf, msa->aseq[i] + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "%-*.*s %s\n", namewidth+typewidth+markupwidth, namewidth+typewidth+markupwidth, + msa->sqname[i], buf); + + if (msa->ss != NULL && msa->ss[i] != NULL) { + strncpy(buf, msa->ss[i] + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "#=GR %-*.*s SS %s\n", namewidth, namewidth, msa->sqname[i], buf); + } + if (msa->sa != NULL && msa->sa[i] != NULL) { + strncpy(buf, msa->sa[i] + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "#=GR %-*.*s SA %s\n", namewidth, namewidth, msa->sqname[i], buf); + } + for (j = 0; j < msa->ngr; j++) + if (msa->gr[j][i] != NULL) { + strncpy(buf, msa->gr[j][i] + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "#=GR %-*.*s %5s %s\n", + namewidth, namewidth, msa->sqname[i], msa->gr_tag[j], buf); + } + } + if (msa->ss_cons != NULL) { + strncpy(buf, msa->ss_cons + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "#=GC %-*.*s %s\n", namewidth+typewidth, namewidth+typewidth, "SS_cons", buf); + } + + if (msa->sa_cons != NULL) { + strncpy(buf, msa->sa_cons + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "#=GC %-*.*s %s\n", namewidth+typewidth, namewidth+typewidth, "SA_cons", buf); + } + + if (msa->rf != NULL) { + strncpy(buf, msa->rf + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "#=GC %-*.*s %s\n", namewidth+typewidth, namewidth+typewidth, "RF", buf); + } + for (j = 0; j < msa->ngc; j++) { + strncpy(buf, msa->gc[j] + currpos, cpl); + buf[cpl] = '\0'; + fprintf(fp, "#=GC %-*.*s %s\n", namewidth+typewidth, namewidth+typewidth, + msa->gc_tag[j], buf); + } + } + fprintf(fp, "//\n"); + free(buf); +} + + + + + +/* Format of a GF line: + * #=GF <featurename> <text> + */ +static int +parse_gf(MSA *msa, char *buf) +{ + char *gf; + char *featurename; + char *text; + char *s; + + s = buf; + if ((gf = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((featurename = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((text = sre_strtok(&s, "\n", NULL)) == NULL) return 0; + while (*text && (*text == ' ' || *text == '\t')) text++; + + if (strcmp(featurename, "ID") == 0) + msa->name = sre_strdup(text, -1); + else if (strcmp(featurename, "AC") == 0) + msa->acc = sre_strdup(text, -1); + else if (strcmp(featurename, "DE") == 0) + msa->desc = sre_strdup(text, -1); + else if (strcmp(featurename, "AU") == 0) + msa->au = sre_strdup(text, -1); + else if (strcmp(featurename, "GA") == 0) + { /* Pfam has GA1, GA2. Rfam just has GA1. */ + s = text; + if ((text = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + msa->cutoff[MSA_CUTOFF_GA1] = atof(text); + msa->cutoff_is_set[MSA_CUTOFF_GA1] = TRUE; + if ((text = sre_strtok(&s, WHITESPACE, NULL)) != NULL) { + msa->cutoff[MSA_CUTOFF_GA2] = atof(text); + msa->cutoff_is_set[MSA_CUTOFF_GA2] = TRUE; + } + } + else if (strcmp(featurename, "NC") == 0) + { + s = text; + if ((text = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + msa->cutoff[MSA_CUTOFF_NC1] = atof(text); + msa->cutoff_is_set[MSA_CUTOFF_NC1] = TRUE; + if ((text = sre_strtok(&s, WHITESPACE, NULL)) != NULL) { + msa->cutoff[MSA_CUTOFF_NC2] = atof(text); + msa->cutoff_is_set[MSA_CUTOFF_NC2] = TRUE; + } + } + else if (strcmp(featurename, "TC") == 0) + { + s = text; + if ((text = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + msa->cutoff[MSA_CUTOFF_TC1] = atof(text); + msa->cutoff_is_set[MSA_CUTOFF_TC1] = TRUE; + if ((text = sre_strtok(&s, WHITESPACE, NULL)) != NULL) { + msa->cutoff[MSA_CUTOFF_TC2] = atof(text); + msa->cutoff_is_set[MSA_CUTOFF_TC2] = TRUE; + } + } + else + MSAAddGF(msa, featurename, text); + + return 1; +} + + +/* Format of a GS line: + * #=GS <seqname> <featurename> <text> + */ +static int +parse_gs(MSA *msa, char *buf) +{ + char *gs; + char *seqname; + char *featurename; + char *text; + int seqidx; + char *s; + + s = buf; + if ((gs = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((seqname = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((featurename = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((text = sre_strtok(&s, "\n", NULL)) == NULL) return 0; + while (*text && (*text == ' ' || *text == '\t')) text++; + + /* GS usually follows another GS; guess lastidx+1 + */ + seqidx = MSAGetSeqidx(msa, seqname, msa->lastidx+1); + msa->lastidx = seqidx; + + if (strcmp(featurename, "WT") == 0) + { + msa->wgt[seqidx] = atof(text); + msa->flags |= MSA_SET_WGT; + } + + else if (strcmp(featurename, "AC") == 0) + MSASetSeqAccession(msa, seqidx, text); + + else if (strcmp(featurename, "DE") == 0) + MSASetSeqDescription(msa, seqidx, text); + + else + MSAAddGS(msa, featurename, seqidx, text); + + return 1; +} + +/* Format of a GC line: + * #=GC <featurename> <text> + */ +static int +parse_gc(MSA *msa, char *buf) +{ + char *gc; + char *featurename; + char *text; + char *s; + int len; + + s = buf; + if ((gc = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((featurename = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((text = sre_strtok(&s, WHITESPACE, &len)) == NULL) return 0; + + if (strcmp(featurename, "SS_cons") == 0) + sre_strcat(&(msa->ss_cons), -1, text, len); + else if (strcmp(featurename, "SA_cons") == 0) + sre_strcat(&(msa->sa_cons), -1, text, len); + else if (strcmp(featurename, "RF") == 0) + sre_strcat(&(msa->rf), -1, text, len); + else + MSAAppendGC(msa, featurename, text); + + return 1; +} + +/* Format of a GR line: + * #=GR <seqname> <featurename> <text> + */ +static int +parse_gr(MSA *msa, char *buf) +{ + char *gr; + char *seqname; + char *featurename; + char *text; + int seqidx; + int len; + int j; + char *s; + + s = buf; + if ((gr = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((seqname = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((featurename = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((text = sre_strtok(&s, WHITESPACE, &len)) == NULL) return 0; + + /* GR usually follows sequence it refers to; guess msa->lastidx */ + seqidx = MSAGetSeqidx(msa, seqname, msa->lastidx); + msa->lastidx = seqidx; + + if (strcmp(featurename, "SS") == 0) + { + if (msa->ss == NULL) + { + msa->ss = MallocOrDie(sizeof(char *) * msa->nseqalloc); + msa->sslen = MallocOrDie(sizeof(int) * msa->nseqalloc); + for (j = 0; j < msa->nseqalloc; j++) + { + msa->ss[j] = NULL; + msa->sslen[j] = 0; + } + } + msa->sslen[seqidx] = sre_strcat(&(msa->ss[seqidx]), msa->sslen[seqidx], text, len); + } + else if (strcmp(featurename, "SA") == 0) + { + if (msa->sa == NULL) + { + msa->sa = MallocOrDie(sizeof(char *) * msa->nseqalloc); + msa->salen = MallocOrDie(sizeof(int) * msa->nseqalloc); + for (j = 0; j < msa->nseqalloc; j++) + { + msa->sa[j] = NULL; + msa->salen[j] = 0; + } + } + msa->salen[seqidx] = sre_strcat(&(msa->sa[seqidx]), msa->salen[seqidx], text, len); + } + else + MSAAppendGR(msa, featurename, seqidx, text); + + return 1; +} + + +/* comments are simply stored verbatim, not parsed + */ +static int +parse_comment(MSA *msa, char *buf) +{ + char *s; + char *comment; + + s = buf + 1; /* skip leading '#' */ + if (*s == '\n') { *s = '\0'; comment = s; } /* deal with blank comment */ + else if ((comment = sre_strtok(&s, "\n", NULL)) == NULL) return 0; + + MSAAddComment(msa, comment); + return 1; +} + +static int +parse_sequence(MSA *msa, char *buf) +{ + char *s; + char *seqname; + char *text; + int seqidx; + int len; + + s = buf; + if ((seqname = sre_strtok(&s, WHITESPACE, NULL)) == NULL) return 0; + if ((text = sre_strtok(&s, WHITESPACE, &len)) == NULL) return 0; + + /* seq usually follows another seq; guess msa->lastidx +1 */ + seqidx = MSAGetSeqidx(msa, seqname, msa->lastidx+1); + msa->lastidx = seqidx; + + msa->sqlen[seqidx] = sre_strcat(&(msa->aseq[seqidx]), msa->sqlen[seqidx], text, len); + return 1; +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/stockholm.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,51 @@ +#ifndef STOCKHOLM_H_INCLUDED +#define STOCKHOLM_H_INCLUDED + +#include "gki.h" + +typedef struct { + int *linetype; /* e.g. STOCKHOLM_GF_LINE; always valid */ + int *featurecode; /* all markup codes: e.g. STOCKHOLM_GF_ID; + nonmarkup: always set to STOCKHOLM_UNPARSED */ + char **featurename; /* all unparsed markup codes: string, e.g. "ID"; + all other lines: NULL */ + int *seqidx; /* all GS, GR, GC, sequence lines: which sequence; + other lines: 0 */ + int *len; /* all GR, GC, sequence lines: length of text field; + other lines: 0 */ + char **text; /* all unparsed nonblank lines: rest of data + other lines: NULL */ + int nseqalloc; /* current nseqs allocated for in aseqs and ainfo */ + int nlines; /* number of lines in this skel */ + int nlinealloc; /* current # of lines allocated for in this skel */ + int overall_line; /* line # in file (important in files w/ >1 ali)*/ +} alifile_skeleton; + +#define STOCKHOLM_GF_LINE 0 +#define STOCKHOLM_GS_LINE 1 +#define STOCKHOLM_GC_LINE 2 +#define STOCKHOLM_GR_LINE 3 +#define STOCKHOLM_SEQ_LINE 4 +#define STOCKHOLM_BLANK_LINE 5 +#define STOCKHOLM_COMMENT_LINE 6 + +#define STOCKHOLM_UNPARSED 0 +#define STOCKHOLM_GF_ID 1 +#define STOCKHOLM_GF_AC 2 +#define STOCKHOLM_GF_DE 3 +#define STOCKHOLM_GF_AU 4 +#define STOCKHOLM_GF_GA 5 +#define STOCKHOLM_GF_NC 6 +#define STOCKHOLM_GF_TC 7 +#define STOCKHOLM_GS_WT 100 +#define STOCKHOLM_GS_AC 101 +#define STOCKHOLM_GS_DE 102 +#define STOCKHOLM_GC_CS 200 +#define STOCKHOLM_GC_RF 201 +#define STOCKHOLM_GR_SS 300 +#define STOCKHOLM_GR_SA 301 + +#define SKEL_NSEQLUMP 10 /* allocate for new seqs in blocks of this size */ +#define SKEL_LUMPSIZE 100 /* allocate for new lines in skel in blocks of this size */ + +#endif /*STOCKHOLM_H_INCLUDED*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/stopwatch.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,306 @@ +/************************************************************ + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + ************************************************************/ + +/* stopwatch.c + * SRE, Fri Nov 26 14:54:21 1999 [St. Louis] [HMMER] + * SRE, Thu Aug 3 08:11:52 2000 [St. Louis] [moved to SQUID] + * + * Reporting of cpu/system/elapsed time used by a process. + * thanks to Warren Gish for assistance. + * + * Basic API: + * + * Stopwatch_t *w; + * w = StopwatchCreate(); + * + * StopwatchStart(w); + * do_lots_of_stuff; + * StopwatchStop(w); + * StopwatchDisplay(stdout, "CPU time: ", w); + * + * StopwatchFree(w); + * + * Some behavior can be controlled at compile time by #define's: + * + * SRE_STRICT_ANSI: By default, stopwatch module assumes that a + * machine is POSIX-compliant (e.g. has struct tms, sys/times.h, + * and times()). If compiled with -DSRE_STRICT_ANSI, reverts to + * pure ANSI C conformant implementation. This simpler system + * won't report system times, only user and elapsed times. + * + * SRE_ENABLE_PVM: If compiled with -DSRE_ENABLE_PVM, the + * functions StopwatchPVMPack() and StopwatchPVMUnpack() + * are compiled, providing PVM communications ability. + * + * One additional compile-time configuration note: + * PTHREAD_TIMES_HACK: Linux pthreads, as of RH6.0/glibc-devel-2.1.1-6, + * appears to interact poorly with times() -- usage times in all + * but the master thread are lost. A workaround for this bug is + * to run stopwatches in each worker thread, and accumulate those + * times back into the master stopwatch using StopwatchInclude(). + * (Just like a PVM implementation has to do.) In HMMER, this + * behavior is compiled in with -DPTHREAD_TIMES_HACK. No + * changes are made in stopwatch functions themselves, though; + * all the extra code is HMMER code. See hmmcalibrate.c for + * an example. + * + * See hmmcalibrate.c for examples of more complex usage + * in dealing with pthreads and PVM. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#ifdef SRE_ENABLE_PVM +#include <pvm3.h> +#endif + +#include "stopwatch.h" + +/* Function: format_time_string() + * Date: SRE, Fri Nov 26 15:06:28 1999 [St. Louis] + * + * Purpose: Given a number of seconds, format into + * hh:mm:ss.xx in a provided buffer. + * + * Args: buf - allocated space (128 is plenty!) + * sec - number of seconds + * do_frac - TRUE (1) to include hundredths of a sec + */ +static void +format_time_string(char *buf, double sec, int do_frac) +{ + int h, m, s, hs; + + h = (int) (sec / 3600.); + m = (int) (sec / 60.) - h * 60; + s = (int) (sec) - h * 3600 - m * 60; + if (do_frac) { + hs = (int) (sec * 100.) - h * 360000 - m * 6000 - s * 100; + sprintf(buf, "%02d:%02d:%02d.%02d", h,m,s,hs); + } else { + sprintf(buf, "%02d:%02d:%02d", h,m,s); + } +} + +/* Function: StopwatchStart() + * Date: SRE, Fri Nov 26 15:07:48 1999 [St. Louis] + * + * Purpose: Start a stopwatch. + * + * Args: w - the watch + */ +void +StopwatchStart(Stopwatch_t *w) +{ + w->t0 = time(NULL); +#ifdef SRE_STRICT_ANSI + w->cpu0 = clock(); +#else + (void) times(&(w->cpu0)); +#endif + + w->elapsed = 0.; + w->user = 0.; + w->sys = 0.; +} + +/* Function: StopwatchStop() + * Date: SRE, Fri Nov 26 15:08:16 1999 [St. Louis] + * + * Purpose: Stop a stopwatch. + * + * The implementation allows "split times": + * you can stop a watch multiple times, reporting + * times at multiple points during program + * execution. + * + * Args: w - the watch + */ +void +StopwatchStop(Stopwatch_t *w) +{ + time_t t1; +#ifdef SRE_STRICT_ANSI + clock_t cpu1; +#else + struct tms cpu1; + long clk_tck; +#endif + + t1 = time(NULL); + w->elapsed = difftime(t1, w->t0); + +#ifdef SRE_STRICT_ANSI + cpu1 = clock(); + w->user = (double) (cpu1- w->cpu0) / (double) CLOCKS_PER_SEC; + w->sys = 0.; /* no way to portably get system time in ANSI C */ + +#else /* assume we're on a POSIX system by default */ + (void) times(&cpu1); + + clk_tck = sysconf(_SC_CLK_TCK); + w->user = (double) (cpu1.tms_utime + cpu1.tms_cutime - + w->cpu0.tms_utime - w->cpu0.tms_cutime) / + (double) clk_tck; + + w->sys = (double) (cpu1.tms_stime + cpu1.tms_cstime - + w->cpu0.tms_stime - w->cpu0.tms_cstime) / + (double) clk_tck; +#endif +} + +/* Function: StopwatchInclude() + * Date: SRE, Fri Nov 26 15:09:34 1999 [St. Louis] + * + * Purpose: Merge the cpu and system times from a slave into + * a master stopwatch. Both watches must be + * stopped, and should not be stopped again unless + * You Know What You're Doing. + * + * Elapsed time is *not* merged; master is assumed + * to be keeping track of the wall clock time, + * and the slave/worker watch is ignored. + * + * Used in two cases: + * 1) PVM; merge in the stopwatch(es) from separate + * process(es) in a cluster. + * 2) Threads, for broken pthreads/times() implementations + * that lose track of cpu times used by spawned + * threads. + * + * Args: w1 - the master stopwatch + * w2 - the slave/worker watch + * + */ +void +StopwatchInclude(Stopwatch_t *w1, Stopwatch_t *w2) +{ + w1->user += w2->user; + w1->sys += w2->sys; +} + +/* Function: StopwatchAlloc(), StopwatchZero(), StopwatchCopy(), + * StopwatchFree() + * Date: SRE, Fri Nov 26 15:13:14 1999 [St. Louis] + * + * Purpose: The usual creation/manipulation/destruction routines + * for a stopwatch object. + */ +Stopwatch_t * +StopwatchCreate(void) +{ + Stopwatch_t *w; + w = malloc(sizeof(Stopwatch_t)); + return w; +} +void +StopwatchZero(Stopwatch_t *w) +{ + w->elapsed = 0.; + w->user = 0.; + w->sys = 0.; +} +void +StopwatchCopy(Stopwatch_t *w1, Stopwatch_t *w2) +{ + w1->t0 = w2->t0; +#ifdef SRE_STRICT_ANSI + w1->cpu0 = w2->cpu0; +#else + w1->cpu0.tms_utime = w2->cpu0.tms_utime; + w1->cpu0.tms_stime = w2->cpu0.tms_stime; + w1->cpu0.tms_cutime = w2->cpu0.tms_cutime; + w1->cpu0.tms_cstime = w2->cpu0.tms_cstime; +#endif + w1->elapsed = w2->elapsed; + w1->user = w2->user; + w1->sys = w2->sys; +} +void +StopwatchFree(Stopwatch_t *w) +{ + free(w); +} + + +/* Function: StopwatchDisplay() + * Date: SRE, Fri Nov 26 15:14:12 1999 [St. Louis] + * + * Purpose: Output a usage summary line from a *stopped* + * stopwatch (the times will reflect the last + * time StopwatchStop() was called.) + * + * For s = "CPU Time: " an example output line is: + * CPU Time: 142.55u 7.17s 149.72 Elapsed: 00:02:35.00 + * + * Args: fp - open file for writing (stdout, possibly) + * s - prefix for the report line + * w - a (recently stopped) stopwatch + * + */ +void +StopwatchDisplay(FILE *fp, char *s, Stopwatch_t *w) +{ + char buf[128]; /* (safely holds up to 10^14 years) */ + + if (s == NULL) + fputs("CPU Time: ", fp); + else + fputs(s, fp); + + format_time_string(buf, w->user+w->sys, 1); +#ifdef SRE_STRICT_ANSI + fprintf(fp, "%.2fu %s ", w->user, buf); +#else + fprintf(fp, "%.2fu %.2fs %s ", w->user, w->sys, buf); +#endif + + format_time_string(buf, w->elapsed, 0); + fprintf(fp, "Elapsed: %s\n", buf); +} + +#ifdef SRE_ENABLE_PVM +/* Function: StopwatchPVMPack(), StopwatchPVMUnpack() + * Date: SRE, Fri Nov 26 15:22:04 1999 [St. Louis] + * + * Purpose: Transmission of stopwatch data in a PVM + * cluster. + */ +void +StopwatchPVMPack(Stopwatch_t *w) +{ + pvm_pkdouble(&(w->elapsed), 1, 1); + pvm_pkdouble(&(w->user), 1, 1); + pvm_pkdouble(&(w->sys), 1, 1); +} +void +StopwatchPVMUnpack(Stopwatch_t *w) +{ + pvm_upkdouble(&(w->elapsed), 1, 1); + pvm_upkdouble(&(w->user), 1, 1); + pvm_upkdouble(&(w->sys), 1, 1); +} +#endif /*SRE_ENABLE_PVM*/ + + +#ifdef TESTDRIVER +int +main(int argc, char **argv) +{ + Stopwatch_t stopwatch; + + StopwatchStart(&stopwatch); + + sleep(5); + + StopwatchStop(&stopwatch); + StopwatchDisplay(stdout, "CPU Time: ", &stopwatch); +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/stopwatch.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,58 @@ +/* stopwatch.h + * SRE, Fri Nov 26 14:54:21 1999 [St. Louis] [HMMER] + * SRE, Thu Aug 3 08:00:35 2000 [St. Louis] [moved to SQUID] + * CVS $Id: stopwatch.h,v 1.2 2000/08/03 22:24:38 eddy Exp) + * + * Header file for stopwatch.c module: + * reporting of cpu/system/elapsed time used by a process. + * See stopwatch.c comments for documentation of compile-time + * configuration options and API. + * + ***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + ***************************************************************** + */ +#include <stdio.h> +#include <time.h> +#ifndef SRE_STRICT_ANSI +#include <sys/times.h> +#endif + +#ifndef STOPWATCH_H_INCLUDED +#define STOPWATCH_H_INCLUDED + +struct stopwatch_s { + time_t t0; /* Wall clock time, ANSI time() */ +#ifdef SRE_STRICT_ANSI + clock_t cpu0; /* CPU time, ANSI clock() */ +#else + struct tms cpu0; /* CPU/system time, POSIX times()*/ +#endif + + double elapsed; /* elapsed time, seconds */ + double user; /* CPU time, seconds */ + double sys; /* system time, seconds */ +}; +typedef struct stopwatch_s Stopwatch_t; + +extern void StopwatchStart(Stopwatch_t *w); +extern void StopwatchStop(Stopwatch_t *w); +extern void StopwatchInclude(Stopwatch_t *w1, Stopwatch_t *w2); +extern Stopwatch_t *StopwatchCreate(void); +extern void StopwatchZero(Stopwatch_t *w); +extern void StopwatchCopy(Stopwatch_t *w1, Stopwatch_t *w2); +extern void StopwatchFree(Stopwatch_t *w); +extern void StopwatchDisplay(FILE *fp, char *s, Stopwatch_t *w); + +#ifdef HMMER_PVM +extern void StopwatchPVMPack(Stopwatch_t *w); +extern void StopwatchPVMUnpack(Stopwatch_t *w); +#endif + +#endif /*STOPWATCH_H_INCLUDED*/ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/translate.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,86 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* + * translate.c - functions for translating nucleic acid sequence + * created Tue Jan 12 11:27:29 1993, SRE + * + * RCS $Id: translate.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: translate.c,v 1.2 1998/10/09 18:07:16 eddy Exp) + */ + +#include <stdio.h> +#include <string.h> +#include "squid.h" + + +#ifdef MEMDEBUG +#include "dbmalloc.h" +#endif + + + +/* Function: Translate(char *seq, char **code) + * + * Given a ptr to the start of a nucleic acid sequence, + * and a genetic code, translate the sequence into + * amino acid sequence. + * + * code is an array of 65 strings, representing + * the translations of the 64 codons, arranged + * in order AAA, AAC, AAG, AAU, ..., UUA, UUC, UUG, UUU. + * '*' or '***' is used to represent termination + * codons, usually. The final string, code[64], + * is the code for an ambiguous amino acid. + * + * Because of the way space is allocated for the amino + * acid sequence, the amino acid strings cannot be + * longer than 3 letters each. (I don't foresee using + * anything but the single- and triple- letter codes.) + * + * Returns a ptr to the translation string on success, + * or NULL on failure. + */ +char * +Translate(char *seq, char **code) +{ + int codon; /* index for codon */ + char *aaseq; /* RETURN: the translation */ + char *aaptr; /* ptr into aaseq */ + int i; + + if (seq == NULL) + { squid_errno = SQERR_NODATA; return NULL; } + if ((aaseq = (char *) calloc (strlen(seq) + 1, sizeof(char))) == NULL) + Die("calloc failed"); + + aaptr = aaseq; + for (; *seq != '\0' && *(seq+1) != '\0' && *(seq+2) != '\0'; seq += 3) + { + /* calculate the lookup value for + this codon */ + codon = 0; + for (i = 0; i < 3; i++) + { + codon *= 4; + switch (*(seq + i)) { + case 'A': case 'a': break; + case 'C': case 'c': codon += 1; break; + case 'G': case 'g': codon += 2; break; + case 'T': case 't': codon += 3; break; + case 'U': case 'u': codon += 3; break; + default: codon = 64; break; + } + if (codon == 64) break; + } + + strcpy(aaptr, code[codon]); + aaptr += strlen(code[codon]); + } + return aaseq; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/types.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,227 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* file: types.c + * + * Finicky type checkers for strings. Return 1 (TRUE) if ok, 0 elsewise. + * Also, finicky type converters (sre_ntoh32() and friends) + * + * CVS $Id: types.c,v 1.5 2001/01/08 22:58:12 eddy Exp) + */ + +#include <string.h> +#include <ctype.h> +#include "squid.h" + +/* Function: IsInt() + * + * Returns TRUE if s points to something that atoi() will parse + * completely and convert to an integer. + */ +int +IsInt(char *s) +{ + int hex = 0; + + if (s == NULL) {squid_errno = SQERR_PARAMETER; return 0; } + + /* skip whitespace */ + while (isspace((int) (*s))) s++; + /* skip leading sign */ + if (*s == '-' || *s == '+') s++; + /* skip leading conversion signals */ + if ((strncmp(s, "0x", 2) == 0 && (int) strlen(s) > 2) || + (strncmp(s, "0X", 2) == 0 && (int) strlen(s) > 2)) + { + s += 2; + hex = 1; + } + else if (*s == '0' && (int) strlen(s) > 1) + s++; + /* examine remainder for garbage chars */ + if (!hex) + while (*s != '\0') + { + if (!isdigit((int) (*s))) return 0; + s++; + } + else + while (*s != '\0') + { + if (!isxdigit((int) (*s))) return 0; + s++; + } + + return 1; +} + + +/* Function: IsReal() + * + * Purpose: Returns TRUE if s is a string representation + * of a valid floating point number. + */ +int +IsReal(char *s) +{ + int gotdecimal = 0; + int gotexp = 0; + int gotreal = 0; + + if (s == NULL) return 0; + + while (isspace((int) (*s))) s++; /* skip leading whitespace */ + if (*s == '-' || *s == '+') s++; /* skip leading sign */ + + /* Examine remainder for garbage. Allowed one '.' and + * one 'e' or 'E'; if both '.' and e/E occur, '.' + * must be first. + */ + while (*s != '\0') + { + if (isdigit((int) (*s))) + gotreal++; + else if (*s == '.') + { + if (gotdecimal) return 0; /* can't have two */ + if (gotexp) return 0; /* e/E preceded . */ + else gotdecimal++; + } + else if (*s == 'e' || *s == 'E') + { + if (gotexp) return 0; /* can't have two */ + else gotexp++; + } + else if (isspace((int) (*s))) + break; + + s++; + } + + while (isspace((int) (*s))) s++; /* skip trailing whitespace */ + if (*s == '\0' && gotreal) return 1; + else return 0; +} + + +/* Function: Byteswap() + * + * Purpose: Swap between big-endian and little-endian. + * For example: + * int foo = 0x12345678; + * byteswap((char *) &foo, sizeof(int)); + * printf("%x\n", foo) + * gives 78563412. + * + * I don't fully understand byte-swapping issues. + * However, I have tested this on chars through floats, + * on various machines: + * SGI IRIX 4.0.5, SunOS 4.1.3, DEC Alpha OSF/1, Alliant + * + * Date: Sun Feb 12 10:26:22 1995 + */ +void +Byteswap(char *swap, int nbytes) +{ + int x; + char byte; + + for (x = 0; x < nbytes / 2; x++) + { + byte = swap[nbytes - x - 1]; + swap[nbytes - x - 1] = swap[x]; + swap[x] = byte; + } +} + + + +/* Functions: sre_ntoh16(), etc. + * Date: SRE, Sun Dec 31 11:26:53 2000 [St. Louis] + * + * Purpose: Provide functionality of ntohs(), etc; extended + * to 64-bit unsigned ints, and explicitly provided + * in case a machine doesn't have the ntohs() + * family. + * + * If we're using the host functions, + * USE_HOST_BYTESWAP_FUNCTIONS was set to 1 in + * squidconf.h, and we #define'd sre_hton16(x)=hton(x), etc. + * in squid.h. In doing this, we assumed that the + * host functions work on 16- and 32-bit unsigned quantities. + * If for some reason that's not true, set + * USE_HOST_BYTESWAP_FUNCTIONS to 0. + */ +#ifndef USE_HOST_BYTESWAP_FUNCTIONS +sqd_uint16 +sre_ntoh16(sqd_uint16 netshort) +{ +#ifdef WORDS_BIGENDIAN + return netshort; +#else + Byteswap((char *) &netshort, 2); + return netshort; +#endif +} +sqd_uint32 +sre_ntoh32(sqd_uint32 netlong) +{ +#ifdef WORDS_BIGENDIAN + return netlong; +#else + Byteswap((char *) &netlong, 4); + return netlong; +#endif +} +sqd_uint16 +sre_hton16(sqd_uint16 hostshort) +{ +#ifdef WORDS_BIGENDIAN + return hostshort; +#else + Byteswap((char *) &hostshort, 2); + return hostshort; +#endif +} +sqd_uint32 +sre_hton32(sqd_uint32 hostlong) +{ +#ifdef WORDS_BIGENDIAN + return hostlong; +#else + Byteswap((char *) &hostlong, 4); + return hostlong; +#endif +} +#endif /*USE_HOST_BYTESWAP_FUNCTIONS*/ + +sqd_uint64 +sre_ntoh64(sqd_uint64 net_int64) +{ +#ifdef WORDS_BIGENDIAN + return net_int64; +#else + Byteswap((char *) &net_int64, 8); + return net_int64; +#endif +} +sqd_uint64 +sre_hton64(sqd_uint64 host_int64) +{ +#ifdef WORDS_BIGENDIAN + return host_int64; +#else + Byteswap((char *) &host_int64, 8); + return host_int64; +#endif +} + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/vectorops.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,297 @@ +/* vectorops.c + * Operations on vectors of floats or doubles. + * + * DSet(), FSet() - set all items in vector to value. + * DScale(), FScale() - multiply all items in vector by scale + * DSum(), FSum() - return sum of values in vector + * DAdd(), FAdd() - add vec2 to vec1. + * DCopy(), FCopy() - set vec1 to be same as vec2. + * DDot(), FDot() - return dot product of two vectors. + * DMax(), FMax() - return value of maximum element in vector + * DMin(), FMin() - return value of minimum element in vector + * DArgMax(), FArgMax() - return index of maximum element in vector + * DArgMin(), FArgMin() - return index of minimum element in vector + * + * DNorm(), FNorm() - normalize a probability vector of length n. + * DLog(), FLog() - convert to log probabilities + * DExp(), FExp() - convert log p's back to probabilities + * DLogSum(), FLogSum() - given vector of log p's; return log of summed p's. + * + * SRE, Tue Oct 1 15:23:25 2002 [St. Louis] + * CVS $Id: vectorops.c,v 1.1 2002/10/09 14:26:09 eddy Exp) + */ + +#include <stdlib.h> +#include <math.h> +#include <float.h> +#include "vectorops.h" + +void +DSet(double *vec, int n, double value) +{ + int x; + for (x = 0; x < n; x++) vec[x] = value; +} + +void +FSet(float *vec, int n, float value) +{ + int x; + for (x = 0; x < n; x++) vec[x] = value; +} + +void +DScale(double *vec, int n, double scale) +{ + int x; + for (x = 0; x < n; x++) vec[x] *= scale; +} + +void +FScale(float *vec, int n, float scale) +{ + int x; + for (x = 0; x < n; x++) vec[x] *= scale; +} + +double +DSum(double *vec, int n) +{ + double sum = 0.; + int x; + for (x = 0; x < n; x++) sum += vec[x]; + return sum; +} + +float +FSum(float *vec, int n) +{ + float sum = 0.; + int x; + for (x = 0; x < n; x++) sum += vec[x]; + return sum; +} + +void +DAdd(double *vec1, double *vec2, int n) +{ + int x; + for (x = 0; x < n; x++) vec1[x] += vec2[x]; +} + +void +FAdd(float *vec1, float *vec2, int n) +{ + int x; + for (x = 0; x < n; x++) vec1[x] += vec2[x]; +} + +void +DCopy(double *vec1, double *vec2, int n) +{ + int x; + for (x = 0; x < n; x++) vec1[x] = vec2[x]; +} + +void +FCopy(float *vec1, float *vec2, int n) +{ + int x; + for (x = 0; x < n; x++) vec1[x] = vec2[x]; +} + +double +DDot(double *vec1, double *vec2, int n) +{ + double result = 0.; + int x; + for (x = 0; x < n; x++) result += vec1[x] * vec2[x]; + return result; +} + +float +FDot(float *vec1, float *vec2, int n) +{ + float result = 0.; + int x; + for (x = 0; x < n; x++) result += vec1[x] * vec2[x]; + return result; +} + +double +DMax(double *vec, int n) +{ + int i; + double best; + + best = vec[0]; + for (i = 1; i < n; i++) + if (vec[i] > best) best = vec[i]; + return best; +} + +float +FMax(float *vec, int n) +{ + int i; + float best; + + best = vec[0]; + for (i = 1; i < n; i++) + if (vec[i] > best) best = vec[i]; + return best; +} + +double +DMin(double *vec, int n) +{ + int i; + double best; + + best = vec[0]; + for (i = 1; i < n; i++) + if (vec[i] < best) best = vec[i]; + return best; +} + +float +FMin(float *vec, int n) +{ + int i; + float best; + + best = vec[0]; + for (i = 1; i < n; i++) + if (vec[i] < best) best = vec[i]; + return best; +} + +double +DArgMax(double *vec, int n) +{ + int i; + int best = 0; + + for (i = 1; i < n; i++) + if (vec[i] > vec[best]) best = i; + return best; +} + +float +FArgMax(float *vec, int n) +{ + int i; + int best = 0; + + for (i = 1; i < n; i++) + if (vec[i] > vec[best]) best = i; + return best; +} + +double +DArgMin(double *vec, int n) +{ + int i; + int best = 0; + for (i = 1; i < n; i++) + if (vec[i] < vec[best]) best = i; + return best; +} + +float +FArgMin(float *vec, int n) +{ + int i; + int best = 0; + + for (i = 1; i < n; i++) + if (vec[i] < vec[best]) best = i; + return best; +} + +void +DNorm(double *vec, int n) +{ + int x; + double sum; + + sum = DSum(vec, n); + if (sum != 0.0) for (x = 0; x < n; x++) vec[x] /= sum; + else for (x = 0; x < n; x++) vec[x] = 1. / (double) n; +} + +void +FNorm(float *vec, int n) +{ + int x; + float sum; + + sum = FSum(vec, n); + if (sum != 0.0) for (x = 0; x < n; x++) vec[x] /= sum; + else for (x = 0; x < n; x++) vec[x] = 1. / (float) n; +} + +void +DLog(double *vec, int n) +{ + int x; + for (x = 0; x < n; x++) + if (vec[x] > 0.) vec[x] = log(vec[x]); + else vec[x] = -DBL_MAX; +} + +void +FLog(float *vec, int n) +{ + int x; + for (x = 0; x < n; x++) + if (vec[x] > 0.) vec[x] = log(vec[x]); + else vec[x] = -FLT_MAX; +} + +void +DExp(double *vec, int n) +{ + int x; + for (x = 0; x < n; x++) vec[x] = exp(vec[x]); +} + +void +FExp(float *vec, int n) +{ + int x; + for (x = 0; x < n; x++) vec[x] = exp(vec[x]); +} + +float +DLogSum(double *vec, int n) +{ + int x; + double max, sum; + + max = DMax(vec, n); + sum = 0.0; + for (x = 0; x < n; x++) + if (vec[x] > max - 50.) + sum += exp(vec[x] - max); + sum = log(sum) + max; + return sum; +} + +float +FLogSum(float *vec, int n) +{ + int x; + float max, sum; + + max = FMax(vec, n); + sum = 0.0; + for (x = 0; x < n; x++) + if (vec[x] > max - 50.) + sum += exp(vec[x] - max); + sum = log(sum) + max; + return sum; +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/vectorops.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,36 @@ +/* vectorops.h + * Header file for vectorops.c + * + * SRE, Tue Oct 1 15:23:37 2002 [St. Louis] + * CVS $Id: vectorops.h,v 1.1 2002/10/09 14:26:09 eddy Exp) + */ + +extern void DSet(double *vec, int n, double value); +extern void FSet(float *vec, int n, float value); +extern void DScale(double *vec, int n, double scale); +extern void FScale(float *vec, int n, float scale); +extern double DSum(double *vec, int n); +extern float FSum(float *vec, int n); +extern void DAdd(double *vec1, double *vec2, int n); +extern void FAdd(float *vec1, float *vec2, int n); +extern void DCopy(double *vec1, double *vec2, int n); +extern void FCopy(float *vec1, float *vec2, int n); +extern double DDot(double *vec1, double *vec2, int n); +extern float FDot(float *vec1, float *vec2, int n); +extern double DMax(double *vec, int n); +extern float FMax(float *vec, int n); +extern double DMin(double *vec, int n); +extern float FMin(float *vec, int n); +extern double DArgMax(double *vec, int n); +extern float FArgMax(float *vec, int n); +extern double DArgMin(double *vec, int n); +extern float FArgMin(float *vec, int n); +extern void DNorm(double *vec, int n); +extern void FNorm(float *vec, int n); +extern void DLog(double *vec, int n); +extern void FLog(float *vec, int n); +extern void DExp(double *vec, int n); +extern void FExp(float *vec, int n); +extern float DLogSum(double *vec, int n); +extern float FLogSum(float *vec, int n); +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/version.h Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,6 @@ +/* version.h -- automatically generated by a Makefile. DO NOT EDIT. */ +#define PACKAGE "SQUID" +#define RELEASE "1.9g" +#define RELEASEDATE "Oct 2002" +#define COPYRIGHT "Copyright (C) 1992-2002 HHMI/Washington University School of Medicine" +#define LICENSE "Freely distributed under the GNU General Public License (GPL)"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/clustal-omega-0.2.0/src/squid/weight.c Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,748 @@ +/***************************************************************** + * SQUID - a library of functions for biological sequence analysis + * Copyright (C) 1992-2002 Washington University School of Medicine + * + * This source code is freely distributed under the terms of the + * GNU General Public License. See the files COPYRIGHT and LICENSE + * for details. + *****************************************************************/ + +/* weight.c + * SRE, Thu Mar 3 07:56:01 1994 + * + * Calculate weights for sequences in an alignment. + * RCS $Id: weight.c 217 2011-03-19 10:27:10Z andreas $ (Original squid RCS Id: weight.c,v 1.9 2002/10/09 14:26:09 eddy Exp) + */ + +#include <ctype.h> +#include <string.h> +#include "squid.h" +#include "sre_random.h" + +static void upweight(struct phylo_s *tree, int nseq, float *lwt, float *rwt, int node); +static void downweight(struct phylo_s *tree, int nseq, float *lwt, float *rwt, + float *fwt, int node); +static float simple_distance(char *s1, char *s2); +static int simple_diffmx(char **aseqs,int num, float ***ret_dmx); + +/* Function: GSCWeights() + * + * Purpose: Use Erik's tree-based algorithm to set weights for + * sequences in an alignment. upweight() and downweight() + * are derived from Graeme Mitchison's code. + * + * Args: aseq - array of (0..nseq-1) aligned sequences + * nseq - number of seqs in alignment + * alen - length of alignment + * wgt - allocated [0..nseq-1] array of weights to be returned + * + * Return: (void) + * wgt is filled in. + */ +void +GSCWeights(char **aseq, int nseq, int alen, float *wgt) +{ + float **dmx; /* distance (difference) matrix */ + struct phylo_s *tree; + float *lwt, *rwt; /* weight on left, right of this tree node */ + float *fwt; /* final weight assigned to this node */ + int i; + + /* Sanity check first + */ + if (nseq == 1) { wgt[0] = 1.0; return; } + + /* I use a simple fractional difference matrix derived by + * pairwise identity. Perhaps I should include a Poisson + * distance correction. + */ + MakeDiffMx(aseq, nseq, &dmx); + if (! Cluster(dmx, nseq, CLUSTER_MIN, &tree)) Die("Cluster() failed"); + + /* Allocations + */ + lwt = MallocOrDie (sizeof(float) * (2 * nseq - 1)); + rwt = MallocOrDie (sizeof(float) * (2 * nseq - 1)); + fwt = MallocOrDie (sizeof(float) * (2 * nseq - 1)); + + /* lwt and rwt are the total branch weight to the left and + * right of a node or sequence. They are 0..2N-2. 0..N-1 are + * the sequences; these have weight 0. N..2N-2 are the actual + * tree nodes. + */ + for (i = 0; i < nseq; i++) + lwt[i] = rwt[i] = 0.0; + /* recursively calculate rwt, lwt, starting + at node nseq (the root) */ + upweight(tree, nseq, lwt, rwt, nseq); + + /* recursively distribute weight across the + tree */ + fwt[nseq] = nseq; + downweight(tree, nseq, lwt, rwt, fwt, nseq); + /* collect the weights */ + for (i = 0; i < nseq; i++) + wgt[i] = fwt[i]; + + FMX2Free(dmx); + FreePhylo(tree, nseq); + free(lwt); free(rwt); free(fwt); +} + +static void +upweight(struct phylo_s *tree, int nseq, float *lwt, float *rwt, int node) +{ + int ld,rd; + + ld = tree[node-nseq].left; + if (ld >= nseq) upweight(tree, nseq, lwt, rwt, ld); + rd = tree[node-nseq].right; + if (rd >= nseq) upweight(tree, nseq, lwt, rwt, rd); + lwt[node] = lwt[ld] + rwt[ld] + tree[node-nseq].lblen; + rwt[node] = lwt[rd] + rwt[rd] + tree[node-nseq].rblen; +} + + +static void +downweight(struct phylo_s *tree, int nseq, float *lwt, float *rwt, float *fwt, int node) +{ + int ld,rd; + float lnum, rnum; + + ld = tree[node-nseq].left; + rd = tree[node-nseq].right; + if (lwt[node] + rwt[node] > 0.0) + { + fwt[ld] = fwt[node] * (lwt[node] / (lwt[node] + rwt[node])); + fwt[rd] = fwt[node] * (rwt[node] / (lwt[node] + rwt[node])); + } + else + { + lnum = (ld >= nseq) ? tree[ld-nseq].incnum : 1.0; + rnum = (rd >= nseq) ? tree[rd-nseq].incnum : 1.0; + fwt[ld] = fwt[node] * lnum / (lnum + rnum); + fwt[rd] = fwt[node] * rnum / (lnum + rnum); + } + + if (ld >= nseq) downweight(tree, nseq, lwt, rwt, fwt, ld); + if (rd >= nseq) downweight(tree, nseq, lwt, rwt, fwt, rd); +} + + + + +/* Function: VoronoiWeights() + * + * Purpose: Calculate weights using the scheme of Sibbald & + * Argos (JMB 216:813-818 1990). The scheme is + * slightly modified because the original algorithm + * actually doesn't work on gapped alignments. + * The sequences are assumed to be protein. + * + * Args: aseq - array of (0..nseq-1) aligned sequences + * nseq - number of sequences + * alen - length of alignment + * wgt - allocated [0..nseq-1] array of weights to be returned + * + * Return: void + * wgt is filled in. + */ +void +VoronoiWeights(char **aseq, int nseq, int alen, float *wgt) +{ + float **dmx; /* distance (difference) matrix */ + float *halfmin; /* 1/2 minimum distance to other seqs */ + char **psym; /* symbols seen in each column */ + int *nsym; /* # syms seen in each column */ + int symseen[27]; /* flags for observed syms */ + char *randseq; /* randomly generated sequence */ + int acol; /* pos in aligned columns */ + int idx; /* index in sequences */ + int symidx; /* 0..25 index for symbol */ + int i; /* generic counter */ + float min; /* minimum distance */ + float dist; /* distance between random and real */ + float challenge, champion; /* for resolving ties */ + int itscale; /* how many iterations per seq */ + int iteration; + int best; /* index of nearest real sequence */ + + /* Sanity check first + */ + if (nseq == 1) { wgt[0] = 1.0; return; } + + itscale = 50; + + /* Precalculate 1/2 minimum distance to other + * sequences for each sequence + */ + if (! simple_diffmx(aseq, nseq, &dmx)) + Die("simple_diffmx() failed"); + halfmin = MallocOrDie (sizeof(float) * nseq); + for (idx = 0; idx < nseq; idx++) + { + for (min = 1.0, i = 0; i < nseq; i++) + { + if (i == idx) continue; + if (dmx[idx][i] < min) min = dmx[idx][i]; + } + halfmin[idx] = min / 2.0; + } + Free2DArray((void **) dmx, nseq); + + /* Set up the random sequence generating model. + */ + psym = MallocOrDie (alen * sizeof(char *)); + nsym = MallocOrDie (alen * sizeof(int)); + for (acol = 0; acol < alen; acol++) + psym[acol] = MallocOrDie (27 * sizeof(char)); + +/* #ifdef ORIGINAL_SIBBALD_ALGORITHM_IS_BROKEN */ + for (acol = 0; acol < alen; acol++) + { + memset(symseen, 0, sizeof(int) * 27); + for (idx = 0; idx < nseq; idx++) + if (! isgap(aseq[idx][acol])) + { + if (isupper((int) aseq[idx][acol])) + symidx = aseq[idx][acol] - 'A'; + else + symidx = aseq[idx][acol] - 'a'; + if (symidx >= 0 && symidx < 26) + symseen[symidx] = 1; + } + else + symseen[26] = 1; /* a gap */ + + for (nsym[acol] = 0, i = 0; i < 26; i++) + if (symseen[i]) + { + psym[acol][nsym[acol]] = 'A'+i; + nsym[acol]++; + } + if (symseen[26]) { psym[acol][nsym[acol]] = ' '; nsym[acol]++; } + } +/* #endif ORIGINAL_SIBBALD_ALGORITHM_IS_BROKEN */ + + /* Note: the original Sibbald&Argos algorithm calls for + * bounding the sampled space using a template-like random + * sequence generator. However, this leads to one minor + * and one major problem. The minor problem is that + * exceptional amino acids in a column can have a + * significant effect by altering the amount of sampled + * sequence space; the larger the data set, the worse + * this problem becomes. The major problem is that + * there is no reasonable way to deal with gaps. + * Gapped sequences simply inhabit a different dimensionality + * and it's pretty painful to imagine calculating Voronoi + * volumes when the N in your N-space is varying. + * Note that all the examples shown by Sibbald and Argos + * are *ungapped* examples. + * + * The best way I've found to circumvent this problem is + * just not to bound the sampled space; count gaps as + * symbols and generate completely random sequences. + */ +#ifdef ALL_SEQUENCE_SPACE + for (acol = 0; acol < alen; acol++) + { + strcpy(psym[acol], "ACDEFGHIKLMNPQRSTVWY "); + nsym[acol] = 21; + } +#endif + + /* Sibbald and Argos algorithm: + * 1) assign all seqs weight 0. + * 2) generate a "random" sequence + * 3) calculate distance to every other sequence + * (if we get a distance < 1/2 minimum distance + * to other real seqs, we can stop) + * 4) if unique closest sequence, increment its weight 1. + * if multiple closest seq, choose one randomly + * 5) repeat 2-4 for lots of iterations + * 6) normalize all weights to sum to nseq. + */ + randseq = MallocOrDie ((alen+1) * sizeof(char)); + + best = 42.; /* solely to silence GCC uninit warnings. */ + FSet(wgt, nseq, 0.0); + for (iteration = 0; iteration < itscale * nseq; iteration++) + { + for (acol = 0; acol < alen; acol++) + randseq[acol] = (nsym[acol] == 0) ? ' ' : psym[acol][CHOOSE(nsym[acol])]; + randseq[acol] = '\0'; + + champion = sre_random(); + for (min = 1.0, idx = 0; idx < nseq; idx++) + { + dist = simple_distance(aseq[idx], randseq); + if (dist < halfmin[idx]) + { + best = idx; + break; + } + if (dist < min) + { champion = sre_random(); best = idx; min = dist; } + else if (dist == min) + { + challenge = sre_random(); + if (challenge > champion) + { champion = challenge; best = idx; min = dist; } + } + } + wgt[best] += 1.0; + } + + for (idx = 0; idx < nseq; idx++) + wgt[idx] = wgt[idx] / (float) itscale; + + free(randseq); + free(nsym); + free(halfmin); + Free2DArray((void **) psym, alen); +} + + +/* Function: simple_distance() + * + * Purpose: For two identical-length null-terminated strings, return + * the fractional difference between them. (0..1) + * (Gaps don't count toward anything.) + */ +static float +simple_distance(char *s1, char *s2) +{ + int diff = 0; + int valid = 0; + + for (; *s1 != '\0'; s1++, s2++) + { + if (isgap(*s1) || isgap(*s2)) continue; + if (*s1 != *s2) diff++; + valid++; + } + return (valid > 0 ? ((float) diff / (float) valid) : 0.0); +} + +/* Function: simple_diffmx() + * + * Purpose: Given a set of flushed, aligned sequences, construct + * an NxN fractional difference matrix using the + * simple_distance rule. + * + * Args: aseqs - flushed, aligned sequences + * num - number of aseqs + * ret_dmx - RETURN: difference matrix (caller must free) + * + * Return: 1 on success, 0 on failure. + */ +static int +simple_diffmx(char **aseqs, + int num, + float ***ret_dmx) +{ + float **dmx; /* RETURN: distance matrix */ + int i,j; /* counters over sequences */ + + /* Allocate + */ + if ((dmx = (float **) malloc (sizeof(float *) * num)) == NULL) + Die("malloc failed"); + for (i = 0; i < num; i++) + if ((dmx[i] = (float *) malloc (sizeof(float) * num)) == NULL) + Die("malloc failed"); + + /* Calculate distances, symmetric matrix + */ + for (i = 0; i < num; i++) + for (j = i; j < num; j++) + dmx[i][j] = dmx[j][i] = simple_distance(aseqs[i], aseqs[j]); + + /* Return + */ + *ret_dmx = dmx; + return 1; +} + + + +/* Function: BlosumWeights() + * Date: SRE, Fri Jul 16 17:33:59 1999 (St. Louis) + * + * Purpose: Assign weights to a set of aligned sequences + * using the BLOSUM rule: + * - do single linkage clustering at some pairwise identity + * - in each cluster, give each sequence 1/clustsize + * total weight. + * + * The clusters have no pairwise link >= maxid. + * + * O(N) in memory. Probably ~O(NlogN) in time; O(N^2) + * in worst case, which is no links between sequences + * (e.g., values of maxid near 1.0). + * + * Args: aseqs - alignment + * nseq - number of seqs in alignment + * alen - # of columns in alignment + * maxid - fractional identity (e.g. 0.62 for BLOSUM62) + * wgt - [0..nseq-1] array of weights to be returned + */ +void +BlosumWeights(char **aseqs, int nseq, int alen, float maxid, float *wgt) +{ + int *c, nc; + int *nmem; /* number of seqs in each cluster */ + int i; /* loop counter */ + + SingleLinkCluster(aseqs, nseq, alen, maxid, &c, &nc); + + FSet(wgt, nseq, 1.0); + nmem = MallocOrDie(sizeof(int) * nc); + + for (i = 0; i < nc; i++) nmem[i] = 0; + for (i = 0; i < nseq; i++) nmem[c[i]]++; + for (i = 0; i < nseq; i++) wgt[i] = 1. / (float) nmem[c[i]]; + + free(nmem); + free(c); + return; +} + + +/* Function: PositionBasedWeights() + * Date: SRE, Fri Jul 16 17:47:22 1999 [St. Louis] + * + * Purpose: Implementation of Henikoff and Henikoff position-based + * weights (JMB 243:574-578, 1994) [Henikoff94b]. + * + * A significant advantage of this approach that Steve and Jorja + * don't point out is that it is O(N) in memory, unlike + * many other approaches like GSC weights or Voronoi. + * + * A potential disadvantage that they don't point out + * is that in the theoretical limit of infinite sequences + * in the alignment, weights go flat: eventually every + * column has at least one representative of each of 20 aa (or 4 nt) + * in it. + * + * They also don't give a rule for how to handle gaps. + * The rule used here seems the obvious and sensible one + * (ignore them). This means that longer sequences + * initially get more weight; hence a "double + * normalization" in which the weights are first divided + * by sequence length (to compensate for that effect), + * then normalized to sum to nseq. + * + * Limitations: + * Implemented in a way that's alphabet-independent: + * it uses the 26 upper case letters as "residues". + * Any alphabetic character in aseq is interpreted as + * a unique "residue" (case insensitively; lower case + * mapped to upper case). All other characters are + * interpreted as gaps. + * + * This way, we don't have to pass around any alphabet + * type info (DNA vs. RNA vs. protein) and don't have + * to deal with remapping IUPAC degenerate codes + * probabilistically. However, on the down side, + * a sequence with a lot of degenerate IUPAC characters + * will get an artifactually high PB weight. + * + * Args: aseq - sequence alignment to weight + * nseq - number of sequences in alignment + * alen - length of alignment + * wgt - RETURN: weights filled in (pre-allocated 0..nseq-1) + * + * Returns: (void) + * wgt is allocated (0..nseq-1) by caller, and filled in here. + */ +void +PositionBasedWeights(char **aseq, int nseq, int alen, float *wgt) +{ + int rescount[26]; /* count of A-Z residues in a column */ + int nres; /* number of different residues in col */ + int idx, pos; /* indices into aseq */ + int x; + float norm; + + FSet(wgt, nseq, 0.0); + for (pos = 0; pos < alen; pos++) + { + for (x = 0; x < 26; x++) rescount[x] = 0; + for (idx = 0; idx < nseq; idx++) + if (isalpha(aseq[idx][pos])) + rescount[toupper(aseq[idx][pos]) - 'A'] ++; + + nres = 0; + for (x = 0; x < 26; x++) + if (rescount[x] > 0) nres++; + + for (idx = 0; idx < nseq; idx++) + if (isalpha(aseq[idx][pos])) + wgt[idx] += 1. / (float) (nres * rescount[toupper(aseq[idx][pos]) - 'A']); + } + + for (idx = 0; idx < nseq; idx++) + wgt[idx] /= (float) DealignedLength(aseq[idx]); + norm = (float) nseq / FSum(wgt, nseq); + FScale(wgt, nseq, norm); + return; +} + + + + +/* Function: FilterAlignment() + * Date: SRE, Wed Jun 30 09:19:30 1999 [St. Louis] + * + * Purpose: Constructs a new alignment by removing near-identical + * sequences from a given alignment (where identity is + * calculated *based on the alignment*). + * Does not affect the given alignment. + * Keeps earlier sequence, discards later one. + * + * Usually called as an ad hoc sequence "weighting" mechanism. + * + * Limitations: + * Unparsed Stockholm markup is not propagated into the + * new alignment. + * + * Args: msa -- original alignment + * cutoff -- fraction identity cutoff. 0.8 removes sequences > 80% id. + * ret_new -- RETURN: new MSA, usually w/ fewer sequences + * + * Return: (void) + * ret_new must be free'd by caller: MSAFree(). + */ +void +FilterAlignment(MSA *msa, float cutoff, MSA **ret_new) +{ + int nnew; /* number of seqs in new alignment */ + int *list; + int *useme; + float ident; + int i,j; + int remove; + + /* find which seqs to keep (list) */ + /* diff matrix; allow ragged ends */ + list = MallocOrDie (sizeof(int) * msa->nseq); + useme = MallocOrDie (sizeof(int) * msa->nseq); + for (i = 0; i < msa->nseq; i++) useme[i] = FALSE; + + nnew = 0; + for (i = 0; i < msa->nseq; i++) + { + remove = FALSE; + for (j = 0; j < nnew; j++) + { + ident = PairwiseIdentity(msa->aseq[i], msa->aseq[list[j]]); + if (ident > cutoff) + { + remove = TRUE; + printf("removing %12s -- fractional identity %.2f to %s\n", + msa->sqname[i], ident, + msa->sqname[list[j]]); + break; + } + } + if (remove == FALSE) { + list[nnew++] = i; + useme[i] = TRUE; + } + } + + MSASmallerAlignment(msa, useme, ret_new); + free(list); + free(useme); + return; +} + + +/* Function: SampleAlignment() + * Date: SRE, Wed Jun 30 10:13:56 1999 [St. Louis] + * + * Purpose: Constructs a new, smaller alignment by sampling a given + * number of sequences at random. Does not change the + * alignment nor the order of the sequences. + * + * If you ask for a sample that is larger than nseqs, + * it silently returns the original alignment. + * + * Not really a weighting method, but this is as good + * a place as any to keep it, since it's similar in + * construction to FilterAlignment(). + * + * Args: msa -- original alignment + * sample -- number of sequences in new alignment (0 < sample <= nseq) + * ret_new -- RETURN: new MSA + * + * Return: (void) + * ret_new must be free'd by caller: MSAFree(). + */ +void +SampleAlignment(MSA *msa, int sample, MSA **ret_new) +{ + int *list; /* array for random selection w/o replace */ + int *useme; /* array of flags 0..nseq-1: TRUE to use */ + int i, idx; + int len; + + /* Allocations + */ + list = (int *) MallocOrDie (sizeof(int) * msa->nseq); + useme = (int *) MallocOrDie (sizeof(int) * msa->nseq); + for (i = 0; i < msa->nseq; i++) + { + list[i] = i; + useme[i] = FALSE; + } + + /* Sanity check. + */ + if (sample >= msa->nseq) sample = msa->nseq; + + /* random selection w/o replacement */ + for (len = msa->nseq, i = 0; i < sample; i++) + { + idx = CHOOSE(len); + printf("chose %d: %s\n", list[idx], msa->sqname[list[idx]]); + useme[list[idx]] = TRUE; + list[idx] = list[--len]; + } + + MSASmallerAlignment(msa, useme, ret_new); + free(list); + free(useme); + return; +} + + +/* Function: SingleLinkCluster() + * Date: SRE, Fri Jul 16 15:02:57 1999 [St. Louis] + * + * Purpose: Perform simple single link clustering of seqs in a + * sequence alignment. A pairwise identity threshold + * defines whether two sequences are linked or not. + * + * Important: runs in O(N) memory, unlike standard + * graph decomposition algorithms that use O(N^2) + * adjacency matrices or adjacency lists. Requires + * O(N^2) time in worst case (which is when you have + * no links at all), O(NlogN) in "average" + * case, and O(N) in best case (when there is just + * one cluster in a completely connected graph. + * + * (Developed because hmmbuild could no longer deal + * with GP120, a 16,013 sequence alignment.) + * + * Limitations: + * CASE-SENSITIVE. Assumes aseq have been put into + * either all lower or all upper case; or at least, + * within a column, there's no mixed case. + * + * Algorithm: + * I don't know if this algorithm is published. I + * haven't seen it in graph theory books, but that might + * be because it's so obvious that nobody's bothered. + * + * In brief, we're going to do a breadth-first search + * of the graph, and we're going to calculate links + * on the fly rather than precalculating them into + * some sort of standard adjacency structure. + * + * While working, we keep two stacks of maximum length N: + * a : list of vertices that are still unconnected. + * b : list of vertices that we've connected to + * in our current breadth level, but we haven't + * yet tested for other connections to a. + * The current length (number of elements in) a and b are + * kept in na, nb. + * + * We store our results in an array of length N: + * c : assigns each vertex to a component. for example + * c[4] = 1 means that vertex 4 is in component 1. + * nc is the number of components. Components + * are numbered from 0 to nc-1. We return c and nc + * to our caller. + * + * The algorithm is: + * + * Initialisation: + * a <-- all the vertices + * na <-- N + * b <-- empty set + * nb <-- 0 + * nc <-- 0 + * + * Then: + * while (a is not empty) + * pop a vertex off a, push onto b + * while (b is not empty) + * pop vertex v off b + * assign c[v] = nc + * for each vertex w in a: + * compare v,w. If w is linked to v, remove w + * from a, push onto b. + * nc++ + * q.e.d. :) + * + * Args: aseq - aligned sequences + * nseq - number of sequences in aseq + * alen - alignment length + * maxid - fractional identity threshold 0..1. if id >= maxid, seqs linked + * ret_c - RETURN: 0..nseq-1 assignments of seqs to components (clusters) + * ret_nc - RETURN: number of components + * + * Returns: void. + * ret_c is allocated here. Caller free's with free(*ret_c) + */ +void +SingleLinkCluster(char **aseq, int nseq, int alen, float maxid, + int **ret_c, int *ret_nc) +{ + int *a, na; /* stack of available vertices */ + int *b, nb; /* stack of working vertices */ + int *c; /* array of results */ + int nc; /* total number of components */ + int v,w; /* index of a working vertices */ + int i; /* loop counter */ + + /* allocations and initializations + */ + a = MallocOrDie (sizeof(int) * nseq); + b = MallocOrDie (sizeof(int) * nseq); + c = MallocOrDie (sizeof(int) * nseq); + for (i = 0; i < nseq; i++) a[i] = i; + na = nseq; + nb = 0; + nc = 0; + + /* Main algorithm + */ + while (na > 0) + { + v = a[na-1]; na--; /* pop a vertex off a, */ + b[nb] = v; nb++; /* and push onto b */ + while (nb > 0) + { + v = b[nb-1]; nb--; /* pop vertex off b */ + c[v] = nc; /* assign it to component nc */ + for (i = na-1; i >= 0; i--)/* backwards, becase of deletion/swapping we do*/ + if (simple_distance(aseq[v], aseq[a[i]]) <= 1. - maxid) /* linked? */ + { + w = a[i]; a[i] = a[na-1]; na--; /* delete w from a (note swap) */ + b[nb] = w; nb++; /* push w onto b */ + } + } + nc++; + } + + /* Cleanup and return + */ + free(a); + free(b); + *ret_c = c; + *ret_nc = nc; + return; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/hide_stderr.py Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,49 @@ +#!/usr/bin/env python +"""A simple script to redirect stderr to stdout when the return code is zero. + +See https://bitbucket.org/galaxy/galaxy-central/issue/325/ + +Currently Galaxy ignores the return code from command line tools (even if it +is non-zero which by convention indicates an error) and treats any output on +stderr as an error (even though by convention stderr is used for errors or +warnings). + +This script runs the given command line, capturing all stdout and stderr in +memory, and gets the return code. For a zero return code, any stderr (which +should be warnings only) is added to the stdout. That way Galaxy believes +everything is fine. For a non-zero return code, we output stdout as is, and +any stderr, plus the return code to ensure there is some output on stderr. +That way Galaxy treats this as an error. + +Once issue 325 is fixed, this script will not be needed. +""" +import sys +import subprocess + +#Avoid using shell=True when we call subprocess to ensure if the Python +#script is killed, so too is the BLAST process. +try: + words = [] + for w in sys.argv[1:]: + if " " in w: + words.append('"%s"' % w) + else: + words.append(w) + cmd = " ".join(words) + child = subprocess.Popen(sys.argv[1:], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) +except Exception, err: + sys.stderr.write("Error invoking command:\n%s\n\n%s\n" % (cmd, err)) + sys.exit(1) +#Use .communicate as can get deadlocks with .wait(), +stdout, stderr = child.communicate() +return_code = child.returncode + +if return_code: + sys.stdout.write(stdout) + sys.stderr.write(stderr) + sys.stderr.write("Return error code %i from command:\n" % return_code) + sys.stderr.write("%s\n" % cmd) +else: + sys.stdout.write(stdout) + sys.stdout.write(stderr)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/rgClustalOmega.xml Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,235 @@ +<tool id="clustalomega" name="Clustal Omega" version="0.2"> +<description> +multiple sequence alignment program for proteins +</description> +<command interpreter="python"> +hide_stderr.py clustalo --force --threads=1 --maxnumseq=300000 --maxseqlen=15000 -o $output -l $outlog -v +#if ($basicmode.mode=="mode1") + -i $input +#elif ($basicmode.mode=="mode2") + --profile1 $profile1 --profile2 $profile2 +#elif ($basicmode.mode=="mode3") + -i $input --profile1 $profile +#elif ($basicmode.mode=="mode4") + -i $input --hmm-in=$hmm +#end if +#if($advanced.options=="true") + #if ($advanced.dealign.value=="Yes") + --dealign + #end if + #if ($advanced.mbed.value=="Yes") + --mbed + #end if + #if ($advanced.iteration.iteroptions =="true") + --iter $advanced.iteration.iters + #if ($advanced.iteration.mbediter.value=="Yes") + --mbed-iter + #end if + #if ($advanced.iteration.separateiters.separateiteroptions =="true") + --max-guidetree-iterations=$advanced.iteration.separateiters.gtiters + --max-hmm-iterations=$advanced.iteration.separateiters.hmmiters + #end if + #end if + #if ($advanced.dotree.value=="Yes") + --guidetree-out=$outtree + #end if + #if ($advanced.domatrix.value=="Yes") + --distmat-out=$outmatrix + #end if +#end if + +</command> + +<inputs> + +<conditional name="basicmode"> + <param name="mode" type="select"> + <label>Alignment mode</label> + <option value="mode1" selected="true">align sequences</option> + <option value="mode2">align two profiles</option> + <option value="mode3">align sequences to a profile</option> + <option value="mode4">align sequences with a HMM background</option> + </param> + + <when value="mode1"> + <param name="input" format="fasta" type="data"> + <label>Input sequences</label> + <help>A fasta file containing the proteins to be aligned</help> + </param> + </when> + + <when value="mode2"> + <param name="profile1" format="fasta" type="data"> + <label>Profile 1</label> + <help>A fasta file containing aligned sequences</help> + </param> + + <param name="profile2" format="fasta" type="data"> + <label>Profile 2 (Fasta File)</label> + <help>A fasta file containing aligned sequences</help> + </param> + </when> + + <when value="mode3"> + <param name="input" format="fasta" type="data"> + <label>Input sequences</label> + <help>A fasta file containing the proteins to be aligned</help> + </param> + + <param name="profile" format="fasta" type="data"> + <label>Profile</label> + <help>A fasta file containing aligned sequences</help> + </param> + </when> + + <when value="mode4"> + <param name="input" format="fasta" type="data"> + <label>Input sequences</label> + <help>A fasta file containing the proteins to be aligned</help> + </param> + + <param name="hmm" format="other" type="data"> + <label>HMM</label> + <help>A HMM in HMMER2 or HMMER3 format</help> + </param> + </when> +</conditional> + <param name="outname" label="Name for output files" type="text" size="50" value="co_alignment" /> + + <conditional name="advanced"> + <param name="options" type="select" label="Advanced Options"> + <option value="false" selected="true">Hide advanced options</option> + <option value="true">Show advanced options</option> + </param> + <when value="false"> + <!-- no options --> + </when> + <when value="true"> + + <param name="dealign" type="select" display="checkboxes" multiple="True"> + <label>Dealign input sequences (if aligned)</label> + <option value="Yes">Yes</option> + <help>If given already aligned sequences, by default Clustal Omega use the existing alignment to guide creation of the new alignment, by constructing a HMM from the existing alignment. Check this box to realign aligned sequences from scratch.</help> + </param> + + <param name="mbed" type="select" display="checkboxes" multiple="True" label="Use mBed"> + <option value="Yes">Yes</option> + <help>Use embedding to calculate the guide tree more quickly and using less memory. Should be turned on + when more than a thousand sequences are used.</help> + </param> + + <conditional name="iteration"> + <param name="iteroptions" type="select" label="Use iteration"> + <option value="false" selected="true">Do not use iteration</option> + <option value="true">Use iteration</option> + <help>Redo the alignment multiple times to improve accuracy. Both the HMM and the guide tree + will be recalculated each time.</help> + </param> + <when value="false"> + <!-- no options --> + </when> + <when value="true"> + <param name="iters" type="integer" value="1" label="Number of iterations"></param> + + <param name="mbediter" type="select" display="checkboxes" multiple="True" label="Use MBED for iteration"> + <option value="Yes">Yes</option> + </param> + <conditional name="separateiters"> + <param name="separateiteroptions" type="select"> + <label>Have a different number of guide tree, HMM iterations</label> + <option value="false" selected="true">No</option> + <option value="true">Yes</option> + <help>Normally, if iteration is specified, a new guide tree and HMM will be calculated for each iteration. Use this option to restrict the number of iterations for either.</help> + </param> + <when value="false"> + <!-- no options --> + </when> + <when value="true"> + <param name="gtiters" type="integer" value="1" label="Guidetree iterations"></param> + <param name="hmmiters" type="integer" value="1" label="HMM iterations"></param> + + </when> + </conditional> + </when> + </conditional> + </when> + </conditional> + <param name="dotree" type="select" display="checkboxes" multiple="True" label="Output guide tree"> + <option value="Yes">Yes</option> + </param> + <param name="domatrix" type="select" display="checkboxes" multiple="True" label="Output distance matrix"> + <option value="Yes">Yes</option> + </param> +</inputs> + +<outputs> + <data format="fasta" name="output" label="${outname}.fasta" /> + <data format="txt" name="outlog" label="${outname}_log.txt" /> + <data format="txt" name="outtree" label="${outname}_guidetree.txt"> + <filter>dotree=="Yes"</filter> + </data> + <data format="txt" name="outmatrix" label="${outname}_distances.txt"> + <filter>domatrix=="Yes"</filter> + </data> +</outputs> + +<tests> + <test> + <param name="mode" value="mode1" /> + <param name="input" value="clustalo_unaligned_all.fasta" ftype="fasta" /> + <param name="outname" value="test_output" /> + <param name="options" value="false" /> + <output name="output" file="clustalo_test1_out.fasta" ftype="fasta" lines_diff="200" /> + </test> + <test> + <param name="mode" value="mode2" /> + <param name="profile1" value="clustalo_aligned1.fasta" /> + <param name="profile2" value="clustalo_aligned2.fasta" /> + <param name="outname" value="test_output" /> + <param name="options" value="false" /> + <output name="output" file="clustalo_profileprofile.fasta" lines_diff="200" /> + </test> +</tests> + +<help> + +Clustal-Omega is a general purpose multiple sequence alignment (MSA) +program for proteins. It produces high quality MSAs and is capable of +handling data-sets of hundreds of thousands of sequences in reasonable +time. + +In default mode, users give a file of sequences to be aligned and +these are clustered to produce a guide tree and this is used to guide +a "progressive alignment" of the sequences. There are also facilities +for aligning existing alignments to each other, aligning a sequence to +an alignment and for using a hidden Markov model (HMM) to help guide +an alignment of new sequences that are homologous to the sequences +used to make the HMM. This latter procedure is referred to as +"external profile alignment" or EPA. + +Clustal-Omega uses HMMs for the alignment engine, based on the HHalign +package from Johannes Soeding [1]. Guide trees are optionally made +using mBed [2] which can cluster very large numbers of sequences in +O(N*log(N)) time. Multiple alignment then proceeds by aligning larger +and larger alignments using HHalign, following the clustering given by +the guide tree. + +In its current form Clustal-Omega can only align protein sequences but +not DNA/RNA sequences. It is envisioned that DNA/RNA will become +available in a future version. + +A full version of these instructions is available at http://www.clustal.org/ + +This is a beta version of Clustal Omega. Bugs should be reported to clustalw@ucd.ie + +A standalone version of Clustal Omega for Linux/Windows/Mac is available from http://www.clustal.org/ + +[1] Johannes Soding (2005) Protein homology detection by HMM-HMM + comparison. Bioinformatics 21 (7): 951–960. + +[2] Blackshields G, Sievers F, Shi W, Wilm A, Higgins DG. Sequence + embedding for fast construction of guide trees for multiple + sequence alignment. Algorithms Mol Biol. 2010 May 14;5:21. + +</help> +</tool>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/test-data/clustalo_aligned1.fasta Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,110 @@ +>Q1R749_ECOUT (Q1R749) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +N-FYSEIINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKG-APSVKSSTRIDNV +IHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPKEPKKNINAI +QKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLVSKRCQSYSIAPL +MIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDKRI---FLGE--- +------------------------------------------------------------ +----------------------- +>B1LEB7_ECOSM (B1LEB7) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKTEKLLSPLKIKNKNIFIVVHLGQLKKAE +LFIQKFSKRSNFLIVLATKKNTEMPRLVLEQMNKKLFSSYKLLFIPTEPNTFSLKKVIWF +YNVYKYIVLNSKAKDAYFMSYAQHYAIFIWLFKKNNIRCSLIEEGTATYKTEKKNTLVNI +N-FYSWIINSIILFHYPDLKFENVYGTFPNLLKEKFDAKKFFEFKT-IPLVKSSTRMDNL +IHKYRITRDDIIYVSQRYWIDNELYAHSLISTLMRIDKSDNARVFIKPHPKETKKHINAI +QGAINKAKRRDIIIIVEKDFLIESIIKKCKIKHLIGLTSSSLVYASLVYKECKTYSIAPI +IIKLCNNEKSQKGTNTLRLHFDILKNFDNVKILSDDIS---SPSLHDKRI---FLGE--- +------------------------------------------------------------ +----------------------- +>Q7WRI1_NEIME (Q7WRI1) +------------------------------------------------------------ +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFEQRFVGNNLHQKGYFDKFDILHVAFPEYAKKNFNANEYHRFFAHSGGISTSQSIAKI +QDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMS +LFLNMVTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQI +V----------------------------------------------------------- +------------------------------------------------------------ +----------------------- +>Q7WRI0_NEIME (Q7WRI0) +------------------------------------------------------------ +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFEQRFVGNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKI +QDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMS +LFLNMVTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQI +V----------------------------------------------------------- +------------------------------------------------------------ +----------------------- +>Q6VNL6_NEIME (Q6VNL6) +-----MLKKIKKALFQPKKFFQDSM----------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +----------------------- +>A9LZW7_NEIM0 (A9LZW7) +------------------------------------------------------------ +----MQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFEQRFVGNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKI +QDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMS +LFLNMVTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQI +VIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSFKTEETLEMLLKSAEY +AYKNKNFYQAIFYWQLASNNDLSVLGYKSLWYYNALNKVKQNYKMKYLEINYIERISLYF +NDKDKMIWQNIKNDFFKYSLCNQ +>O06435_NEIME (O06435) +-----MLQKIRKALFHPKKFFQDSQWFATPL-----FSS-FAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFEQRFVGNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKI +QDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMS +LFLNMVTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQI +VIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSFKTEETLEMLLKSAEY +AYKNKNFYQAIFYWQLASNNDLSVLGYKSLWYYNALNKVKQNYKMKYLEINYIERISLYF +NDKDKMIWQNIKNDFFKYSLCNQ +>A1AFL1_ECOK1 (A1AFL1) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +N-FYSEIINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKG-APSVKSSTRIDNV +IHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPKEPKKNINAI +QKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLVSKRCQSYSIAPL +MIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDKRI---FLGE--- +------------------------------------------------------------ +----------------------- +>Q6VNR6_NEIME (Q6VNR6) +-----MLQKIRKALFHPKKFFQDSQWFATPL-----FSS-FAPKSNLFIISTFAQLNQAH +SLTKM------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +----------------------- +>Q8VRL9_NEIME (Q8VRL9) +-----MLQKIRKALFHPKKFFQDSQWFATPL-----FSS-FAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFEQRFVGNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKI +QDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMS +LFLNMVTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQI +VIDSIHHTAQQENAALIEEHLEIVKQFDFIKILSSIEDGIDTNSFKTEETLEMLLKSAEY +AYKNKNFYQAIFYWQLASNNDLSVLGYKSLWYYNALNKVKQNYKMKYLEINYIERISLYF +NDKDKMIWQNIKNDFFKYSLYNQ +>Q47404_ECOLX (Q47404) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIVAHLGQLKKAE +LFIQKFSRRSNFLIVLATKKNTEMPRLILEQMNKKLFSSYKLLFIPTEPNTFSLKKVIWF +YNVYKYIVLNSKAKDAYFMSYAQHYAIFIWLFKKNNIRCSLIEEGTGTYKTEKKKPLVNI +N-FYSWIINSIILFHYPDLKFENVYGTFPNLLKEKFDAKKIFEFKT-IPLVKSSTRMDNL +IHKYRITRDDIIYVSQRYWIDNELYAHLLISTLMRIDKSDNARVFIKPHPKETKKYINAI +QGAINKAKRRDIIIIVEKDFLIESIIKKCKIKHLIGLASSSLVYAPLVYKECKTYSIAPI +IIKLCNNEKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDKRI---FLGE--- +------------------------------------------------------------ +-----------------------
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/test-data/clustalo_aligned2.fasta Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,168 @@ +>Q83TU5_NEIME (Q83TU5) +-MLKKIK----KALFQPKKFFQDSMWLTTSPF------YLTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNI-KGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAHAGGI +SINNNIANLQKKYQISKNDYIFVSQRYPISDDLYYKSIVEILNSISLQIKGKIFIKLHPK +EMGNNYVMSLFLNM---VEINPRLVVINEPPFLIEPLIYLTNPKGIIGLASSSLIYTPLL +SPSTQCLSIGELIINLIQKYSMVENTEMIQEHLEIIKKFNFINILNDLNGVISNPLF--- +KTEETFETLLKSAEFAYKSKNYFQAIFYWQLASKNNITLL----GHKALWYYNALYNVKQ +IYKMEYSDIFYIDNISV------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>B7NIU6_ECO7I (B7NIU6) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------EII---NSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAP-SV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITS---PSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q57269_ECOLX (Q57269) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------EII---NSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAP-SV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITS---PSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>A1KR99_NEIMF (A1KR99) +-MLQKIR----KALFHPKKFFQDSQWFATPLF------SSFAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNM1_NEIME (Q6VNM1) +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-YKMKYLEINYIERISLYFNDKDKMIWQDIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q79AE7_NEIMB (Q79AE7) +-MLKKIK----KALFQPKKFFQDSMWLTTSPF------YLTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAK--------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q4W584_NEIMB (Q4W584) +-MLKKIK----KALFQPKKFFQDSMWLTTSPF------YLTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNI-KGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAWRKGD +VLQGD------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>C5ZW53_9HELI (C5ZW53) +-MLEVARKKLSGLMQDIKEYFVSSEYEMMFYK------KELNQCNNVFYISNLGQLKQVE +TLIEFEELSNNCLVIGYTRANLEMPDFILDKADKRKFQNIILVELVVSVNYLKPGRIKQI +CRIYKKLSQNIETKELYLLSVEGHYGIFAHYMKQKGVLINLLEEGTATYKFELKNGKIHV +NAPAVRMGRYTEIFCTLSGIKN-MLLVGEFNKIYAAFPEKLRGIFKANEIILFFAHIN-I +KPSANLVEIIEKYKITGDDIIFVSQRFDIDLNIFIEKILDILEAYVVAYRQRVFVKHHPK +ESEKQI--SLFRSKIIARGFSQNIISVSDKAFLVENILDIVETKILVGLTSTSLIYAQKL +NKDIVVHSVVPWFLKKVFFLEKQKKQMLSSHFNELQKTFDGFKIIEDAGAIVAGDICSDT +PKNSDATALIDKANQGFVEKKILQAIFYYKQSESKDIFLRMPHILYNMLYCWDALENDFQ +KYRIII---KYLQLDVVLEKKEEEFVFAKLMQ---FVDMCLREGKFEKFEKIEQLALAKQ +EKFLYFDVGVIRLKKMLYLERWDDVLRAFEDLRESSKKRYFIVFEIVRSFIREENMEFEE +ELKEIDDRVVGESLKLLYLYSCKKYSDIYDYIVEIKDANPYLYQQYHNKIIIQKKYSTLI +ESFNVDNILEYMINNEKKQFFAEVSDVLSKYNVEYRIGDIIEALNGDQIKLKTQDMEDLI +CALKGFEGLAEFCKREDDMGLICRILTFEFAGNLLENERS +>C9X1J6_NEIM8 (C9X1J6) +-MLQKIR----KALFHPKKFFQDSQWFATPLF------SSFAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWHYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>C1HI22_9ESCH (C1HI22) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------EII---NSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAP-SV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITS---PSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q51281_NEIME (Q51281) +-MLKKIK----KALFQPKKFFQDSMWLTTSPF------YLTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNI-KGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAHAGGI +SINNNIANLQKKYQISKNDYIFVSQRYPISDDLYYKSIVEILNSISLQIKGKIFIKLHPK +EMGNNYVMSLFLNM---VEINPRLVVINEPPFLIEPLIYLTNPKGIIGLASSSLIYTPLL +SPSTQCLSIGELIINLIQKYSMVENTEMIQEHLEIIKKFNFINILNDLNGVISNPLF--- +KTEETFETLLKSAEFAYKSKNYFQAIFYWQLASKNNITLL----GHKALWYYNALYNVKQ +IYKMEYSDIFYIDNISVDFHSKDKLTWEKIKHYYYSADNRIGRDR--------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNM8_NEIME (Q6VNM8) +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-YKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +----------------------------------------
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/test-data/clustalo_profileprofile.fasta Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,322 @@ +>Q1R749_ECOUT (Q1R749) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +N-FY----SE----IINSIILF-HYPDLKFENVYGTYPILLKKKFNAQKFVEFKG-APSV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINAIQKAIK---KAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSL--- +HDKRI---FLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>B1LEB7_ECOSM (B1LEB7) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKTEKLLSPLKIKNKNIFIVVHLGQLKKAE +LFIQKFSKRSNFLIVLATKKNTEMPRLVLEQMNKKLFSSYKLLFIPTEPNTFSLKKVIWF +YNVYKYIVLNSKAKDAYFMSYAQHYAIFIWLFKKNNIRCSLIEEGTATYKTEKKNTLVNI +N-FY----SW----IINSIILF-HYPDLKFENVYGTFPNLLKEKFDAKKFFEFKT-IPLV +KSSTRMDNLIHKYRITRDDIIYVSQRYWIDNELYAHSLISTLMRIDKSDNARVFIKPHPK +ETKKHINAIQGAIN---KAKRRDIIIIVEKDFLIESIIKKCKIKHLIGLTSSSLVYASLV +YKECKTYSIAPIIIKLCNNEKSQKGTNTLRLHFDILKNFDNVKILSDDIS---SPSL--- +HDKRI---FLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q7WRI1_NEIME (Q7WRI1) +------------------------------------------------------------ +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKNFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIV----------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q7WRI0_NEIME (Q7WRI0) +------------------------------------------------------------ +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIV----------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNL6_NEIME (Q6VNL6) +-----MLKKIKKALFQPKKFFQDSM----------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>A9LZW7_NEIM0 (A9LZW7) +------------------------------------------------------------ +----MQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>O06435_NEIME (O06435) +-----MLQKIRKALFHPKKFFQDSQWFATPL-----FSS-FAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>A1AFL1_ECOK1 (A1AFL1) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +N-FY----SE----IINSIILF-HYPDLKFENVYGTYPILLKKKFNAQKFVEFKG-APSV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINAIQKAIK---KAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSL--- +HDKRI---FLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNR6_NEIME (Q6VNR6) +-----MLQKIRKALFHPKKFFQDSQWFATPL-----FSS-FAPKSNLFIISTFAQLNQAH +SLTKM------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q8VRL9_NEIME (Q8VRL9) +-----MLQKIRKALFHPKKFFQDSQWFATPL-----FSS-FAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENAALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLYNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q47404_ECOLX (Q47404) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIVAHLGQLKKAE +LFIQKFSRRSNFLIVLATKKNTEMPRLILEQMNKKLFSSYKLLFIPTEPNTFSLKKVIWF +YNVYKYIVLNSKAKDAYFMSYAQHYAIFIWLFKKNNIRCSLIEEGTGTYKTEKKKPLVNI +N-FY----SW----IINSIILF-HYPDLKFENVYGTFPNLLKEKFDAKKIFEFKT-IPLV +KSSTRMDNLIHKYRITRDDIIYVSQRYWIDNELYAHLLISTLMRIDKSDNARVFIKPHPK +ETKKYINAIQGAIN---KAKRRDIIIIVEKDFLIESIIKKCKIKHLIGLASSSLVYAPLV +YKECKTYSIAPIIIKLCNNEKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSL--- +HDKRI---FLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q83TU5_NEIME (Q83TU5) +-MLKKIK----KALFQPKKFFQDSMWLTTSPF------YLTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNI-KGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAHAGGI +SINNNIANLQKKYQISKNDYIFVSQRYPISDDLYYKSIVEILNSISLQIKGKIFIKLHPK +EMGNNYVMSLFLNM---VEINPRLVVINEPPFLIEPLIYLTNPKGIIGLASSSLIYTPLL +SPSTQCLSIGELIINLIQKYSMVENTEMIQEHLEIIKKFNFINILNDLNGVISNPLF--- +KTEETFETLLKSAEFAYKSKNYFQAIFYWQLASKNNITLL----GHKALWYYNALYNVKQ +IYKMEYSDIFYIDNISV------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>B7NIU6_ECO7I (B7NIU6) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------EII---NSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAP-SV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITS---PSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q57269_ECOLX (Q57269) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------EII---NSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAP-SV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITS---PSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>A1KR99_NEIMF (A1KR99) +-MLQKIR----KALFHPKKFFQDSQWFATPLF------SSFAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNM1_NEIME (Q6VNM1) +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-YKMKYLEINYIERISLYFNDKDKMIWQDIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q79AE7_NEIMB (Q79AE7) +-MLKKIK----KALFQPKKFFQDSMWLTTSPF------YLTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAK--------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q4W584_NEIMB (Q4W584) +-MLKKIK----KALFQPKKFFQDSMWLTTSPF------YLTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNI-KGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAWRKGD +VLQGD------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>C5ZW53_9HELI (C5ZW53) +-MLEVARKKLSGLMQDIKEYFVSSEYEMMFYK------KELNQCNNVFYISNLGQLKQVE +TLIEFEELSNNCLVIGYTRANLEMPDFILDKADKRKFQNIILVELVVSVNYLKPGRIKQI +CRIYKKLSQNIETKELYLLSVEGHYGIFAHYMKQKGVLINLLEEGTATYKFELKNGKIHV +NAPAVRMGRYTEIFCTLSGIKN-MLLVGEFNKIYAAFPEKLRGIFKANEIILFFAHIN-I +KPSANLVEIIEKYKITGDDIIFVSQRFDIDLNIFIEKILDILEAYVVAYRQRVFVKHHPK +ESEKQI--SLFRSKIIARGFSQNIISVSDKAFLVENILDIVETKILVGLTSTSLIYAQKL +NKDIVVHSVVPWFLKKVFFLEKQKKQMLSSHFNELQKTFDGFKIIEDAGAIVAGDICSDT +PKNSDATALIDKANQGFVEKKILQAIFYYKQSESKDIFLRMPHILYNMLYCWDALENDFQ +KYRIII---KYLQLDVVLEKKEEEFVFAKLMQ---FVDMCLREGKFEKFEKIEQLALAKQ +EKFLYFDVGVIRLKKMLYLERWDDVLRAFEDLRESSKKRYFIVFEIVRSFIREENMEFEE +ELKEIDDRVVGESLKLLYLYSCKKYSDIYDYIVEIKDANPYLYQQYHNKIIIQKKYSTLI +ESFNVDNILEYMINNEKKQFFAEVSDVLSKYNVEYRIGDIIEALNGDQIKLKTQDMEDLI +CALKGFEGLAEFCKREDDMGLICRILTFEFAGNLLENERS +>C9X1J6_NEIM8 (C9X1J6) +-MLQKIR----KALFHPKKFFQDSQWFATPLF------SSFAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQ-KGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWHYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>C1HI22_9ESCH (C1HI22) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------EII---NSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAP-SV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITS---PSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q51281_NEIME (Q51281) +-MLKKIK----KALFQPKKFFQDSMWLTTSPF------YLTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNI-KGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAHAGGI +SINNNIANLQKKYQISKNDYIFVSQRYPISDDLYYKSIVEILNSISLQIKGKIFIKLHPK +EMGNNYVMSLFLNM---VEINPRLVVINEPPFLIEPLIYLTNPKGIIGLASSSLIYTPLL +SPSTQCLSIGELIINLIQKYSMVENTEMIQEHLEIIKKFNFINILNDLNGVISNPLF--- +KTEETFETLLKSAEFAYKSKNYFQAIFYWQLASKNNITLL----GHKALWYYNALYNVKQ +IYKMEYSDIFYIDNISVDFHSKDKLTWEKIKHYYYSADNRIGRDR--------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNM8_NEIME (Q6VNM8) +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-YKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +----------------------------------------
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/test-data/clustalo_test1_out.fasta Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,323 @@ +>Q1R749_ECOUT (Q1R749) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------E---IINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGA-PSV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>B1LEB7_ECOSM (B1LEB7) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKTEKLLSPLKIKNKNIFIVVHLGQLKKAE +LFIQKFSKRSNFLIVLATKKNTEMPRLVLEQMNKKLFSSYKLLFIPTEPNTFSLKKVIWF +YNVYKYIVLNSKAKDAYFMSYAQHYAIFIWLFKKNNIRCSLIEEGTATYKTEKKNTLVNI +NFYS-------W---IINSIILFHYPDLKFENVYGTFPNLLKEKFDAKKFFEFKTI-PLV +KSSTRMDNLIHKYRITRDDIIYVSQRYWIDNELYAHSLISTLMRIDKSDNARVFIKPHPK +ETKKHINA---IQGAINKAKRRDIIIIVEKDFLIESIIKKCKIKHLIGLTSSSLVYASLV +YKECKTYSIAPIIIKLCNNEKSQKGTNTLRLHFDILKNFDNVKILSDDIS---SPSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q7WRI1_NEIME (Q7WRI1) +------------------------------------------------------------ +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQKG-YFDKFDILHVAFPEYAKKNFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIV----------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q7WRI0_NEIME (Q7WRI0) +------------------------------------------------------------ +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQKG-YFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIV----------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNL6_NEIME (Q6VNL6) +-MLKKIK----KALFQPKKFFQDSM----------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>A9LZW7_NEIM0 (A9LZW7) +------------------------------------------------------------ +----MQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQKG-YFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>O06435_NEIME (O06435) +-MLQKIR----KALFHPKKFFQDSQWFATPLFS------SFAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQKG-YFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>A1AFL1_ECOK1 (A1AFL1) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------E---IINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGA-PSV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNR6_NEIME (Q6VNR6) +-MLQKIR----KALFHPKKFFQDSQWFATPLFS------SFAPKSNLFIISTFAQLNQAH +SLTKM------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q8VRL9_NEIME (Q8VRL9) +-MLQKIR----KALFHPKKFFQDSQWFATPLFS------SFAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQKG-YFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENAALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLYNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q47404_ECOLX (Q47404) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIVAHLGQLKKAE +LFIQKFSRRSNFLIVLATKKNTEMPRLILEQMNKKLFSSYKLLFIPTEPNTFSLKKVIWF +YNVYKYIVLNSKAKDAYFMSYAQHYAIFIWLFKKNNIRCSLIEEGTGTYKTEKKKPLVNI +NFYS-------W---IINSIILFHYPDLKFENVYGTFPNLLKEKFDAKKIFEFKTI-PLV +KSSTRMDNLIHKYRITRDDIIYVSQRYWIDNELYAHLLISTLMRIDKSDNARVFIKPHPK +ETKKYINA---IQGAINKAKRRDIIIIVEKDFLIESIIKKCKIKHLIGLASSSLVYAPLV +YKECKTYSIAPIIIKLCNNEKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q83TU5_NEIME (Q83TU5) +-MLKKIK----KALFQPKKFFQDSMWLTTSPFY------LTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNIKG-YIDHFDILHVPFPEYAKKIFNAKKYNRFFAHAGGI +SINNNIANLQKKYQISKNDYIFVSQRYPISDDLYYKSIVEILNSISLQIKGKIFIKLHPK +EMGNNYVMSLFLNM---VEINPRLVVINEPPFLIEPLIYLTNPKGIIGLASSSLIYTPLL +SPSTQCLSIGELIINLIQKYSMVENTEMIQEHLEIIKKFNFINILNDLNGVISNPLF--- +KTEETFETLLKSAEFAYKSKNYFQAIFYWQLASKNNITLL----GHKALWYYNALYNVKQ +IYKMEYSDIFYIDNISV------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>B7NIU6_ECO7I (B7NIU6) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------E---IINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGA-PSV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q57269_ECOLX (Q57269) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------E---IINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGA-PSV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>A1KR99_NEIMF (A1KR99) +-MLQKIR----KALFHPKKFFQDSQWFATPLFS------SFAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQKG-YFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWYYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNM1_NEIME (Q6VNM1) +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-YKMKYLEINYIERISLYFNDKDKMIWQDIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q79AE7_NEIMB (Q79AE7) +-MLKKIK----KALFQPKKFFQDSMWLTTSPFY------LTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAK--------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q4W584_NEIMB (Q4W584) +-MLKKIK----KALFQPKKFFQDSMWLTTSPFY------LTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNIKG-YIDHFDILHVPFPEYAKKIFNAKKYNRFFAWRKGD +VLQGD------------------------------------------------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>C5ZW53_9HELI (C5ZW53) +-MLEVARKKLSGLMQDIKEYFVSSEYEMMFYKK------ELNQCNNVFYISNLGQLKQVE +TLIEFEELSNNCLVIGYTRANLEMPDFILDKADKRKFQNIILVELVVSVNYLKPGRIKQI +CRIYKKLSQNIETKELYLLSVEGHYGIFAHYMKQKGVLINLLEEGTATYKFELKNGKIHV +NAPAVRMGRYTEIFCTLSGIKNML-LVGEFNKIYAAFPEKLRGIFKANEIILFFAHIN-I +KPSANLVEIIEKYKITGDDIIFVSQRFDIDLNIFIEKILDILEAYVVAYRQRVFVKHHPK +ESEKQI--SLFRSKIIARGFSQNIISVSDKAFLVENILDIVETKILVGLTSTSLIYAQKL +NKDIVVHSVVPWFLKKVFFLEKQKKQMLSSHFNELQKTFDGFKIIEDAGAIVAGDICSDT +PKNSDATALIDKANQGFVEKKILQAIFYYKQSESKDIFLRMPHILYNMLYCWDALENDFQ +KYRIII---KYLQLDVVLEKKEEEFVFAKLMQ---FVDMCLREGKFEKFEKIEQLALAKQ +EKFLYFDVGVIRLKKMLYLERWDDVLRAFEDLRESSKKRYFIVFEIVRSFIREENMEFEE +ELKEIDDRVVGESLKLLYLYSCKKYSDIYDYIVEIKDANPYLYQQYHNKIIIQKKYSTLI +ESFNVDNILEYMINNEKKQFFAEVSDVLSKYNVEYRIGDIIEALNGDQIKLKTQDMEDLI +CALKGFEGLAEFCKREDDMGLICRILTFEFAGNLLENERS +>C9X1J6_NEIM8 (C9X1J6) +-MLQKIR----KALFHPKKFFQDSQWFATPLFS------SFAPKSNLFIISTFAQLNQAH +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYI +QRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKP +TKFE----QR----FVGNNLHQKG-YFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGI +STSQSIAKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPK +EMENKNIMSLFLNM---VTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLL +SPTTQCLSIGQIVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSF--- +KTEETLEMLLKSAEYAYKNKNFYQAIFYWQLASNNDLSVL----GYKSLWHYNALNKVKQ +NYKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>C1HI22_9ESCH (C1HI22) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKAE +SFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVIWF +YNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPVVNI +NFYS-------E---IINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGA-PSV +KSSTRIDNVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPK +EPKKNINA---IQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLV +SKRCQSYSIAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDIT---SPSLHDK +------RIFLGE------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q51281_NEIME (Q51281) +-MLKKIK----KALFQPKKFFQDSMWLTTSPFY------LTPPRNNLFVISNLGQLNQVQ +SLIKIQKLTNNLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYI +YRSYKKILNIIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHP +TKLE----RY----LIGNNLNIKG-YIDHFDILHVPFPEYAKKIFNAKKYNRFFAHAGGI +SINNNIANLQKKYQISKNDYIFVSQRYPISDDLYYKSIVEILNSISLQIKGKIFIKLHPK +EMGNNYVMSLFLNM---VEINPRLVVINEPPFLIEPLIYLTNPKGIIGLASSSLIYTPLL +SPSTQCLSIGELIINLIQKYSMVENTEMIQEHLEIIKKFNFINILNDLNGVISNPLF--- +KTEETFETLLKSAEFAYKSKNYFQAIFYWQLASKNNITLL----GHKALWYYNALYNVKQ +IYKMEYSDIFYIDNISVDFHSKDKLTWEKIKHYYYSADNRIGRDR--------------- +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +>Q6VNM8_NEIME (Q6VNM8) +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +-YKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ------------------ +------------------------------------------------------------ +------------------------------------------------------------ +------------------------------------------------------------ +---------------------------------------- +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clustalomega/test-data/clustalo_unaligned_all.fasta Tue Jun 07 16:13:02 2011 -0400 @@ -0,0 +1,169 @@ +>Q1R749_ECOUT (Q1R749) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKA +ESFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVI +WFYNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPV +VNINFYSEIINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAPSVKSSTRID +NVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPKEPKKNI +NAIQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLVSKRCQSYS +IAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITSPSLHDKRIFLGE +>B1LEB7_ECOSM (B1LEB7) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKTEKLLSPLKIKNKNIFIVVHLGQLKKA +ELFIQKFSKRSNFLIVLATKKNTEMPRLVLEQMNKKLFSSYKLLFIPTEPNTFSLKKVI +WFYNVYKYIVLNSKAKDAYFMSYAQHYAIFIWLFKKNNIRCSLIEEGTATYKTEKKNTL +VNINFYSWIINSIILFHYPDLKFENVYGTFPNLLKEKFDAKKFFEFKTIPLVKSSTRMD +NLIHKYRITRDDIIYVSQRYWIDNELYAHSLISTLMRIDKSDNARVFIKPHPKETKKHI +NAIQGAINKAKRRDIIIIVEKDFLIESIIKKCKIKHLIGLTSSSLVYASLVYKECKTYS +IAPIIIKLCNNEKSQKGTNTLRLHFDILKNFDNVKILSDDISSPSLHDKRIFLGE +>Q7WRI1_NEIME (Q7WRI1) +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLY +IQRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTY +KPTKFEQRFVGNNLHQKGYFDKFDILHVAFPEYAKKNFNANEYHRFFAHSGGISTSQSI +AKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENK +NIMSLFLNMVTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCL +SIGQIV +>Q7WRI0_NEIME (Q7WRI0) +SLTKMQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLY +IQRGYKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTY +KPTKFEQRFVGNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSI +AKIQDKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENK +NIMSLFLNMVTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCL +SIGQIV +>Q6VNL6_NEIME (Q6VNL6) +MLKKIKKALFQPKKFFQDSM +>A9LZW7_NEIM0 (A9LZW7) +MQKLKNNLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYIQRG +YKKLLKTIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKPTK +FEQRFVGNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKIQ +DKYRISQNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMS +LFLNMVTINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQ +IVIDSIHHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSFKTEETLEMLLKSA +EYAYKNKNFYQAIFYWQLASNNDLSVLGYKSLWYYNALNKVKQNYKMKYLEINYIERIS +LYFNDKDKMIWQNIKNDFFKYSLCNQ +>O06435_NEIME (O06435) +MLQKIRKALFHPKKFFQDSQWFATPLFSSFAPKSNLFIISTFAQLNQAHSLTKMQKLKN +NLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYIQRGYKKLLK +TIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKPTKFEQRFV +GNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKIQDKYRIS +QNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMSLFLNMV +TINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQIVIDSI +HHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSFKTEETLEMLLKSAEYAYKN +KNFYQAIFYWQLASNNDLSVLGYKSLWYYNALNKVKQNYKMKYLEINYIERISLYFNDK +DKMIWQNIKNDFFKYSLCNQ +>A1AFL1_ECOK1 (A1AFL1) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKA +ESFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVI +WFYNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPV +VNINFYSEIINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAPSVKSSTRID +NVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPKEPKKNI +NAIQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLVSKRCQSYS +IAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITSPSLHDKRIFLGE +>Q6VNR6_NEIME (Q6VNR6) +MLQKIRKALFHPKKFFQDSQWFATPLFSSFAPKSNLFIISTFAQLNQAHSLTKM +>Q8VRL9_NEIME (Q8VRL9) +MLQKIRKALFHPKKFFQDSQWFATPLFSSFAPKSNLFIISTFAQLNQAHSLTKMQKLKN +NLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYIQRGYKKLLK +TIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKPTKFEQRFV +GNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKIQDKYRIS +QNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMSLFLNMV +TINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQIVIDSI +HHTAQQENAALIEEHLEIVKQFDFIKILSSIEDGIDTNSFKTEETLEMLLKSAEYAYKN +KNFYQAIFYWQLASNNDLSVLGYKSLWYYNALNKVKQNYKMKYLEINYIERISLYFNDK +DKMIWQNIKNDFFKYSLYNQ +>Q47404_ECOLX (Q47404) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIVAHLGQLKKA +ELFIQKFSRRSNFLIVLATKKNTEMPRLILEQMNKKLFSSYKLLFIPTEPNTFSLKKVI +WFYNVYKYIVLNSKAKDAYFMSYAQHYAIFIWLFKKNNIRCSLIEEGTGTYKTEKKKPL +VNINFYSWIINSIILFHYPDLKFENVYGTFPNLLKEKFDAKKIFEFKTIPLVKSSTRMD +NLIHKYRITRDDIIYVSQRYWIDNELYAHLLISTLMRIDKSDNARVFIKPHPKETKKYI +NAIQGAINKAKRRDIIIIVEKDFLIESIIKKCKIKHLIGLASSSLVYAPLVYKECKTYS +IAPIIIKLCNNEKSQKGINTLRLHFDILKNFDNVKILSDDITSPSLHDKRIFLGE +>Q83TU5_NEIME (Q83TU5) +MLKKIKKALFQPKKFFQDSMWLTTSPFYLTPPRNNLFVISNLGQLNQVQSLIKIQKLTN +NLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYIYRSYKKILN +IIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHPTKLERYLI +GNNLNIKGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAHAGGISINNNIANLQKKYQIS +KNDYIFVSQRYPISDDLYYKSIVEILNSISLQIKGKIFIKLHPKEMGNNYVMSLFLNMV +EINPRLVVINEPPFLIEPLIYLTNPKGIIGLASSSLIYTPLLSPSTQCLSIGELIINLI +QKYSMVENTEMIQEHLEIIKKFNFINILNDLNGVISNPLFKTEETFETLLKSAEFAYKS +KNYFQAIFYWQLASKNNITLLGHKALWYYNALYNVKQIYKMEYSDIFYIDNISV +>B7NIU6_ECO7I (B7NIU6) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKA +ESFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVI +WFYNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPV +VNINFYSEIINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAPSVKSSTRID +NVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPKEPKKNI +NAIQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLVSKRCQSYS +IAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITSPSLHDKRIFLGE +>Q57269_ECOLX (Q57269) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKA +ESFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVI +WFYNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPV +VNINFYSEIINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAPSVKSSTRID +NVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPKEPKKNI +NAIQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLVSKRCQSYS +IAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITSPSLHDKRIFLGE +>A1KR99_NEIMF (A1KR99) +MLQKIRKALFHPKKFFQDSQWFATPLFSSFAPKSNLFIISTFAQLNQAHSLTKMQKLKN +NLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYIQRGYKKLLK +TIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKPTKFEQRFV +GNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKIQDKYRIS +QNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMSLFLNMV +TINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQIVIDSI +HHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSFKTEETLEMLLKSAEYAYKN +KNFYQAIFYWQLASNNDLSVLGYKSLWYYNALNKVKQNYKMKYLEINYIERISLYFNDK +DKMIWQNIKNDFFKYSLCNQ +>Q6VNM1_NEIME (Q6VNM1) +YKMKYLEINYIERISLYFNDKDKMIWQDIKNDFFKYSLCNQ +>Q79AE7_NEIMB (Q79AE7) +MLKKIKKALFQPKKFFQDSMWLTTSPFYLTPPRNNLFVISNLGQLNQVQSLIKIQKLTN +NLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYIYRSYKKILN +IIQPAHLYMLSFTGHYSYLISIAK +>Q4W584_NEIMB (Q4W584) +MLKKIKKALFQPKKFFQDSMWLTTSPFYLTPPRNNLFVISNLGQLNQVQSLIKIQKLTN +NLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYIYRSYKKILN +IIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHPTKLERYLI +GNNLNIKGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAWRKGDVLQGD +>C5ZW53_9HELI (C5ZW53) +MLEVARKKLSGLMQDIKEYFVSSEYEMMFYKKELNQCNNVFYISNLGQLKQVETLIEFE +ELSNNCLVIGYTRANLEMPDFILDKADKRKFQNIILVELVVSVNYLKPGRIKQICRIYK +KLSQNIETKELYLLSVEGHYGIFAHYMKQKGVLINLLEEGTATYKFELKNGKIHVNAPA +VRMGRYTEIFCTLSGIKNMLLVGEFNKIYAAFPEKLRGIFKANEIILFFAHINIKPSAN +LVEIIEKYKITGDDIIFVSQRFDIDLNIFIEKILDILEAYVVAYRQRVFVKHHPKESEK +QISLFRSKIIARGFSQNIISVSDKAFLVENILDIVETKILVGLTSTSLIYAQKLNKDIV +VHSVVPWFLKKVFFLEKQKKQMLSSHFNELQKTFDGFKIIEDAGAIVAGDICSDTPKNS +DATALIDKANQGFVEKKILQAIFYYKQSESKDIFLRMPHILYNMLYCWDALENDFQKYR +IIIKYLQLDVVLEKKEEEFVFAKLMQFVDMCLREGKFEKFEKIEQLALAKQEKFLYFDV +GVIRLKKMLYLERWDDVLRAFEDLRESSKKRYFIVFEIVRSFIREENMEFEEELKEIDD +RVVGESLKLLYLYSCKKYSDIYDYIVEIKDANPYLYQQYHNKIIIQKKYSTLIESFNVD +NILEYMINNEKKQFFAEVSDVLSKYNVEYRIGDIIEALNGDQIKLKTQDMEDLICALKG +FEGLAEFCKREDDMGLICRILTFEFAGNLLENERS +>C9X1J6_NEIM8 (C9X1J6) +MLQKIRKALFHPKKFFQDSQWFATPLFSSFAPKSNLFIISTFAQLNQAHSLTKMQKLKN +NLLVILYTTQNMKMPKLIQKSVDKELFSVTYMFELPRKPGIVSPKKFLYIQRGYKKLLK +TIQPAHLYVMSFAGHYSSLLSLAKKMNITTHLVEEGTATYAPLLESFTYKPTKFEQRFV +GNNLHQKGYFDKFDILHVAFPEYAKKIFNANEYHRFFAHSGGISTSQSIAKIQDKYRIS +QNDYIFVSQRYPVSDEVYYKTIVETLNQMSLRIEGKIFIKLHPKEMENKNIMSLFLNMV +TINPRLVVINEPPFLIDPLIYLTTPKGIIGLTSTSIVYTPLLSPTTQCLSIGQIVIDSI +HHTAQQENTALIEEHLEIVKQFDFIKILSSIEDGIDTNSFKTEETLEMLLKSAEYAYKN +KNFYQAIFYWQLASNNDLSVLGYKSLWHYNALNKVKQNYKMKYLEINYIERISLYFNDK +DKMIWQNIKNDFFKYSLCNQ +>C1HI22_9ESCH (C1HI22) +MIFDASLKKLRKLFVNPIGFFRDSWFFNSKNKAEELLSPLKIKSKNIFIISNLGQLKKA +ESFVQKFSKRSNYLIVLATEKNTEMPKIIVEQINNKLFSSYKVLFIPTFPNVFSLKKVI +WFYNVYNYLVLNSKAKDAYFMSYAQHYAIFVYLFKKNNIRCSLIEEGTGTYKTEKENPV +VNINFYSEIINSIILFHYPDLKFENVYGTYPILLKKKFNAQKFVEFKGAPSVKSSTRID +NVIHKYSITRDDIIYANQKYLIEHTLFADSLISILLRIDKPDNARIFIKPHPKEPKKNI +NAIQKAIKKAKCRDIILITEPDFLIEPVIKKAKIKHLIGLTSSSLVYAPLVSKRCQSYS +IAPLMIKLCDNDKSQKGINTLRLHFDILKNFDNVKILSDDITSPSLHDKRIFLGE +>Q51281_NEIME (Q51281) +MLKKIKKALFQPKKFFQDSMWLTTSPFYLTPPRNNLFVISNLGQLNQVQSLIKIQKLTN +NLLVILYTSKNLKMPKLVHQSANKNLFESIYLFELPRSPNNITPKKLLYIYRSYKKILN +IIQPAHLYMLSFTGHYSYLISIAKKKNITTHLIDEGTGTYAPLLESFSYHPTKLERYLI +GNNLNIKGYIDHFDILHVPFPEYAKKIFNAKKYNRFFAHAGGISINNNIANLQKKYQIS +KNDYIFVSQRYPISDDLYYKSIVEILNSISLQIKGKIFIKLHPKEMGNNYVMSLFLNMV +EINPRLVVINEPPFLIEPLIYLTNPKGIIGLASSSLIYTPLLSPSTQCLSIGELIINLI +QKYSMVENTEMIQEHLEIIKKFNFINILNDLNGVISNPLFKTEETFETLLKSAEFAYKS +KNYFQAIFYWQLASKNNITLLGHKALWYYNALYNVKQIYKMEYSDIFYIDNISVDFHSK +DKLTWEKIKHYYYSADNRIGRDR +>Q6VNM8_NEIME (Q6VNM8) +YKMKYLEINYIERISLYFNDKDKMIWQNIKNDFFKYSLCNQ